PL/SQL在通过触发器-Oracle调用时无法获取函数的返回值
我在更新后触发器中调用oracle中的函数。函数返回的值等同于执行选择和插入操作 问题是,当我在触发器中调用此函数时,它将被终止,即它没有执行相应的插入操作。但是,当我自己执行它时,该函数运行良好。此外,如果触发器是通过删除函数返回的条件来运行的,那么它将按预期执行 功能:PL/SQL在通过触发器-Oracle调用时无法获取函数的返回值,oracle,plsql,triggers,oracle-sqldeveloper,Oracle,Plsql,Triggers,Oracle Sqldeveloper,我在更新后触发器中调用oracle中的函数。函数返回的值等同于执行选择和插入操作 问题是,当我在触发器中调用此函数时,它将被终止,即它没有执行相应的插入操作。但是,当我自己执行它时,该函数运行良好。此外,如果触发器是通过删除函数返回的条件来运行的,那么它将按预期执行 功能: CREATE OR REPLACE FUNCTION VERIFY_FINAL (case_id IN number) RETURN varchar2 IS is_marked_final v
CREATE OR REPLACE FUNCTION VERIFY_FINAL
(case_id IN number)
RETURN varchar2
IS
is_marked_final varchar2(4);
loop_count number(2);
cursor c1 is
SELECT sub_case_status from
cdm_master_sub_case
where master_id = (case_id);
BEGIN
is_marked_final := 'Y';
loop_count := 0;
FOR rec in c1
LOOP
IF (rec.sub_case_status = '1') THEN
is_marked_final := 'Y';
ELSIF (rec.sub_case_status = '2') THEN
is_marked_final := 'Y';
ELSE
loop_count := loop_count + 1;
END if;
END LOOP;
IF (loop_count > 0) THEN
is_marked_final := 'N';
END if;
RETURN is_marked_final;
END;
CREATE OR REPLACE TRIGGER CDM_MASTER_SUB_CASE_TRIGGER
AFTER UPDATE
on CDM_MASTER_SUB_CASE
FOR EACH ROW
DECLARE
check_var varchar2(4);
unique_id varchar2(100);
transaction_id number(10);
BEGIN
transaction_id := :new.MASTER_ID;
check_var := VERIFY_FINAL(transaction_id);
IF (check_var = 'Y') THEN
select UNIQUE_CUST_ID
INTO unique_id
from ASM355.cdm_matches
where MASTER_ID = :new.MASTER_ID
and rownum = 1;
INSERT INTO tracking_final_cases (MASTER_ID,unique_cust)
values (:new.master_id,unique_id);
END if;
END;
触发器:
CREATE OR REPLACE FUNCTION VERIFY_FINAL
(case_id IN number)
RETURN varchar2
IS
is_marked_final varchar2(4);
loop_count number(2);
cursor c1 is
SELECT sub_case_status from
cdm_master_sub_case
where master_id = (case_id);
BEGIN
is_marked_final := 'Y';
loop_count := 0;
FOR rec in c1
LOOP
IF (rec.sub_case_status = '1') THEN
is_marked_final := 'Y';
ELSIF (rec.sub_case_status = '2') THEN
is_marked_final := 'Y';
ELSE
loop_count := loop_count + 1;
END if;
END LOOP;
IF (loop_count > 0) THEN
is_marked_final := 'N';
END if;
RETURN is_marked_final;
END;
CREATE OR REPLACE TRIGGER CDM_MASTER_SUB_CASE_TRIGGER
AFTER UPDATE
on CDM_MASTER_SUB_CASE
FOR EACH ROW
DECLARE
check_var varchar2(4);
unique_id varchar2(100);
transaction_id number(10);
BEGIN
transaction_id := :new.MASTER_ID;
check_var := VERIFY_FINAL(transaction_id);
IF (check_var = 'Y') THEN
select UNIQUE_CUST_ID
INTO unique_id
from ASM355.cdm_matches
where MASTER_ID = :new.MASTER_ID
and rownum = 1;
INSERT INTO tracking_final_cases (MASTER_ID,unique_cust)
values (:new.master_id,unique_id);
END if;
END;
如果有人能给我指出正确的方向,我将不胜感激。我不知道您的表数据,但您的函数可以返回'N',这样它就不符合您的触发条件(检查变量='Y') 如果您这样运行命令:
update CDM_MASTER_SUB_CASE
set sub_case_status = 3;
你可能会遇到你的问题 1。)正如tmrozek指出的,返回“N”不会进行相关的插入。我可能会建议用另一个来表示,如果这确实表明了正在发生的事情
2.)我还要指出,如果您的SELECT INTO没有找到相应的值,则会导致问题。您可能想做一些事情来确保这个触发器是故障安全的,或者您是否考虑过如果出现这种情况,您希望代码做什么?(出错?插入一个空的唯一\u id?)
3.)如果您正在查看不同会话的结果,请记住,插入的跟踪案例在您在调用触发器的会话中提交更改之前将不可见。感谢大家花了这么多时间,问题解决了。我在函数体中的select语句上查询创建了相应触发器的表 似乎
VERIFY\u FINAL
返回的内容不是Y
。由于我们没有你的数据,很难猜测发生了什么。我建议您调试代码-触发器和函数。如果其他方法都不起作用,请输入dbms\u输出。通过代码调用put\u line
,以便查看正在使用哪些值。是否收到任何错误消息?我想如果你告诉了我们,你会告诉我们的,但这是值得问的。