Oracle Function更新一条table,如果记录为null则INSERT
Oracle Function to update a table, if the record is null then INSERT
我是新来的,是学习oracle的新手。
我正在尝试创建一个 oracle 函数来在 table 上执行任务。所以,我想要实现的是,当用户提供值时,它必须检查 table、
- 如果记录基于一个值存在,则更新其余列
- 如果记录不存在,则根据提供的值插入一行。
我有这个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 中使用它并在用户提交表单时调用此过程。请帮助我
- if the record exists based on one value then update the rest of the columns
- 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>
我是新来的,是学习oracle的新手。 我正在尝试创建一个 oracle 函数来在 table 上执行任务。所以,我想要实现的是,当用户提供值时,它必须检查 table、
- 如果记录基于一个值存在,则更新其余列
- 如果记录不存在,则根据提供的值插入一行。
我有这个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 中使用它并在用户提交表单时调用此过程。请帮助我
- if the record exists based on one value then update the rest of the columns
- 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>