今天在调用DBMS_UTILITY包的GET_PARAMETER_VALUE过程时出现了ORA-600错误。
由于测试的用户没有查看V$PARAMETER视图的权限,因此通过DBMS_UTILITY包来获取相应的初始化参数信息,但是执行下面的语句报错:
SQL> DECLARE
2 V_NUMBER NUMBER;
3 V_STR VARCHAR2(4000);
4 V_RES NUMBER;
5 BEGIN
6 V_RES := DBMS_UTILITY.GET_PARAMETER_VALUE('DB_BLOCK_SIZE', V_NUMBER, V_STR);
7 DBMS_OUTPUT.PUT_LINE(V_NUMBER);
8 END;
9 /
DECLARE
*
ERROR at line 1:
ORA-20000: get_parameter_value: invalid or unsupported parameter "DB_BLOCK_SIZE"
ORA-00600: internal error code, arguments: [923], [DB_BLOCK_SIZE], [], [], [], [], [], []
ORA-06512: at "SYS.DBMS_UTILITY", line 104
ORA-06512: at line 6
如果输入参数名称改为小写则不会报错:
SQL> SET SERVEROUT ON
SQL> DECLARE
2 V_NUMBER NUMBER;
3 V_STR VARCHAR2(4000);
4 V_RES NUMBER;
5 BEGIN
6 V_RES := DBMS_UTILITY.GET_PARAMETER_VALUE('db_block_size', V_NUMBER, V_STR);
7 DBMS_OUTPUT.PUT_LINE(V_NUMBER);
8 END;
9 /
8192
PL/SQL procedure successfully completed.
查询了一下metalink,发现果然是参数大小写的问题,导致了Oracle在处理过程中抛出异常。
在Bug No. 3091998中有详细的描述,这个bug在10.1.0.2中被fixed。
SQL> SET SERVEROUT ON
SQL> DECLARE
2 V_NUMBER NUMBER;
3 V_STR VARCHAR2(4000);
4 V_RES NUMBER;
5 BEGIN
6 V_RES := DBMS_UTILITY.GET_PARAMETER_VALUE('DB_BLOCK_SIZE', V_NUMBER, V_STR);
7 DBMS_OUTPUT.PUT_LINE(V_NUMBER);
8 END;
9 /
16384
PL/SQL 过程已成功完成。
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production