2017-02-06 12 views
0

多くのテーブルを検索してテンポラリテーブルに挿入するためにoracleにスクリプトを作成しようとしていますが、数字以外のものを実行しようとするといくつかのエラーが発生します。Oracle 11gで即時実行

宣言した変数

m_polCount NUMBER:= 0; 
    m_product NUMBER:= 0; 
    m_version NUMBER:= 0; 
    m_plan NUMBER:= 0; 
    m_policy NUMBER:= 0; 
    m_pol_comm_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY'); 
    m_pol_end_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY'); 
    m_pol_status NUMBER:= 0; 
    m_next_pre_renew_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY'); 
    m_next_renew_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY'); 
    m_last_renew_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY'); 
    m_cover_no NUMBER:= 0; 
    m_cover_name VARCHAR(240):= 'Test'; 
    m_cover_start_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY'); 
    m_cover_end_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY'); 
    m_sum_assured NUMBER:= 0; 
    m_cover_layer NUMBER:= 0; 
    m_cover_prem_layer NUMBER:= 0; 
    m_premium NUMBER:= 0; 
    m_loading_type NUMBER:= 0; 
    m_loading_name VARCHAR(200):= 'Test'; 
    m_basic_prem_loading SMALLINT:= 0; 
    m_loading_start_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY'); 
    m_loading_end_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY'); 
    m_loading_perc NUMBER:= 0; 
    m_loading_rate NUMBER:= 0; 
    m_loading_prem NUMBER:= 0; 
    m_calc_desc VARCHAR(240):= 'Test'; 
    m_inflation_rate NUMBER:= 0; 
    m_agent_no NUMBER:= 0; 

表作成さ

EXECUTE IMMEDIATE ' 
     CREATE TABLE I233_ACTIVE_P4L_POLICY_DATA 
     (
     PRODUCT NUMBER, 
     VERSION NUMBER, 
     PLAN_NUMBER NUMBER, 
     POLICY_NUMBER NUMBER, 
     POLICY_COMM_DATE DATE, 
     POLICY_END_DATE DATE, 
     POLICY_STATUS NUMBER, 
     NEXT_PRE_RENEWAL_DATE DATE, 
     NEXT_RENEWAL_DATE DATE, 
     LAST_RENEWAL_DATE DATE, 
     COVER_NUMBER NUMBER, 
     COVER_NAME VARCHAR(240), 
     COVER_START_DATE DATE, 
     COVER_END_DATE DATE, 
     SUM_ASSURED NUMBER, 
     COVER_LAYER NUMBER, 
     COVER_PREMIUM_LAYER NUMBER, 
     ANNUAL_PREMIUM NUMBER, 
     LOADING_TYPE NUMBER, 
     LOADING_NAME VARCHAR(200), 
     BASIC_PREM_LOADING SMALLINT, 
     LOADING_START_DATE DATE, 
     LOADING_END_DATE DATE, 
     LOADING_PERC NUMBER, 
     LOADING_RATE NUMBER, 
     LOADING_PREM NUMBER, 
     PREMIUM_CALC_DESC VARCHAR(240), 
     INFLATION_RATE NUMBER, 
     AGENT_NUMBER NUMBER 
     )'; 

INSERT文

