我有一个使用以下命令创建的表并存在于数据库中:
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);
}
如果不使用 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;
在 Oracle 中,每个命令必须是单个语句。不可能在单个命令中运行多个语句(这有助于防止 SQL 注入攻击,例如this XKCD)。
您可以:
单独运行每个语句。
使用将语句作为脚本运行的 IDE(IDE 会将脚本分解为单独的语句并逐一运行它们)。
停止使用临时表进行小型查询:
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;