Plsql 动态创建临时表

Plsql 动态创建临时表,plsql,oracle11g,Plsql,Oracle11g,我有这样的场景,我需要创建一个存储过程,其中的列将动态出现。应基于此列创建临时表。 实际上,这个场景是我在SQL Server中完成的,我已经将SQL Server数据库迁移到Oracle 谢谢如果要动态创建表,需要使用动态SQL BEGIN EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE table_name( col1 number, col2 number )'; END; 尽管如此,直接将创建临时表的SQL Server代码移植到O

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


谢谢

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

BEGIN
  EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE table_name( col1 number, col2 number )';
END;
尽管如此,直接将创建临时表的SQL Server代码移植到Oracle几乎肯定是错误的。它的工作方式与SQL Server代码不同

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

BEGIN
  EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE table_name( col1 number, col2 number )';
END;
尽管如此,直接将创建临时表的SQL Server代码移植到Oracle几乎肯定是错误的。它的工作方式与SQL Server代码不同

首先,Oracle中的临时表对每个会话都是可见的,不像SQL Server中的临时表是会话的本地表。这意味着,如果有两个会话调用存储过程,它们都会尝试创建临时表,而第二个会话则会失败。如果您也在过程结束时删除临时表,而不是让数千个临时表累积,情况会变得更糟。 考虑到所需的锁存量,在Oracle中创建表是一个效率低下的过程。Oracle的假设是,您不是在动态创建对象。如果您的应用程序违反了这一假设,您将遇到一些可伸缩性问题。 如果动态创建表,则必须动态引用它们。因此,对临时表的任何查询也需要使用动态SQL。这比静态SQL效率低,并且使代码更难编写、调试和维护。
也许我是个话题,但试着分析一下你真正想要达到的目标。我和几个使用T-TSQL的人一起工作过,SQL server中使用的模式与Oracle中的不同。不要试图一对一地重写代码。 这是行不通的

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

还要记住,SQL和PL/SQL是编译语言,而不是真正的脚本。您不能在PL/SQL包中重新创建表,然后在some或other包中使用它。 在Oracle中修改对象时,所有依赖的代码都必须在后台重新编译。 对于那些从SQL Server进入Oracle的人来说,这是许多挫折的根源


这并不是更糟,只是比表面上看起来更不一样。

也许我是个话题,但试着分析一下你真正想要实现的目标。我和几个使用T-TSQL的人一起工作过,SQL server中使用的模式与Oracle中的不同。不要试图一对一地重写代码。 这是行不通的

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

还要记住,SQL和PL/SQL是编译语言,而不是真正的脚本。您不能在PL/SQL包中重新创建表,然后在some或other包中使用它。 在Oracle中修改对象时,所有依赖的代码都必须在后台重新编译。 对于那些从SQL Server进入Oracle的人来说,这是许多挫折的根源


这并不是更糟,只是比看起来的更不一样。

你是说Oracle中的临时表还是plSQL中的嵌套表?Oracle中的临时表,但列将动态出现……这根本不重要!有多少列?列数也不同?或者…它是固定的?经验法则34:不要在OracleColumns名称中动态创建临时表,并且在调用过程时列数会有所不同您是指临时表吗

Oracle中的ry表或plSQL中的嵌套表?Oracle中的临时表,但列将动态出现…这根本不重要!有多少列?列数也各不相同?或者…它是固定的?经验法则34:不要在OracleColumns中动态创建临时表,在调用过程时,列的名称和数量会有所不同谢谢你的响应,是的,动态创建表没有意义,但我不知道如何解决这个问题。你能建议我如何实现这种情况吗?Thanks@user1990383-这将取决于您试图解决的业务问题。例如,为什么列是动态出现的?你为什么想要一张临时桌子?这两个都是技术实现细节——基本的业务需求是什么?每次我得到一个具有不同列名的文件时。我需要为该文件创建一个表。不同的用户可以调用存储过程。谢谢您的回复,是的,动态创建表是没有意义的,但我不知道如何解决这个问题。你能建议我如何实现这种情况吗?Thanks@user1990383-这将取决于您试图解决的业务问题。例如,为什么列是动态出现的?你为什么想要一张临时桌子?这两个都是技术实现细节——基本的业务需求是什么?每次我得到一个具有不同列名的文件时。我需要为该文件创建一个表。不同的用户可以调用存储过程。好的,谢谢。。我已经向@Justin Cave to解释了这个要求,如果你能帮助我的话。这个要求也很高,但如果你的要求不可预测且不规范,也许可以考虑EAV结构。好的,谢谢。。我已经向@Justin Cave to解释了这个要求,如果你能帮助我的话。这个要求也很高,但是如果你的要求是不可预测的,并且没有标准化的话,可以考虑EAV结构。