我可以在一个语句中运行多个 SQL 部分吗?

Posted

技术标签:

【中文标题】我可以在一个语句中运行多个 SQL 部分吗?【英文标题】:Can I run multiple sections of SQL in one statement? 【发布时间】:2013-07-05 15:40:39 【问题描述】:

我有几个用于测试数据的 SQL 语句。有一堆插入语句、一堆选择语句和一堆删除语句。

是否可以将这些插入语句包装在我可以从一行代码运行的东西中?然后,用一个语句,我可以说,执行插入。或者,执行删除语句。

这是我所拥有的一个例子

insert into [table] values (val1, val2, val3);  
insert into [table] values (val1, val2, val3);  
insert into [table] values (val1, val2, val3);  
insert into [table] values (val1, val2, val3);  
insert into [table] values (val1, val2, val3);  

这就是我想象的样子,但由于我不知道这是否可能,这可能看起来很傻。

execute sqlChunk(); 它将运行下面的所有内容。

sqlChunk()   
  insert into [table] values (val1, val2, val3);  
  insert into [table] values (val1, val2, val3);  
  insert into [table] values (val1, val2, val3);  
  insert into [table] values (val1, val2, val3);  
  insert into [table] values (val1, val2, val3);  

请注意,我只是将陈述放在括号中,因为对我来说,它会是这样的(如果可能的话,再次强调)。我在 DB2 中运行它。但也想知道你是否可以在 oracle sql 中做到这一点。

【问题讨论】:

【参考方案1】:

您可以创建一个存储过程、一个函数或一个作业来封装您的查询,其中 sqlChunk 就是这样。

CREATE PROCEDURE sqlChuck
AS
insert into [table] values (val1, val2, val3);
insert into [table] values (val1, val2, val3);
insert into [table] values (val1, val2, val3);
insert into [table] values (val1, val2, val3);
insert into [table] values (val1, val2, val3);

你会这样称呼它:

EXEC sqlChuck

据我所知,它也可以在 oracle 中完成。

【讨论】:

这就是我想做的。所以在我的sql文档的顶部我想要EXEC deleteTestData;EXEC insertTestData;EXEC showTestData;CREATE PROCEDURE语句如何知道何时结束?我有 3 合一文档。 您只需键入脚本来创建您的程序,运行它然后关闭它,程序将被保存,您可以随时使用/调用它。 哦,我明白了。我正在使用 SQLDeveloper 和 .sql 工作表。我猜你的建议在命令行中会更有效? @EmmanuelRC 你不需要将INSERT 语句放在BEGIN ... END 块中吗?【参考方案2】:

Oracle 支持用于插入的多表语法 INSERT ALL。它看起来像这样

  insert all
     into table2 values (val1, val2, val3) 
     into table3 values (val1, val3)  
     into table4 values (val1, val4, val5)  
     into table5 values (val1, val2, val4)  
     into table6 values (val1, val2, val2)
  select * from table1;  

请注意,它只能作为 INSERT ... SELECT;我们不能使用 VALUES 作为来源。 (虽然我们可以从 DUAL 中选择文字。)Find out more。

据我所知,DB2 没有类似的语法。


当然,Oracle 和DB2 support stored procedures 都可以。存储过程只是一组多条 SQL 语句的一种方式,因此它们可以通过一次调用来执行。

【讨论】:

【参考方案3】:

Oracle 数据库和 DB2 都支持匿名 SQL 块,如下所示:

begin 
 insert into [table] values (val1, val2, val3);  
 insert into [table] values (val1, val2, val3);  
 insert into [table] values (val1, val2, val3);  
 insert into [table] values (val1, val2, val3);  
 insert into [table] values (val1, val2, val3);  
end

在 DB2 中,这也称为复合 SQL。从应用程序的角度来看,块是一条 SQL 语句

【讨论】:

【参考方案4】:

使用 oracle,您可以这样做:

insert into mytable
(field1, field2, field3)
select value1, value2, value3
from dual
union
select value4, value5, value6
from dual
etc

【讨论】:

【参考方案5】:

如果您碰巧使用 DB2 for i,您可以像这样插入多行:

insert into mytable
  values (value1, value2, value3),
         (value1, value2, value3),
         (value1, value2, value3),
         (value1, value2, value3);

【讨论】:

【参考方案6】:

将其全部复制到文件中。随心所欲地调用它。并从 SQL*PLUS 作为脚本运行。

windows 中的示例:

c:\>sqlplus user/password@database_name @c:\script_name.sql

c:\>sqlplus user/password@database_name
SQL>@script_name.sql

c:\>sqlplus user/password@database_name
SQL>@@all_scripts.sql

@@all_scripts.sql 文件可以包含多个文件:

@script1.sql
@script2.sql
@script3.sql

【讨论】:

以上是关于我可以在一个语句中运行多个 SQL 部分吗?的主要内容,如果未能解决你的问题,请参考以下文章

从输出窗格 Datagrip 中删除 SQL 语句

是否有任何规则可以在条件/案例表达式中使用sql语句子句的哪一部分?

将同一变量传递到 SQL 语句的多个部分时出错

SQL语句报错,无法绑定由多个部分组成的标识符解决

在excel中用SQL语句查询时选取所有字段时可以提取,选部分字段时出现查询无法运行或数据库表无法打开。

可以在 select 语句的 where 部分中使用的 ORACLE SQL 函数