动态创建临时表

时间:2013-04-05 06:18:23

标签: plsql oracle11g

我有这样的场景,我需要创建一个存储过程,其中列将动态生成。基于此列,应创建临时表。    实际上,我在SQL Server中执行的这种情况已将SQL Server数据库迁移到Oracle。

由于

2 个答案:

答案 0 :(得分:8)

如果要动态创建表,则需要使用动态SQL

BEGIN
  EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE table_name( col1 number, col2 number )';
END;

话虽如此,直接移植为Oracle创建临时表的SQL Server代码几乎肯定是错误的。它的工作方式与SQL Server代码的工作方式不同。

  • 首先,Oracle中的临时表对于每个会话都是可见的,而不像SQL Server,它们是会话的本地会话。这意味着如果你有两个会话调用你的存储过程,他们都会尝试创建临时表,第二个会失败(假设你也在程序结束时丢弃临时表而不是让数以千计的临时表积累起来。)
  • 考虑到所需的锁存量,在Oracle中创建表是一个低效的过程。 Oracle的假设是你不是在动态创建对象。如果您的应用程序违反了该假设,您将遇到一些可伸缩性问题。
  • 如果您动态创建表格,则必须动态引用它们。因此,对临时表的任何查询也需要使用动态SQL。这比静态SQL效率低,它使您的代码更难编写,更难调试,更难维护。

答案 1 :(得分:2)

也许我有点讨论主题,但试着分析一下你真正想要实现的目标。我一直在和几个使用T-TSQL的人一起工作,SQL服务器中使用的模式与Oracle不同。只是不要试图一对一地完全重写您的代码。 它不起作用。

例如,临时表的使用在Oracle中被认为是一种糟糕的设计(在大多数情况下)。如果在T-SQL中使用临时表,通常会在Oracle中使用游标。

还要记住,SQL和PL / SQL是编译语言(它不是真正的脚本)。您不能(重新)在PL / SQL包中创建表,然后在某些(或其他包)中使用它。 在Oracle中修改对象时,必须在后台重新编译所有依赖代码。 对于从SQL Server进入Oracle的人来说,这是一个令人沮丧的原因。

情况并非糟糕,它与它似乎有所不同。