如何在Informix SQL中插入多行?

Hig*_*lar 6 sql informix

我想用一个insert语句插入多行.

以下代码插入一行,并正常工作:

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;
Run Code Online (Sandbox Code Playgroud)

我已经尝试将插入更改为此,但它给出了语法错误:

insert into mytmptable values 
('7662', 232, 297.26),
('7662', 232, 297.26);
Run Code Online (Sandbox Code Playgroud)

有没有办法让它工作,或者我需要运行多个插入?

Mat*_*ton 6

你总是可以这样做:

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})
)
Run Code Online (Sandbox Code Playgroud)

很确定这是标准的SQL并且可以在Informix上运行(派生表是Informix UNION ALLINSERT .. SELECT语句中接受的必要条件).


Jon*_*ler 6

正如您发现的那样,您不能在 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;
Run Code Online (Sandbox Code Playgroud)

变量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 子句但只生成一行数据。

在我的数据库中,我要么有一个dual包含单行的表,要么有一个同义词dual,它是sysmaster:"informix".sysdual. "informix".如果数据库“正常”,你可以不用那些语句的一部分;如果您的数据库是 Informix MODE ANSI 数据库,则所有者名称至关重要。


TCC*_*TCC 5

在 Infomix 的某些版本中,您可以使用TABLE关键字后跟其中一种COLLECTION数据类型(例如LIST集合)的值来构建虚拟表。在您的情况下,请使用构造函数语法使用 a LISTofUnnamed Row类型的值ROW(...)

创建一个TABLEfromCOLLECTIONhttp://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
Run Code Online (Sandbox Code Playgroud)

在上面,数据类型由值隐含,但在需要时,您可以在行构造函数中将每个值显式转换为所需的数据类型,如下所示:

ROW('7662'::char(10), 232::integer, 297.26::decimal(10,2))
Run Code Online (Sandbox Code Playgroud)