2015-12-02 179 views
0

我从SQL Server环境中,可以声明临时表与@table到来,但我读过你不能在oracle中做到这一点。创建临时表

我希望得到一个值500.000硬编码的ID从表中,但作为IN子句的1000的限制,我需要找到另一种方式。创建临时表并插入硬编码值,然后加入包含我需要的值的其他表是最好的方法吗?我希望它是基于会话的,所以当我关闭数据库客户端时,我希望临时表消失。我希望它是基于会话的,因此当我关闭数据库客户端时,我希望临时表消失。下面的代码是在oracle中正确的方式吗?

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

我也尝试过使用内部连接,并在连接来自双重选择的硬编码值,但是这会为每个值一列,我不能够使用参考加入与。是否可以将所有值插入到双列中的单个列中?

回答

2

您可以使用一些像这样的事情(500 UNION ALL)

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

然后你就可以与其他表加入这个。

+0

感谢您的输入。通过为500.000的值做这个表现会如何? – Henrik

+0

我不希望这样的表现会那么好,因为那是数据库必须解析的一个巨大声明。对于特别的事情,我可能会使用union all和ins的组合,例如。 'select ... from ... where id in(<第1000个id的列表)union all select ... from ... where id in(<第2个1000 id列表)union all ...' – Boneist

1

对于你的情况,我会用一个GTT(全局临时表) - 你已经被长相研究。

一个GTT的优点是,它是一个永久的对象(所以没有需要不断创建和删除它)和“保存”的数据是一个会话的基础上。

+0

请问当我关闭数据库客户端时要删除临时表还是需要在它被删除之前进行提交? – Henrik

+0

临时表将继续,但该数据将被删除)一次提交回滚付诸行动的时候/,b)会议被关闭,C)当你发出从gtt'语句手动删除'或d)当你做一个截断gtt(但要小心隐式提交,因为这是一个DDL命令)。 – Boneist

+0

感谢您的回答。这将在生产环境中,所以我不想添加一个表到数据库。 – Henrik