Oracle Function to update a table, if the record is null then INSERT

牧云@^-^@ 提交于 2019-12-12 04:50:35

问题


I am new here and I am a newbie in learning oracle. I am trying to make an oracle function to perform a task on a table. So, what im trying to achieve is, when user supplied values, it has to check in the table,

  1. if the record exists based on one value then update the rest of the columns
  2. if the record is not exists then insert a row based on the supplied values.

I have this table

CREATE TABLE WELTESADMIN.MST_ERC_UPD
(
  PROJECT_NAME    VARCHAR2(25 CHAR)             NOT NULL,
  HEAD_MARK       VARCHAR2(25 CHAR)             NOT NULL,
  COLI_NUM        VARCHAR2(30 CHAR)             NOT NULL,
  ONSITE_UPD_QTY  NUMBER(38)                    NOT NULL,
)

and the SQL,

CREATE OR REPLACE PROCEDURE WELTESADMIN.SP_MST_ERC_UPD
(
    p_HEAD_MARK IN MST_ERC_UPD.HEAD_MARK%TYPE,
    p_PROJECT_NAME IN MST_ERC_UPD.PROJECT_NAME%TYPE,
    p_COLI_NUM IN MST_ERC_UPD.COLI_NUM%TYPE,
    p_ONSITE_UPD_QTY IN MST_ERC_UPD.ONSITE_UPD_QTY%TYPE
)
IS
BEGIN
IF (SELECT HEAD_MARK, PROJECT_NAME, COLI_NUM FROM MST_ERC_UPD) IS NULL
    THEN 
        INSERT INTO MST_ERC_UPD (HEAD_MARK, PROJECT_NAME, COLI_NUM)
    VALUES (p_HEAD_MARK, p_PROJECT_NAME,  p_COLI_NUM, p_ONSITE_UPD_QTY)
ELSE
UPDATE MST_ERC_UPD 
    SET 
        ONSITE_UPD_QTY = p_ONSITE_UPD_QTY
    WHERE
        HEAD_MARK = p_HEAD_MARK AND
        PROJECT_NAME = p_PROJECT_NAME AND
        COLI_NUM = p_COLI_NUM;
COMMIT;
END SP_MST_ERC_UPD;

So what im trying to do is based on 3 variables HEAD_MARK, PROJECT_NAME and COLI_NUM. When user submit a form then 4 values are passed and do the processing in the server. If those 3 (HEAD_MARK, PROJECT_NAME, COLI_NUM)are present in the database then insert into database with the ONSITE_UPD_QTY. And if present then update the ONSITE_UPD_QTY only.

I am just learning and i cant make this procedure work in SQL Developer. I am planning to use it in PHP and call this procedure when user submit the form. Please help me


回答1:


  1. if the record exists based on one value then update the rest of the columns
  2. if the record is not exists then insert a row based on the supplied values.

All you need is MERGE statement. Both your requirements could be done at one go.

The syntax is -

MERGE INTO table_a a
  USING table_b b
    ON (a.column= b.column)
  WHEN MATCHED THEN
    UPDATE SET a.column= b.column
  WHEN NOT MATCHED THEN
    INSERT (column1, column2)
    VALUES (b.val1, b.val2);

Update Example to show USING clause for procedure parameters

USING(
SELECT
p_HEAD_MARK hm, 
p_PROJECT_NAME pn, 
p_COLI_NUM cn, 
p_ONSITE_UPD_QTY ouq
FROM DUAL) s

Use these as s.hm, s.pn, s.cn, s.ouq

Update 2 A complete test case

Let's say I have a table emp1 with no rows. I create a procedure which takes ename as INPUT, which I will use to insert into emp table using MERGE.

SQL> SELECT * FROM emp1;

no rows selected

SQL>
SQL> CREATE OR REPLACE
  2  PROCEDURE p(
  3      p_ename IN VARCHAR2)
  4  AS
  5  BEGIN
  6    MERGE INTO emp1 e USING
  7    (SELECT p_ename AS ename FROM dual
  8    ) s ON(e.ename = s.ename)
  9  WHEN MATCHED THEN
 10    UPDATE SET e.empno = 100 WHEN NOT MATCHED THEN
 11    INSERT
 12      (ename
 13      ) VALUES
 14      (s.ename
 15      );
 16  END;
 17  /

Procedure created.

SQL>
SQL> sho err
No errors.
SQL>
SQL> BEGIN
  2    p('SCOTT');
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL>

Let's see if the value got inserted.

SQL> SELECT ename FROM emp1;

ENAME
----------
SCOTT

SQL>


来源:https://stackoverflow.com/questions/28104376/oracle-function-to-update-a-table-if-the-record-is-null-then-insert

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!