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
没有按照变量中的要求设置值。我在同一查询中遇到了另一个问题。选择进入
未按照变量中的要求设置值。