EXECUTE IMMEDIATE ' 
     INSERT INTO I233_ACTIVE_P4L_POLICY_DATA 
     VALUES(
     '||m_product||', 
     '||m_version||', 
     '||m_plan||', 
     '||policy_rec.policy_no||', 
     '||m_pol_comm_date||', <----This field 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     '||m_pol_status||', 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     '||m_cover_no||', 
     '''', 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     '||m_sum_assured||', 
     '||m_cover_layer||', 
     '||m_cover_prem_layer||', 
     '||m_premium||', 
     '||m_loading_type||', 
     ''TEST3'', 
     '||m_basic_prem_loading||', 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     '||m_loading_perc||', 
     '||m_loading_rate||', 
     '||m_loading_prem||', 
     ''TEST3'', 
     '||m_inflation_rate||', 
     '||m_agent_no||')'; 

エラー

ORA-00917:行方不明カンマ

私は違いのエラーを取得するのと同じ方法で日付をしようとする場合

INSERT文

EXECUTE IMMEDIATE ' 
     INSERT INTO I233_ACTIVE_P4L_POLICY_DATA 
     VALUES(
     '||m_product||', 
     '||m_version||', 
     '||m_plan||', 
     '||policy_rec.policy_no||', 
     m_pol_comm_date, <----This field 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     '||m_pol_status||', 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     '||m_cover_no||', 
     '''', 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     '||m_sum_assured||', 
     '||m_cover_layer||', 
     '||m_cover_prem_layer||', 
     '||m_premium||', 
     '||m_loading_type||', 
     ''TEST3'', 
     '||m_basic_prem_loading||', 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
     '||m_loading_perc||', 
     '||m_loading_rate||', 
     '||m_loading_prem||', 
     ''TEST3'', 
     '||m_inflation_rate||', 
     '||m_agent_no||')'; 

は私に

ORA-00984が次のエラーを与える:列ここでは使用できません

同じメソッドを使用してVARCHARフィールドのいずれかを挿入しようとすると、同じ問題が発生します。

上記の作成された一時テーブルに即時実行を使用して日付/ varcharフィールドを挿入する方法はありますか?

すべて上記の文は、バインド変数を使用し、動的SQLを避けることができないと仮定すると、BEGIN ENDチャンク内

おかげ

+0

なぜあなたは、動的SQLではなく、静的SQLステートメントを使用している:その方法は、あなたが

何かのようになど、データ型変換を心配する必要はありませんか?永久的なテーブル(セッションの結果を保持するだけでよい場合はグローバル・テンポラリ・テーブル(GTT)を使用し、後でそれらを破棄する)を使用するのではなく、テーブルを動的に作成するのはなぜですか? – Boneist

+1

問題を診断するには、dbms_output.put_line(または好きなデバッグ方法)を使用して、動的に実行されている文字列が何であるかを調べる必要があります。それは、問題を診断するためには大変なことになります。しかし、私があなたであり、動的SQLを使用しなければならない場合は、バインド変数を使用します。 (エラーが発生するのは、日付を文字列に変換してから実行可能ステートメントに連結する前に明示的に日付を変換してから、ステートメント内の日付に戻すためです) – Boneist

答えて

1

を含まれています。

execute immediate ' 
    INSERT INTO I233_ACTIVE_P4L_POLICY_DATA 
    VALUES(:m_product, 
      :m_version, 
      :m_plan, 
      :policy_rec.policy_no, 
      :m_pol_comm_date, <----This field 
      TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
      :m_pol_status, 
      TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
      TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
      TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
      :m_cover_no, 
      '''', 
      TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
      TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
      :m_sum_assured, 
      :m_cover_layer, 
      :m_cover_prem_layer, 
      :m_premium, 
      :m_loading_type, 
      ''TEST3'', 
      :m_basic_prem_loading, 
      TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
      TO_DATE(''01-01-3000'',''DD-MM-YYYY''), 
      :m_loading_perc, 
      :m_loading_rate, 
      :m_loading_prem, 
      ''TEST3'', 
      :m_inflation_rate, 
      :m_agent_no)' 
    USING :m_product, 
     :m_version, 
     :m_plan, 
     :policy_rec.policy_no, 
     :m_pol_comm_date, 
     :m_pol_status, 
     :m_cover_no, 
     :m_sum_assured, 
     :m_cover_layer, 
     :m_cover_prem_layer, 
     :m_premium, 
     :m_loading_type, 
     :m_basic_prem_loading, 
     :m_loading_perc, 
     :m_loading_rate, 
     :m_loading_prem, 
     :m_inflation_rate, 
     :m_agent_no; 
+0

これは、ありがとうございました。 – PowPowPowell

+0

これは、引用符などをエスケープする必要を簡略化するため、qクォート構文を使用して提案した行の3番目のポストです。基本的にq '[あなたの文字列] ' – BobC

+0

@BobCバインド変数は、この場合の引用構文よりも優れています。 SQLインジェクション、異なるデータ型の自動処理などのリスクなし – Boneist