Функция Oracle для обновления таблицы, если запись нулевая, тогда INSERT

Я новичок здесь, и я новичок в изучении оракула.
Я пытаюсь сделать функцию оракула для выполнения задачи на столе. Итак, что я пытаюсь достичь, когда пользователь предоставляет значения, он должен проверить в таблице,

  1. если запись существует на основе одного значения, обновите остальные столбцы
  2. если запись не существует, вставьте строку на основе предоставленных значений.

У меня есть этот стол

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 и вызвать эту процедуру, когда пользователь отправит форму. пожалуйста, помогите мне

0

Решение

  1. если запись существует на основе одного значения, обновите остальные столбцы
  2. если запись не существует, вставьте строку на основе предоставленных значений.

Все, что тебе нужно 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, который я буду использовать для вставки в emp использование таблицы MERGE.

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>
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]