PL/SQL在通过触发器-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

我在更新后触发器中调用oracle中的函数。函数返回的值等同于执行选择和插入操作

问题是,当我在触发器中调用此函数时,它将被终止,即它没有执行相应的插入操作。但是,当我自己执行它时,该函数运行良好。此外,如果触发器是通过删除函数返回的条件来运行的,那么它将按预期执行

功能:

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
,以便查看正在使用哪些值。是否收到任何错误消息?我想如果你告诉了我们,你会告诉我们的,但这是值得问的。