Oracle 发现异常NO_DATA_未设置变量值,DBMS_out.PUT_行未按应有方式显示

Oracle 发现异常NO_DATA_未设置变量值,DBMS_out.PUT_行未按应有方式显示,oracle,plsql,Oracle,Plsql,在我试图执行的一个简单过程中,我有这种奇怪的行为。该过程只检查某个记录是否存在于表中,如果该记录存在,则运行一个过程,如果不存在,则运行另一个过程。程序如下: PROCEDURE p_checksomething (i_var1 VARCHAR2, i_var2 VARCHAR2, i_var3 VARCHAR2, i_va

在我试图执行的一个简单过程中,我有这种奇怪的行为。该过程只检查某个记录是否存在于表中,如果该记录存在,则运行一个过程,如果不存在,则运行另一个过程。程序如下:

PROCEDURE p_checksomething (i_var1 VARCHAR2, 
                            i_var2 VARCHAR2, 
                            i_var3 VARCHAR2, 
                            i_var4 VARCHAR2, 
                            i_var5 VARCHAR2, 
                            i_var6 VARCHAR2, 
                            i_var7 VARCHAR2, 
                            i_var8 VARCHAR2 
                ) 
IS 

v_var1 VARCHAR2(100); 
v_var2 VARCHAR2(100);  
v_var3 VARCHAR2(100);  
v_var4 VARCHAR2(100);  
v_var5 VARCHAR2(100); 
v_flag NUMBER := 0; 

BEGIN 

  dbms_output.put_line('Flag value1: '||v_flag); 


  SELECT a.col1, a.col2, a.col3, a.col4, a.col5 
  INTO v_var1, v_var2, v_var3, v_var4, v_var5  
  FROM table1 a 
  WHERE a.col1 = 'i_var1' 
  AND a.col2 = 'i_var2' 
  AND a.col3 = 'i_var3' 
  AND a.col4 = 'i_var4' 
  AND a.col5 = 'i_var5'; 

  dbms_output.put_line('Flag value2: '||v_flag); 

  EXCEPTION 
  WHEN NO_DATA_FOUND THEN 
   v_flag := 1; 
  WHEN OTHERS THEN RAISE; 

  dbms_output.put_line('Flag value3: '||v_flag); 

IF v_flag = 1 THEN              /*INSERT INTO RU_INFO_T*/ 

 dbms_output.put_line('Flag value4: '||v_flag); 

package1.p_proc010(i_var1,i_var2,i_var3,i_var4,i_var5,i_var6,i_var7,i_var8); 

ELSE    IF v_flag = 0 THEN          /*UPDATE INTO RU_INFO_T*/ 

 dbms_output.put_line('Flag value5: '||v_flag); 
package1.p_proc100(i_var1,i_var2,i_var3,i_var4,i_var5,i_var6,i_var7,i_var8); 
END IF; 

END IF; 
dbms_output.put_line('Flag value6: '||v_insflag); 
END;
虽然它正在正确编译,但当我运行它时,其他两个过程没有运行,在控制台上我只能看到

标志值1:0


其他dbms_output.put_line命令发生了什么,以及在找不到数据的情况下变量为什么不改变,这些都是令我垂死挣扎的问题。如果有人能想一想,给我一些想法,告诉我应该怎么做才能按我的意愿更改此标志值,那就太棒了。

您应该尝试添加begin-end块以处理异常。 您只有一个异常处理程序,它是过程的处理程序。 当捕捉到异常时,是的,初始化v_标志:=1,然后退出过程

PROCEDURE p_checksomething (i_var1 VARCHAR2, 
                            i_var2 VARCHAR2, 
                            i_var3 VARCHAR2, 
                            i_var4 VARCHAR2, 
                            i_var5 VARCHAR2, 
                            i_var6 VARCHAR2, 
                            i_var7 VARCHAR2, 
                            i_var8 VARCHAR2 
                ) 
IS 

v_var1 VARCHAR2(100); 
v_var2 VARCHAR2(100);  
v_var3 VARCHAR2(100);  
v_var4 VARCHAR2(100);  
v_var5 VARCHAR2(100); 
v_flag NUMBER := 0; 

BEGIN 

  dbms_output.put_line('Flag value1: '||v_flag); 

BEGIN   ---------------     new line  
  SELECT a.col1, a.col2, a.col3, a.col4, a.col5 
  INTO v_var1, v_var2, v_var3, v_var4, v_var5  
  FROM table1 a 
  WHERE a.col1 = 'i_var1' 
  AND a.col2 = 'i_var2' 
  AND a.col3 = 'i_var3' 
  AND a.col4 = 'i_var4' 
  AND a.col5 = 'i_var5'; 

  dbms_output.put_line('Flag value2: '||v_flag); 

  EXCEPTION 
  WHEN NO_DATA_FOUND THEN 
   v_flag := 1; 
  WHEN OTHERS THEN RAISE; 
END;---------------           new line 

  dbms_output.put_line('Flag value3: '||v_flag); 

IF v_flag = 1 THEN              /*INSERT INTO RU_INFO_T*/ 

 dbms_output.put_line('Flag value4: '||v_flag); 

package1.p_proc010(i_var1,i_var2,i_var3,i_var4,i_var5,i_var6,i_var7,i_var8); 

ELSE    IF v_flag = 0 THEN          /*UPDATE INTO RU_INFO_T*/ 

 dbms_output.put_line('Flag value5: '||v_flag); 
package1.p_proc100(i_var1,i_var2,i_var3,i_var4,i_var5,i_var6,i_var7,i_var8); 
END IF; 

END IF; 
dbms_output.put_line('Flag value6: '||v_insflag); 
END;

您应该尝试添加开始-结束块以处理异常。 您只有一个异常处理程序,它是过程的处理程序。 当捕捉到异常时,是的,初始化v_标志:=1,然后退出过程

PROCEDURE p_checksomething (i_var1 VARCHAR2, 
                            i_var2 VARCHAR2, 
                            i_var3 VARCHAR2, 
                            i_var4 VARCHAR2, 
                            i_var5 VARCHAR2, 
                            i_var6 VARCHAR2, 
                            i_var7 VARCHAR2, 
                            i_var8 VARCHAR2 
                ) 
IS 

v_var1 VARCHAR2(100); 
v_var2 VARCHAR2(100);  
v_var3 VARCHAR2(100);  
v_var4 VARCHAR2(100);  
v_var5 VARCHAR2(100); 
v_flag NUMBER := 0; 

BEGIN 

  dbms_output.put_line('Flag value1: '||v_flag); 

BEGIN   ---------------     new line  
  SELECT a.col1, a.col2, a.col3, a.col4, a.col5 
  INTO v_var1, v_var2, v_var3, v_var4, v_var5  
  FROM table1 a 
  WHERE a.col1 = 'i_var1' 
  AND a.col2 = 'i_var2' 
  AND a.col3 = 'i_var3' 
  AND a.col4 = 'i_var4' 
  AND a.col5 = 'i_var5'; 

  dbms_output.put_line('Flag value2: '||v_flag); 

  EXCEPTION 
  WHEN NO_DATA_FOUND THEN 
   v_flag := 1; 
  WHEN OTHERS THEN RAISE; 
END;---------------           new line 

  dbms_output.put_line('Flag value3: '||v_flag); 

IF v_flag = 1 THEN              /*INSERT INTO RU_INFO_T*/ 

 dbms_output.put_line('Flag value4: '||v_flag); 

package1.p_proc010(i_var1,i_var2,i_var3,i_var4,i_var5,i_var6,i_var7,i_var8); 

ELSE    IF v_flag = 0 THEN          /*UPDATE INTO RU_INFO_T*/ 

 dbms_output.put_line('Flag value5: '||v_flag); 
package1.p_proc100(i_var1,i_var2,i_var3,i_var4,i_var5,i_var6,i_var7,i_var8); 
END IF; 

END IF; 
dbms_output.put_line('Flag value6: '||v_insflag); 
END;

问题是当其他人提出问题时,
之后的一切
异常处理程序时,code>仍然是您的
的一部分。但这都是不可到达的代码

如果您希望在代码中间有一个异常处理程序,则需要嵌套的PL/SQL块(A<代码>开始/代码>、<代码>异常< /代码>和<代码>结束<代码> >

当然,当其他人只重新引发异常时,使用
异常处理程序是没有意义的。最好的情况是,您正在丢弃错误来自的实际行。当其他的
应该被删除时,
——只需让异常传播


根据Oracle版本的不同,可能会发出警告,提示在
RAISE
之后的所有内容都无法访问。这可能为你指明了解决问题的方向。

问题是,当别人提出问题时,
之后的一切
异常处理程序时,code>仍然是您的
的一部分。但这都是不可到达的代码

如果您希望在代码中间有一个异常处理程序,则需要嵌套的PL/SQL块(A<代码>开始/代码>、<代码>异常< /代码>和<代码>结束<代码> >

当然,当其他人只重新引发异常时,使用
异常处理程序是没有意义的。最好的情况是,您正在丢弃错误来自的实际行。当其他的
应该被删除时,
——只需让异常传播


根据Oracle版本的不同,可能会发出警告,提示在
RAISE
之后的所有内容都无法访问。这可能为您指明了解决问题的方向。

因此会引发其他一些异常。打印SQLERRM将帮助您!因此会引发其他一些异常。打印SQLERRM将帮助您!我在同一个查询中还有另一个问题。
SELECT INTO
没有按照变量中的要求设置值。我在同一查询中遇到了另一个问题。
选择进入
未按照变量中的要求设置值。