最近SQL查詢返回的結果給PL/SQL變數出現ORA-06502錯誤。這個錯誤的描述是ORA-06502: PL/SQL: numeric or value error: character string buffer too small. 顯而易見的是字元變數定義的長度不夠,加到20,到100,繼續06502,汗,咋回事呢?
1、問題描述
--出現問題是在一個package裡,有兩個參數遊標,一個父遊標,一個子遊標,當父遊標輸出的結果傳遞值給子遊標時提示值太大
--父遊標原sql語句較長,且複雜,為簡化描述下面構造其環境
-->Oracle 版本
goex_admin@CNMMBO> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.3.0 - 64bit Production
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
-->建立一個測試表t並插入3條記錄
goex_admin@CNMMBO> create table t(dt char(8));
Table created.
goex_admin@CNMMBO> insert into t select '20121218' from dual;
1 row created.
goex_admin@CNMMBO> insert into t select '20121219' from dual;
1 row created.
goex_admin@CNMMBO> insert into t select '20121220' from dual;
1 row created.
goex_admin@CNMMBO> commit;
Commit complete.
-->使用下面的查詢輸出結果時報ora-06502錯誤
-->查詢語句也比較簡單,取表t的dt列的最小值,在外層查詢賦值給變數
-->外層的子查詢貌似畫蛇添足,純粹是類比原有環境
goex_admin@CNMMBO> DECLARE
2 tradedate_out CHAR (100);
3 BEGIN
4 SELECT tradedate
5 INTO tradedate_out
6 FROM (SELECT MIN (dt) AS tradedate FROM t) d;
7
8 DBMS_OUTPUT.Put_Line ('trade_date = ' || tradedate_out);
9 END;
10 /
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4
2、改寫查詢
-->如果我們去掉外層查詢沒有類似的錯誤發生
-->如此這般,難道是值由子查詢到外層的時候產生了變異?
goex_admin@CNMMBO> DECLARE
2 tradedate_out CHAR (100);
3 BEGIN
4 SELECT MIN (dt) INTO tradedate_out FROM t;
5
6 DBMS_OUTPUT.Put_Line ('trade_date = ' || tradedate_out);
7 END;
8 /
trade_date = 20121218
PL/SQL procedure successfully completed.