儲存過程單引號問題

xccheese發表於2012-01-19

有網友問一個儲存過程問題,加上下劃線("_")就會報錯,測試了一下確實如此,測試環境trace一下,找出原因

SQL> DECLARE
  2   v_num number;
  3   v_type varchar2(30);
  4  BEGIN
  5    v_type:='USER_';
  6    dbms_output.put_line(v_type);
  7    execute immediate 'select length('||v_type||') from dual' into v_num;
  8    dbms_output.put_line(v_num);
  9    END;
 10  /
USER_
DECLARE
*
ERROR at line 1:
ORA-00904: "USER_": invalid identifier
ORA-06512: at line 7
SQL>

SQL> alter session set sql_trace=TRUE;

Session altered.

SQL> DECLARE
  2   v_num number;
  3   v_type varchar2(30);
  4  BEGIN
  5    v_type:='USE_';
  6    dbms_output.put_line(v_type);
  7    execute immediate 'select length('||v_type||') from dual' into v_num;
  8    dbms_output.put_line(v_num);
  9    END;
 10  /
DECLARE
*
ERROR at line 1:
ORA-00904: "USE_": invalid identifier
ORA-06512: at line 7
SQL> alter session set sql_trace=false;

Session altered.

檢視trace檔案orcl_ora_5092.trc(貼出部分內容)

PARSE ERROR #2:len=29 dep=1 uid=61 ct=3 lid=61 tim=1295570213449697 err=904
select length(USE_) from dual  --可以看到具體原因在轉換過程中少了點引號
EXEC #1:c=2000,e=1925,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1295570213450763
ERROR #1:err=904 tim=429491641

修改儲存過程,執行成功

SQL> set serveroutput on

SQL> DECLARE
  2   v_num number;
  3   v_type varchar2(30);
  4  BEGIN
  5    v_type:='USER_';
  6    dbms_output.put_line(v_type);
  7    execute immediate 'select length('''||v_type||''') from dual' into v_num;
  8    dbms_output.put_line(v_num);
  9    END;
 10  /
USER_
5

PL/SQL procedure successfully completed.

SQL>

總結:

在日常操作中注意oracle內部轉換問題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25148509/viewspace-715091/,如需轉載,請註明出處,否則將追究法律責任。

相關文章