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)に変更しましたが、問題ありませんでした。
要約すると、動的ステートメントを使用する場合、変数の長さを定義する前に、実行するステートメントの長さを知っている必要があります。