ora-06502 pl/sql 數字或值錯誤

來源:互聯網
上載者:User
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),就可以了。

總結一下,利用動態語句時,一定要知道要執行的語句長度後再進行定義變數的長度。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.