如何在没有DDL提交事务的情况下在Oracle db(CREATE GLOBAL TEMPORARY TABLE)中创建临时表?
我想要像MySQL一样的行为。来自here:
CREATE TABLE不会自动提交当前活动的 如果使用TEMPORARY关键字,则为事务。
答案 0 :(得分:6)
是的,DDL提交您的交易。
除了Franek的回答之外,我想指出您不需要动态创建全局临时表,因为此类表中的所有数据都是私有的。插入它的会话。
因此,如果您创建全局临时表一次,您的会话可以安全地使用此表而不必担心干扰其他会话,并且ddl-commit问题变得不相关。
答案 1 :(得分:1)
您可以使用PRAGMA AUTONOMOUS_TRANSACTION在新事务中创建GLOBAL TEMPORARY TABLE,以避免在当前事务中自动提交,如下所示:
create or replace
PROCEDURE create_gtt IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
execute immediate 'CREATE GLOBAL TEMPORARY TABLE gtt_table ( '||
' column1 NUMBER, ' ||
' ) ON COMMIT DELETE ROWS';
END;
在这种情况下,调用create_gtt不会提交您的insert:
CREATE TABLE test_table (test_value VARCHAR2(25));
begin
insert into test_table(test_value) values ('TEST');
create_gtt;
end;