10

1つの挿入ステートメントで複数の行を挿入したい。

次のコードは1行を挿入し、正常に機能します。

create temp table mytmptable
(external_id char(10),
int_id integer,
cost_amount decimal(10,2)
) with no log;

insert into mytmptable values 
('7662', 232, 297.26);

select * from mytmptable;

挿入をこれに変更しようとしましたが、構文エラーが発生します。

insert into mytmptable values 
('7662', 232, 297.26),
('7662', 232, 297.26);

それを機能させる方法はありますか、それとも代わりに多くの挿入を実行する必要がありますか?

4

5 に答える 5

7

あなたはいつでもこのようなことをすることができます:

insert into mytmptable
select * 
from (
  select '7662', 232, 297.26 from table(set{1})
  union all
  select '7662', 232, 297.26 from table(set{1})
)

これが標準SQLであり、Informixで機能することを確認してください(Informixがステートメントで受け入れるUNION ALLには派生テーブルが必要です)。INSERT .. SELECT

于 2012-09-09T23:40:10.830 に答える
7

ご存知のように、Informixでは単一のINSERTステートメントで複数の値のリストを使用することはできません。

最も簡単な解決策は、それぞれが単一の値のリストを持つ複数のINSERTステートメントを使用することです。

ESQL / CなどのAPIを使用していて、パフォーマンスが心配な場合は、INSERTカーソルを作成して、それを繰り返し使用できます。これにより、バッファがいっぱいになるまで、またはカーソルをフラッシュまたは閉じるまで、挿入が保存されます。

$ PREPARE p FROM "INSERT INTO mytmptable VALUES(?, ?, ?)";
$ DECLARE c CURSOR FOR p;
$ OPEN c;
while (...there's more data to process...)
{
    $PUT c USING :v1, :v2, :v3;
}
$ CLOSE c;

変数、、v1v2v3挿入される文字列と数値を保持するホスト変数です。(必要に応じて、オプション$ FLUSH c;でループで使用できます。)これは値をバッファリングするため、非常に効率的です。もちろん、単に$ EXECUTE p USING :v1, :v2, :v3;ループで使用することもできます。これは、ステートメントの行ごとの準備も省略します。

詳細なSQLを記述してもかまわない場合は、Matt Hamiltonによって提案されたUNION手法を使用できますが、Informixを使用する各SELECTにFROM句が必要になります。次のように指定できます。

  • FROM "informix".systables WHERE tabid = 1、 また
  • FROM sysmaster:"informix".sysdual、 また
  • 他の手法を使用して、SELECTにFROM句があり、1行のデータのみが生成されるようにします。

私のデータベースにはdual、単一の行を含むテーブル、またはの同義語dualである同義語がありsysmaster:"informix".sysdualます。"informix".データベースが「通常」の場合は、これらのステートメントの一部がなくても問題を解決できます。データベースがInformixMODEANSIデータベースである場合、所有者名は非常に重要です。

于 2012-09-09T23:49:44.310 に答える
5

Infomixの一部のバージョンでは、TABLEキーワードの後に​​コレクションCOLLECTIONなどのデータ型の1つの値を続けて使用して、仮想テーブルを作成できます。LISTあなたの場合、コンストラクター構文を使用してタイプLISTの値のを使用します。Unnamed RowROW(...)

TABLEfromCOLLECTION値 の作成http://www.ibm.com/support/knowledgecenter/SSGU8G_11.50.0/com.ibm.sqls.doc/ids_sqs_1375.htm

ROW(...)Unnamed Rowデータ型 のリテラルの構築構文http://www.ibm.com/support/knowledgecenter/SSGU8G_11.50.0/com.ibm.sqlr.doc/ids_sqr_136.htm

例:

select * 
from TABLE(LIST{
  ROW('7662', 232, 297.26),
  ROW('7662', 232, 297.26)
}) T(external_id, int_id, cost_amount)
into temp mytmptable with no log

上記では、データ型は値によって示されますが、必要に応じて、次のように、行コンストラクターで各値を目的のデータ型に明示的にキャストできます。

ROW('7662'::char(10), 232::integer, 297.26::decimal(10,2))
于 2016-04-18T22:47:32.753 に答える
3

値を外部ファイルに保管し、dbaccessで次のステートメントを実行することにより、複数の行を挿入することもできます。

LOAD FROM "externalfile" INSERT INTO mytmptable;

ただし、値はパイプ「|」で区切る必要があります。シンボル、またはDBDELIMITER環境変数をに設定したもの。

パイプ区切り文字を使用している場合、外部ファイルのデータは次のようになります。

7662|232|297.26|
7663|233|297.27|
...

各mytmptable.columnデータ型に正常に挿入するには、外部ファイルのデータが適切にフォーマットされているか、変換できる必要があることに注意してください。

于 2012-09-12T04:22:56.323 に答える
0

これは、SELECT部分​​が残りを解決するバルクインサートの簡単なソリューションです。

INSERT INTO cccmte_pp 
( cmte, pref, nro, eje, id_tri, id_cuo, fecha, vto1, vto2, id_tit, id_suj, id_bie, id_gru ) 
SELECT * FROM TABLE (MULTISET { 
row('RC', 4, 10, 2020, 1, 5, MDY(05,20,2020), MDY(05,20,2020),MDY(05,27,2020),101, 1, 96, 1 ), 
row('RC', 4, 11, 2020, 1, 5, MDY(05,20,2020), MDY(05,20,2020),MDY(05,27,2020),101, 1, 96, 1 ) }) 
AS t( cmte, pref, nro, eje, id_tri, id_cuo, fecha, vto1, vto2, id_tit, id_suj, id_bie, id_gru )
;
于 2020-05-20T21:48:49.133 に答える