我想用一个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)
有没有办法让它工作,或者我需要运行多个插入?
你总是可以这样做:
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 ALL在INSERT .. SELECT语句中接受的必要条件).
正如您发现的那样,您不能在 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)
变量v1,v2,v3是主机变量来保存要插入的字符串和数字。($ 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, 或者在我的数据库中,我要么有一个dual包含单行的表,要么有一个同义词dual,它是sysmaster:"informix".sysdual. "informix".如果数据库“正常”,你可以不用那些语句的一部分;如果您的数据库是 Informix MODE ANSI 数据库,则所有者名称至关重要。
在 Infomix 的某些版本中,您可以使用TABLE关键字后跟其中一种COLLECTION数据类型(例如LIST集合)的值来构建虚拟表。在您的情况下,请使用构造函数语法使用 a LISTofUnnamed Row类型的值ROW(...)。
创建一个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
Run Code Online (Sandbox Code Playgroud)
在上面,数据类型由值隐含,但在需要时,您可以在行构造函数中将每个值显式转换为所需的数据类型,如下所示:
ROW('7662'::char(10), 232::integer, 297.26::decimal(10,2))
Run Code Online (Sandbox Code Playgroud)