我有一个 SQL Server 存储过程,其中我正在使用另一个表创建一个表。
Select Distinct
col1
,col2
,col3
,col4
into table_2
from table_1;
上面的语句将使用选定的列列表创建一个新表作为“table_2”。
我尝试将上述查询转换为 Oracle 语法:
Create table table_2 as
select
col1
,col2
,col3
,col4
from table_1;
当我在编辑器中运行它时,它可以正常工作。但是,当我尝试在 Oracle 过程中使用它时,同样的语句给了我错误。
我已经浏览了一些链接,其中说需要创建一些临时变量或存储或循环来执行相同的任务。
我现在很困惑,不知道如何将这个简单的语句转换为有效的 Oracle 语法。
如果要在存储过程中创建表(或执行任何其他 DDL),则需要使用动态 SQL
但是,如果您动态创建表,那么每次您想要随后查询该表时,您还需要使用动态 SQL。这通常会使您的代码更难构建和测试。而且您将无法让两个会话同时运行该过程,因为它们的
create table
语句会相互冲突。退一步说,在 SQL Server 中,在过程中创建本地临时表是很常见的。在 Oracle 中这样做非常非常罕见。像这样直接尝试将逻辑从 SQL Server 移植到 Oracle(反之亦然)几乎没有意义。如果这样做,您会发现 Oracle 在运行 SQL Server 代码方面很糟糕(而 SQL Server 在运行 Oracle 代码方面很糟糕)。您通常希望从 SQL Server 中获取逻辑并找出在 Oracle 中实现该逻辑的最佳方法。
Oracle 确实有全局临时表,其中表定义是全局的,但数据对于您的会话(或事务)是本地的。潜在地,你想做
然后在存储过程中插入该表,而不是尝试动态创建表。