2016-08-22 8 views
0

たとえば、「my_date」という列を持つテーブル「Test」があります。私は何をしようとしていることは、いくつかの変数を使用してテーブルにレコードを追加しますたとえば、Oracleで即時実行を使用してテーブルにデータを挿入する

query_date := "SELECT sysdate FROM dual"; 
EXECUTE IMMEDIATE ('insert into test values query_date'); 

私はしかし、私はエラーを取得し、文字列を作成し、クエリを実行して、この正確な方法でテーブルにレコードを挿入する必要があります。それは可能ですか?

+0

'query_date'変数は、最初のクエリまたはクエリ自体から日付を保持しているはずですか?いずれにしても、なぜ動的SQLを使用したいのですか? –

答えて

3

あなたはどちらかそれから(日付)変数に最初のクエリの結果を取得し、それを使用することができます。

SELECT sysdate into query_date FROM dual; 
insert into test (my_date) values (query_date) 
-- or if you really want dynamic SQL, with a bind variable 
EXECUTE IMMEDIATE 'insert into test (my_date) values (:query_date)' using query_date; 

それとも文字通りあなたの質問を読んで、連結することにより、第2の文字列の一部として最初の文字列を使用しますそれ:あなたが代わりにそれを実行する第二の文をプリントアウトした場合

query_date := "SELECT sysdate FROM dual"; 
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date; 

あなたが見たい:

insert into test (my_date) SELECT sysdate FROM dual 

...これは有効なSQLです。これは、query_stringがより複雑な場合、またはそれ自体が動的に構築されている場合に機能します。しかし、query_string選択リスト内の列式の数も変化する場合は、列リストを動的に作成する必要があります。そうしないと、挿入に必要な列が多すぎるか少なすぎます。

これは、クエリ文字列をどのように構築するかによって異なります。基本的にクエリ文字列に式を追加すると、列名を別のリストに追加して、最終的には

select x.col1, y.col2 from ...として col1, col2query_stringが言うように column_listが構築されて
EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string); 


表示されている内容で動的SQLを使用する明らかな理由はありません。それとも、あなただけ行うことができますよう、あなたが本当に、それを得るために別のクエリの必要性をSYSDATEを使用している場合:

insert into test (my_date) values (sysdate) 

...ので、私はあなたの本当のシナリオが本当に、より複雑であると仮定します。ただし、insert ... select ...パターンのvaluesキーワードは使用しないでください。単一の列とサブクエリを使用することはできますが、それでも良い考えではなく、サブクエリに複数の列がある場合は機能しません。

+1

複数の列を持ち、実際に動的にしたい場合は、上記の2番目のコードブロックが機能します。しかし、値の場所だけでなく、列の数が変化する場合は、列リストも作成する必要があります。 –

+0

ありがとう、私は試してみます。 – BekaBot

0

なぜInsert文にEXECUTE IMMEDIATEが必要ですか? 値を挿入する基本表が同じままである限り、EXIMMを実行する必要はありません。今、query_date?伝統的なループや変種をするだけです。

関連する問題