ORA-06502: PL/SQL: 數字或值錯誤
大家好:
今天我設計了一個預存程序,用了動態語句。發現了上面的錯誤,並找到了相應的解決方案。發表出來,希望別人少走彎路。
我用的是直接執行語句的形式,關鍵代碼如下所示:
說明一點:VI_DATE是過程的輸入參數
EXECUTEIMMEDIATE'INSERT /*+append*/ INTO KR_114_ORDER_ALL NOLOGGING
(STATICE_MONTH, --月份
TELE_TYPE, --業務類型
TOTAL_SUM, --當月收入
USER_CNT --當月使用者數
)
--插入酒店業務
SELECT /*+FIRST_ROWS*/
'''||VI_DATE||''', --月份
''02'', --業務類型
SUM(T.TOTAL_SUM), --當月收入
COUNT(distinct T.DESTINE_TEL) --使用者數
FROM dw_hotel_order T
WHERE T.LEAV_DATE LIKE '''||VI_DATE||'%''
AND T.ORDER_TYPE = ''01''
union all
--插入機票業務
SELECT /*+FIRST_ROWS*/
'''||VI_DATE||''', --月份
''03'', --業務類型
SUM(t.settlement_price), --當月收入
COUNT(DISTINCT t.linkman_phono) --使用者數
FROM dw_ticket_detail_collect T
WHERE t.date_of_issue LIKE '''||VI_DATE||'%''
AND t.passenger_ticket = ''01''
union all
--插入美食業務
SELECT /*+FIRST_ROWS*/
'''||VI_DATE||''', --月份
''04'', --業務類型
SUM(t.monetary), --當月收入
COUNT(DISTINCT t.roscoe_people_phono) --使用者數
FROM dw_cate_rice_detail T
WHERE t.placing_time LIKE '''||VI_DATE||'%''
AND t.order_status = ''01''
union all
--插入蛋糕業務
SELECT /*+FIRST_ROWS*/
'''||VI_DATE||''', --月份
''05'', --業務類型
SUM(t.total_price), --當月收入
COUNT(DISTINCT t.book_phone) --使用者數
FROM dw_cake_order T
WHERE t.order_date LIKE '''||VI_DATE||'%''
AND t.order_type_id = ''1''
union all
--插入農產品業務
SELECT /*+FIRST_ROWS*/
'''||VI_DATE||''', --月份
''06'', --業務類型
SUM(t.pay_sum), --當月收入
COUNT(DISTINCT t.destine_tel) --使用者數
FROM dw_agriculture_order T
WHERE t.update_time LIKE '''||VI_DATE||'%''
AND t.order_status = ''01''
union all
--插入鮮花業務
SELECT /*+FIRST_ROWS*/
'''||VI_DATE||''', --月份
''07'', --業務類型
SUM(t.total_sum), --當月收入
COUNT(DISTINCT t.destine_tel) --使用者數
FROM dw_flower_order T
WHERE t.update_time LIKE '''||VI_DATE||'%''
AND t.order_status = ''01''
union all
--插入雜誌業務
SELECT /*+FIRST_ROWS*/
'''||VI_DATE||''', --月份
''09'', --業務類型
SUM(t.one_magazine_price), --當月收入
COUNT(DISTINCT t.link_phone) --使用者數
FROM dw_magazine_order T
WHERE t.order_date LIKE '''||VI_DATE||'%''
AND t.order_type_id = ''1''
union all
--插入影訊業務
SELECT /*+FIRST_ROWS*/
'''||VI_DATE||''', --月份
''11'', --業務類型
SUM(t.amount), --當月收入
COUNT(DISTINCT t.phone) --使用者數
FROM dw_ticket_movie T
WHERE t.pay_time LIKE '''||VI_DATE||'%''';
過程能跑通,資料品質也沒有問題。後來我突發奇想,何不定義一個儲存sql語句的變數,直接執行變數就行了。所以,我進行了如下的操作。
V_SQL
VARCHAR2(2000);
V_SQL :=’ INSERT /*+append*/ INTO.. LIKE '''||VI_DATE||'
%''';
就是把上面寫的EXECUTE IMMEDIATE後面的語句全部付給了變數V_SQL
EXECUTEIMMEDIATE
V_SQL;
這時,問題出來了。執行過程時,報了“ORA-06502: PL/SQL:
數字或值錯誤”。這我就很鬱悶了,是我的邏輯錯誤了嗎?這是怎麼回事呢?
後來我把變數類型修改為varchar2(100000),然後用length函數看看變數的長度,結果顯示為2290。這就說明,我定義的變數的長度小了。接下來,我修改為varchar2(3000),就可以了。
總結一下,利用動態語句時,一定要知道要執行的語句長度後再進行定義變數的長度。