【问题标题】:Create temporary table创建临时表
【发布时间】:2016-03-06 10:13:38
【问题描述】:

我来自 SQL Server 环境,您可以在其中使用 @table 声明临时表,但正如我所读到的,您不能在 oracle 中执行此操作。

我想从表中获取 500.000 个硬编码 id 的值,但由于 IN 子句的限制为 1000,我需要找到另一种方法。是创建一个临时表并插入硬编码值然后加入另一个包含我需要的值的表的最佳方法吗?

我的客户端(蟾蜍)的自动提交设置为关闭,我不想提交任何东西,我希望它是基于会话的,所以当我关闭数据库客户端时,我希望临时表消失。下面的代码在oracle中是正确的吗?

CREATE GLOBAL TEMPORARY TABLE Test(HardcodedId number(10))
ON COMMIT DELETE ROWS;

我也尝试过使用内连接,并在连接中从对偶中选择硬编码值,但这会为每个值创建一个列,我无法使用引用来连接。是否可以将所有值插入到双列中?

【问题讨论】:

    标签: oracle11g


    【解决方案1】:

    你可以使用这样的东西(500 union all)

    select * from (
    select '1' from dual
    union all
    select '2' from dual
    ...) q
    

    然后您可以将它与其他表连接起来。

    【讨论】:

    • 感谢您的意见。对 500.000 个值执行此操作后性能如何?
    • 我没想到性能会那么好,因为这对于数据库来说是一个必须解析的巨大语句。对于临时的事情,我可能会使用 union all's 和 ins 的组合,例如。 select ... from ... where id in (<list of 1st 1000 ids) union all select ... from ... where id in (<list of 2nd 1000 ids) union all ...
    【解决方案2】:

    对于您的情况,我会使用 GTT(全局临时表) - 您已经通过外观进行了研究。

    GTT 的优势在于它是一个永久对象(因此无需不断地创建和删除它)并且“存储”在其中的数据是基于会话的。

    【讨论】:

    • 当我关闭数据库客户端时临时表会被删除还是需要在它被删除之前进行提交?
    • 临时表将保留,但数据将被删除 a) 提交/回滚操作时,b) 会话关闭时,c) 当您发出手动 delete from gtt 语句或 d ) 当您截断 gtt 时(但要注意隐式提交,因为这是一个 DDL 命令)。
    • 感谢您的回答。这将在生产环境中,所以我不想在数据库中添加一个表。
    • 这是一个临时的东西,而不是作为生产代码定期运行的东西?
    • 啊,对了,对于一些特别的事情,我同意你可能不想在 prod 中创建表! *{;-)
    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2015-04-25
    相关资源
    最近更新 更多