在 Oracle 上无法同时执行多个查询,出现 ORA-00933: SQL 命令不正确

问题描述 投票:0回答:2

我有一个使用以下命令创建的表并存在于数据库中:

create global temporary table tmp(id int) on commit delete rows;

我是一名 SQL Server 人员,需要将大量即席查询转换为 Oracle。我需要在 Oracle 中执行这个简单的操作,但收到错误 ORA-00933。我可以在 SQL Server 中运行完全相同的事情,没有任何问题。

insert into tmp values (100);
insert into tmp values (200);
insert into tmp values (300);
select table1.name from table1, tmp where table1.id = tmp.id;
commit;

SQL Server 中的查询原本如下:

create table #tmp (id int)
insert into #tmp values (100)
insert into #tmp values (200)
insert into #tmp values (300)
select table1.name from table1, #tmp t where table1.id = t.id
drop table #tmp

首选结果是有一个名称列表,例如:

name
_____
Apple
Poir
Cherry

这是我的 C# 代码:

DataTable myDataTable = new myDataTable();
Using(var adapter = new OracleDataAdapter(query, connection))
{
    adapter.Fill(myDataTable);
}
oracle plsql
2个回答
0
投票

如果不使用 PL/SQL,则无法将多个命令作为一个单元提交。将它们包装在

begin end;
中,将它们作为 PL/SQL 脚本提交到数据库:

begin
  insert into tmp values (100);
  insert into tmp values (200);
  insert into tmp values (300);
  select table1.name from table1, tmp where table1.id = tmp.id;
  commit;
end;

0
投票

在 Oracle 中,每个命令必须是单个语句。不可能在单个命令中运行多个语句(这有助于防止 SQL 注入攻击,例如this XKCD)。

您可以:

  1. 单独运行每个语句。

  2. 使用将语句作为脚本运行的 IDE(IDE 会将脚本分解为单独的语句并逐一运行它们)。

  3. 停止使用临时表进行小型查询:

    select name from table1 where id IN (100, 200, 300);
    

    或:

    WITH tmp (id) AS (
      SELECT 100 FROM DUAL UNION ALL
      SELECT 200 FROM DUAL UNION ALL
      SELECT 300 FROM DUAL
    )
    SELECT t1.name FROM table1 t1 INNER JOIN tmp t ON t1.id = t.id;
    
© www.soinside.com 2019 - 2024. All rights reserved.