Oracle Function更新一条table,如果记录为null则INSERT

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

我是新来的,是学习oracle的新手。 我正在尝试创建一个 oracle 函数来在 table 上执行任务。所以,我想要实现的是,当用户提供值时,它必须检查 table、

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

我有这个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,
)

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

您只需要 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一个完整的测试用例

假设我有一个没有行的 table emp1。我创建了一个将 ename 作为输入的过程,我将使用 MERGE.

将其插入 emp table
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>