Oracle函数更新表,如果记录为null则为INSERT

时间:2015-01-23 06:43:00

标签: php oracle procedure

我是新来的,我是学习oracle的新手。 我正在尝试使用oracle函数在表上执行任务。因此,我想要实现的是,当用户提供的值时,它必须检查表,

  1. 如果记录基于一个值存在,则更新其余列
  2. 如果记录不存在,则根据提供的值插入一行。
  3. 我有这张桌子

    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,
    )
    

    和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;
    

    所以我想要做的是基于3个变量HEAD_MARK,PROJECT_NAME和COLI_NUM。当用户提交表单时,将传递4个值并在服务器中执行处理。如果数据库中存在3个(HEAD_MARK,PROJECT_NAME,COLI_NUM),则使用ONSITE_UPD_QTY插入数据库。如果存在,则仅更新ONSITE_UPD_QTY。

    我只是在学习,我不能让这个程序在SQL Developer中运行。我打算在PHP中使用它,并在用户提交表单时调用此过程。请帮帮我

1 个答案:

答案 0 :(得分:2)

  
      
  1. 如果记录基于一个值存在,则更新其余列
  2.   
  3. 如果记录不存在,则根据提供的值插入一行。
  4.   

您需要的只是 MERGE 声明。您的要求可以一次完成。

语法为 -

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);

更新示例以显示过程参数的USING子句

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

将这些用作s.hm, s.pn, s.cn, s.ouq

更新2 完整的测试用例

假设我有一个没有行的表emp1。我创建了一个以ename为INPUT的过程,我将使用 MERGE 将其插入到emp表中。

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>

让我们看看是否插入了值。

SQL> SELECT ename FROM emp1;

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

SQL>