2013-05-03 4 views
1

ид нравится называть эту функцию:Вызов функции в перед тем удалить триггер

CREATE OR REPLACE PACKAGE orders_salary_manage2 AS 
    FUNCTION total_calc(p_order in NUMBER) 
    RETURN NUMBER; 
END; 

CREATE OR REPLACE PACKAGE BODY orders_salary_manage2 AS 
    tot_orders NUMBER; 

FUNCTION total_calc(p_order in NUMBER) 
RETURN NUMBER 
IS 
    c_price product.unit_price%type; 
    c_prod_desc product.product_desc%type; 
    v_total_cost NUMBER := 0; 
    CURSOR c1 IS 
     SELECT product_desc, unit_price 
     FROM product 
     WHERE product_id IN (SELECT fk2_product_id 
          FROM order_line 
          WHERE fk1_order_id = p_order); 
BEGIN 
    OPEN c1; 
    LOOP 
     FETCH c1 into c_prod_desc, c_price; 
     v_total_cost := v_total_cost + c_price; 
     EXIT WHEN c1%notfound; 
    END LOOP; 
    CLOSE c1; 
    return v_total_cost; 
END; 

от этого триггера:

CREATE OR REPLACE TRIGGER trg_order_total 
BEFORE DELETE ON placed_order 
FOR EACH ROW 
DECLARE 
v_old_order NUMBER := :old.order_id; 
BEGIN 
total_calc(v_old_order); 
END; 

, но я постоянно получаю эту ошибку, обратите внимание, что номер не ошибка просто это:

Ошибка в строке 4: PL/SQL: Заявление игнорировали

  1. ПЕРЕД УДАЛИТЬ ПО placed_order
  2. ДЛЯ КАЖДОЙ ROW
  3. DECLARE
  4. v_old_order НОМЕР: =: old.order_id;
  5. НАЧАТЬ

им новых для PL/SQL и просто не уверен, что является причиной проблемы. Когда пользователь удаляет заказ из таблицы заказов, триггер должен вызывать функцию для добавления всех продуктов в заказе.

Спасибо

+0

Спусковой код, который вы показали не вызывает 'add_order_func' функцию на всех. Вы имеете в виду, что вы получаете эту ошибку из текущего кода запуска, как показано, или вы получаете эту ошибку при попытке изменить ее для вызова функции? Если первое, то, возможно, проблема связана с процедурой 'total_calc', которую вы вызываете. Если последний, тогда покажите код запуска, который на самом деле пытается вызвать функцию. –

+0

Привет и спасибо за ваш ответ, извините, я показал неправильную функцию, я работал часами, а мои мозги отключились. Я в основном пытаюсь выполнить функцию, когда происходит удаление, и параметр, переданный функции, должен быть порядковым_идом (PK) строки – user2241161

+0

, мы пропускаем фактическое описание ошибки (ORA-XXXXX: bla bla bla ..) – Sebas

ответ

1

(принимая во внимание ваш пакет скомпилирован без ошибок) потребительных

ret_val:= orders_salary_manage2.total_calc(v_old_order); 

ret_val должен стать NUMBER с функцией пакета total_calc возвращающего NUMBER. Функция ДОЛЖНА всегда возвращать свою outcoume переменной (например, ret_val) в зависимости от типа возвращаемого значения, который должен быть объявлен тип данных переменной.

Синтаксис для вызова процедур и функций Pacakaged является -

<RETURN_VARIABLE> := PACKAGE_NAME.<FUNCTION_NAME>(); 
PACKAGE_NAME.<PROCEDURE_NAME>(); --Since Procedure never returns 

Также обратите внимание, что если ваш пакет в другой схеме и не имеет PUBLIC SYNONYM тогда вам придется предварить имя схемы, как <SCHEMA>.PACKAGE_NAME.<FUNCTION_NAME>() (с учетом вызывающая схема имеет разрешения на выполнение в пакете).

Так,

CREATE OR REPLACE TRIGGER trg_order_total 
BEFORE DELETE ON placed_order 
FOR EACH ROW 
DECLARE 
    v_old_order NUMBER := :old.order_id; 
    v_ret_val NUMBER := 0; 
BEGIN 
    v_ret_val := orders_salary_manage2.total_calc(v_old_order); 
    --...Do stuff with v_ret_val 
END; 
+0

Привет annjawn мне удалось понять это прошлой ночью, и пришел с этим: CREATE OR REPLACE TRIGGER trg_order_total ПЕРЕД УДАЛИТЬ пО placed_order дЛЯ КАЖДОЙ СТРОКЕ DECLARE v_old_order NUMBER: =: старый.номер заказа; v_total NUMBER; BEGIN v_total: = total_calc (v_old_order); УДАЛИТЬ ИЗ order_line WHERE fk1_order_id = v_old_order; dbms_output.put_line (v_total); END; Спасибо за ваш ответ, хотя! Ваше право мне нужно было сохранить результат func в переменной! – user2241161

Смежные вопросы