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

0

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

  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;

Так что я пытаюсь сделать, это основано на трех переменных HEAD_MARK, PROJECT_NAME и COLI_NUM. Когда пользователь отправляет форму, тогда передаются 4 значения и выполняют обработку на сервере. Если эти 3 (HEAD_MARK, PROJECT_NAME, COLI_NUM) присутствуют в базе данных, тогда вставьте в базу данных с помощью ONSITE_UPD_QTY. А если присутствует, то обновите только ONSITE_UPD_QTY.

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

Теги:
procedure

1 ответ

2
Лучший ответ
  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>
  • 0
    спасибо за ваш ответ, но если я хочу поместить это в функцию или процедуру, какую мне выбрать? функция или процедура?
  • 0
    в идеале вы не должны делать DML внутри функции. Вы можете сделать это в процедуре. Используйте параметры IN в USING CLAUSE as (select param_list from DUAL)
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню