ORA-06502 pl / sqlの数値または値のエラー

ORA-06502:PL / SQL:数値または値のエラー

みなさん、こんにちは:

   今日、私はストアドプロシージャを設計し、動的ステートメントを使用しました。上記のエラーを見つけ、対応する解決策を見つけました。それを発表し、他の人が迂回を避けることを願っています。

ステートメントを直接実行する形式を使用します。キーコードは次のとおりです。

1つのポイント:VI_DATEはプロセスの入力パラメーターです

    EXECUTE IMMEDIATE'INSERT / * + append * / INTO KR_114_ORDER_ALL NOLOGGING

    (STATICE_MONTH、-

     TELE_TYPE、--Businessタイプ

     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 ''

     ユニオンオール

    -チケット事業に参入

    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 ''

    ユニオンオール  

    -食品事業を挿入

    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 ''   

    ユニオンオール

        -ケーキ事業に参入

    SELECT / * + FIRST_ROWS * /

     '' ' || VI_DATE || ' ''、-

     '' 05 ''、-業種

     SUM(t.total_price)、の--Income

     COUNT(DISTINCT t.book_phone)-ユーザー数

      FROM dw_cake_order T

     WHERE t.order_date LIKE '' ' || VI_DATE || '%' '

       AND t.order_type_id = '' 1 ''    

    ユニオンオール

       -農業事業を挿入

    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 ''    

   ユニオンオール

      -花のビジネスを挿入

    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 '' 

    ユニオンオール     

    -雑誌事業に参入

    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 ''

    ユニオンオール  

      -テレシネ事業を挿入

    SELECT / * + FIRST_ROWS * /

     '' ' || VI_DATE || ' ''、-

     '' 11 ''、-業種

     SUM(t.amount)、の--Income

     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に支払われます

  EXECUTE IMMEDIATE  V_SQL;

この時、問題が出てきました。プロセスの実行時に、「ORA-06502:PL / SQL:数値または値のエラー」が報告されましたこれは私を非常に落ち込ませます私の論理は間違っていますか?ここで何が起こっているのですか?

その後、変数の型をvarchar2(100000)に変更し、長さ関数を使用して変数の長さを確認したところ、結果は2290でした。これは、私が定義した変数の長さが短いことを示しています。次に、varchar2(3000)に変更しましたが、問題ありませんでした。

要約すると、動的ステートメントを使用する場合、変数の長さを定義する前に、実行するステートメントの長さを知っている必要があります。

おすすめ

転載: blog.csdn.net/zhaoxiangchong/article/details/8312954