Oracle Pl / SQL: триггер после вставки в Table1 вызывает функцию для Table2? - PullRequest
0 голосов
/ 23 ноября 2011

Я довольно новичок в Oracle PL / SQL, поэтому я не уверен, возможно ли сделать что-то вроде этого:

Две таблицы - T1 и T2 - T1.id - внешний ключ, ссылающийся на T2.id, каждая таблица имеет последовательность; Я написал функцию, которая при вызове позволяет пользователю вставлять новые строки в T1 - будет называть ее func1, то же самое для T2 - func2; Также есть функция, которая возвращает нам последнюю вставленную последовательность в таблице - getLastSeq (table);

Итак, теперь я пытаюсь создать триггер после вставки на вызовы T2 func1, позволяющий пользователю записать входную информацию.

CREATE OR REPLACE TRIGGER trig1
AFTER INSERT ON T2
DECLARE
-----?----
BEGIN
----?----
dbms_output.put_line(func1(:col1, :col2));
----?----?
END;

Но все мои возможные попытки сделать это умирают с ошибками: col1 не является плохим bind var.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Я не совсем уверен, что понимаю, что вы пытаетесь выполнить.

  1. Если вы создаете блок PL / SQL, который вставляет строку, это действительно должна быть процедура, а не функция.Функция должна выполнять вычисления и возвращать результат.Процедура должна делать DML.
  2. Я не уверен, что вы подразумеваете под "разрешением пользователю записывать вводимые данные".В PL / SQL нет средств, чтобы запрашивать ввод у пользователя - он может принимать только входные параметры.
  3. Я не уверен, что понимаю, как логически может быть вставка в родительскую таблицу (T2)вставьте строку в дочернюю таблицу (T1).Это подразумевает, что T1 на самом деле не является дочерней таблицей, что подразумевает, что у вас есть какая-то проблема с моделью данных.

Если ваша цель - передать недавно вставленные COL1 и COL2 таблиц из строки, которая была только что вставлена ​​в T2 для процедуры PROC1, я предполагаю, что вам нужно что-то вроде

CREATE OR REPLACE TRIGGER trig_t2
  AFTER INSERT ON t2
  FOR EACH ROW
BEGIN
  proc1( :new.col1, :new.col2 );
END;

Звучит, как будто вы не хотите использоватьтриггер на всех.Если вы хотите создать заказ, у вас обычно есть процедура, которая выполняет несколько операторов INSERT, а не пытается вставить в дочернюю таблицу триггер на родительском элементе.Например, что-то вроде этого будет гораздо понятнее и проще в обслуживании, чем решение на основе триггера.

CREATE OR REPLACE PROCEDURE create_order( p_order_description IN VARCHAR2 )
AS
BEGIN
  INSERT INTO order( order_id, description )
    VALUES( order_id_seq.nextval, p_order_description );

  INSERT INTO order_ship_status( order_ship_status_id, order_id, status )
    VALUES( order_ship_status_id.nextval, order_id_seq.currval, 'Not Shipped' );
END:
1 голос
/ 23 ноября 2011

У вас неверный синтаксис триггера.

Прочтите эту ссылку, которая поможет вам лучше понять триггеры Oracle и несколько хороших примеров, которым вы можете следовать.

http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...