读书人

ORACLE PL/SQL 万思不得其解的有关问

发布时间: 2012-10-13 11:38:17 作者: rapoo

求助,ORACLE PL/SQL 万思不得其解的问题
先贴上代码:

SQL code
declare    type nestable_type_varchar2 is table of varchar2(10);    nestable_varchar2 nestable_type_varchar2 := nestable_type_varchar2(null);        type map_type_varchar2 is table of varchar2(10) index by binary_integer;    map_varchar2 map_type_varchar2;        type array_type_varchar2 is varray(10) of varchar2(10);    array_varchar2 array_type_varchar2 := array_type_varchar2('123');        type record_type_dept is record (        deptNo number(2),         deptName varchar2(14)    );        type nestable_type_dept is table of record_type_dept;    nestable_dept nestable_type_dept;        type array_type_dept is varray(10) of record_type_dept;    array_dept array_type_dept;        xx boolean;begin    dbms_output.put_line('nestable_varchar2.count: ' || nestable_varchar2.count);    dbms_output.put_line('map_varchar2.count: ' || map_varchar2.count);    dbms_output.put_line('array_varchar2.count: ' || array_varchar2.count);        xx := array_varchar2.exists(12);        dbms_output.put_line('array_varchar2.exists(12): '         || case when xx then 'yes' else 'no' end);        dbms_output.put_line('nestable_dept.count: ' || nestable_dept.count);    dbms_output.put_line('array_dept.count: ' || array_dept.count);        dbms_output.put_line(1 / 0);        exception     when others then        dbms_output.put_line('exception found.');end;


在SQL*Plus 运行时,输出如下:
nestable_varchar2.count: 1
map_varchar2.count: 0
array_varchar2.count: 1
array_varchar2.exists(12): yes
exception found.

在PL/SQL developer 里运行时,输出的结果是这样:
nestable_varchar2.count: 1
map_varchar2.count: 0
array_varchar2.count: 1
array_varchar2.exists(12): no
exception found.

由输出结果看出,PL/SQL developer的输出结果是正确的,array_varchar2.exists(12)应该返回为false!而SQL*Plus的输出结果是错误的!

这是为什么呢,这么奇怪的结果输出?

如果将抛异常的代码
dbms_output.put_line('nestable_dept.count: ' || nestable_dept.count);
dbms_output.put_line('array_dept.count: ' || array_dept.count);

dbms_output.put_line(1 / 0);

注释掉,SQL*Plus的输出又正常了!
nestable_varchar2.count: 1
map_varchar2.count: 0
array_varchar2.count: 1
array_varchar2.exists(12): no

PL/SQL 过程已成功完成。


这是为什么呢,万思不得其解,求高手解答!!!

[解决办法]
xx boolean;

你打印测试下,在SQLPLUS和PLSQL DEV 这个初始化的值是否一样?
[解决办法]
把这段逻辑抽离出来,对于这一句
dbms_output.put_line('=='||array_varchar2(1));
执行与否,结果也不一致,是否sql*plus的机制与众不同?
SQL code
SQL>     DECLARE   2      type array_type_varchar2 is varray(10) of varchar2(10);  3      array_varchar2 array_type_varchar2 := array_type_varchar2('123');  4      xx BOOLEAN;  5      BEGIN   6      dbms_output.put_line('=='||array_varchar2(1));  7      xx:=array_varchar2.exists(12);  8      dbms_output.put_line('array_varchar2.exists(12): '   9          || case when xx then 'yes' else 'no' end); 10      END; 11  /==123array_varchar2.exists(12): yesPL/SQL 过程已成功完成。SQL>     DECLARE   2      type array_type_varchar2 is varray(10) of varchar2(10);  3      array_varchar2 array_type_varchar2 := array_type_varchar2('123');  4      xx BOOLEAN;  5      BEGIN   6      --dbms_output.put_line('=='||array_varchar2(1));  7      xx:=array_varchar2.exists(12);  8      dbms_output.put_line('array_varchar2.exists(12): '   9          || case when xx then 'yes' else 'no' end); 10      END; 11  /array_varchar2.exists(12): noPL/SQL 过程已成功完成。
[解决办法]

PL/SQL块同样是以数据库对象为操作对象,但由于SQL本身不具备过程控制功能,所以为了能够与其他语言一样具备过程控制的处理功能,在SQL中加入诸如循环和选择等面向过程的处理功能,由此形成了PL/SQL。所有PL/SQL语句的解释均由PL/SQL引擎来完成,使用PL/SQL块可编写过程,触发器和包等数据库永久对象。



SQL*Plus命令主要用来格式化查询结果,设置选择,编辑以及存储SQL命令,设置查询结果的显示格式,并且可以设置环境选项。可以编辑交互语句,可以与数据库进行“对话”。


[解决办法]

SQL code
--木有发现你的情况[SYS@myoracle] SQL>startupORACLE 例程已经启动。Total System Global Area  293601280 bytesFixed Size                  1248600 bytesVariable Size              88081064 bytesDatabase Buffers          197132288 bytesRedo Buffers                7139328 bytes数据库装载完毕。数据库已经打开。[SYS@myoracle] SQL>set serveroutput on[SYS@myoracle] SQL>DECLARE  2         type array_type_varchar2 is varray(10) of varchar2(10);  3         array_varchar2 array_type_varchar2 := array_type_varchar2('123');  4         xx BOOLEAN;  5         BEGIN  6         dbms_output.put_line('=='||array_varchar2(1));  7         xx:=array_varchar2.exists(12);  8         dbms_output.put_line('array_varchar2.exists(12): '  9             || case when xx then 'yes' else 'no' end); 10         END; 11     /==123array_varchar2.exists(12): noPL/SQL 过程已成功完成。[SYS@myoracle] SQL>DECLARE  2         type array_type_varchar2 is varray(10) of varchar2(10);  3         array_varchar2 array_type_varchar2 := array_type_varchar2('123');  4         xx BOOLEAN;  5         BEGIN  6         --dbms_output.put_line('=='||array_varchar2(1));  7         xx:=array_varchar2.exists(12);  8         dbms_output.put_line('array_varchar2.exists(12): '  9             || case when xx then 'yes' else 'no' end); 10         END; 11     /array_varchar2.exists(12): noPL/SQL 过程已成功完成。[SYS@myoracle] SQL> 

读书人网 >oracle

热点推荐