动态创建临时表

use*_*383 1 plsql oracle11g

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

谢谢

Jus*_*ave 8

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

BEGIN
  EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE table_name( col1 number, col2 number )';
END;
Run Code Online (Sandbox Code Playgroud)

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

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