Php Oracle函数更新表,如果记录为空,则插入

Php Oracle函数更新表,如果记录为空,则插入,php,oracle,procedure,Php,Oracle,Procedure,我是新来的,我是学习甲骨文的新手。 我正在尝试使用oracle函数在表上执行任务。所以,我试图实现的是,当用户提供值时,它必须在表中进行检查 如果记录基于一个值存在,则更新其余列 如果记录不存在,则根据提供的值插入一行。 我有这张桌子 CREATE TABLE WELTESADMIN.MST_ERC_UPD ( PROJECT_NAME VARCHAR2(25 CHAR) NOT NULL, HEAD_MARK VARCHAR2(25 CHAR)

我是新来的,我是学习甲骨文的新手。 我正在尝试使用oracle函数在表上执行任务。所以,我试图实现的是,当用户提供值时,它必须在表中进行检查

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

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个值并在服务器中进行处理。如果数据库中存在三个头部标记、项目名称、大肠杆菌编号,则将其与现场UPD数量一起插入数据库。如果存在,则仅更新现场的UPD数量

我只是在学习,我不能让这个过程在SQL Developer中工作。我计划在PHP中使用它,并在用户提交表单时调用此过程。请帮帮我

如果记录基于一个值存在,则更新其余列 如果记录不存在,则根据提供的值插入一行。 您只需要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作为输入的过程,我将使用MERGE将其插入emp表

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

SQL> SELECT ename FROM emp1;

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

SQL>

谢谢你的回答,但是如果我想把它放在函数或过程中,我应该选择哪一个?函数还是过程?理想情况下,您不应该在函数内部执行DML。你可以按程序来做。使用USING子句中的IN参数作为从DUALlalit中选择参数列表。。。您的sql查询假设它有两个使用表b的表。但我只使用变量来更新或插入。我只有一个表MST_ERC_updt,这就是为什么我在USING子句中说,您需要编写一个SQL来从dual中选择参数,而不是table。看到这一点,如果我们使用selecttheparameters from dual,我们是否需要像HM1一样提供列名或直接变量;从双B中选择B.HM1?我在这里有点迷路了
SQL> SELECT ename FROM emp1;

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

SQL>