Php Oracle函数更新表,如果记录为空,则插入
我是新来的,我是学习甲骨文的新手。 我正在尝试使用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)
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>