我发现Oracle中的临时表概念与SQL Server等其他数据库有很大不同。在Oracle中,我们有一个全局临时表概念,并且只创建一次,在每个会话中填充数据,这与其他数据库不同。
在18c中,Oracle引入了私有临时表概念,表明成功使用后,可以像其他数据库一样删除表。但是如何在PL / SQL块中使用它呢?
我尝试使用动态SQL- EXECUTE IMMEDIATE
进行使用。但它给我一个“表必须声明”的错误。那我该怎么办呢?
create private temporary table ora$ptt_sales_summary (
sales_month date
, total_value number )
/
insert into ora$ptt_sales_summary
select trunc(sales_date, 'MM')
, sum (qty*price)
from massive_sales_table
group by trunc(sales_date, 'MM')
/
select *
from ora$ptt_sales_summary
order by sales_month
/
declare
cnt int;
begin
execute immediate 'create private temporary table ora$ptt_tmp (id int)';
execute immediate 'insert into ora$ptt_tmp values (55)';
execute immediate 'insert into ora$ptt_tmp values (66)';
execute immediate 'insert into ora$ptt_tmp values (77)';
execute immediate 'select count(*) from ora$ptt_tmp' into cnt;
dbms_output.put_line(cnt);
execute immediate 'delete from ora$ptt_tmp where id = 66';
cnt := 0;
execute immediate 'select count(*) from ora$ptt_tmp' into cnt;
dbms_output.put_line(cnt);
end;
以下是示例: https://livesql.oracle.com/apex/livesql/s/l7lrzxpulhtj3hfea0wml09yg
session/transaction
结束时被删除。
ON COMMIT DROP DEFINITION
选项创建一个事务特定的私有临时表。在事务结束时,Oracle会删除表定义和数据。ON COMMIT PRESERVE DEFINITION
选项创建一个会话特定的私有临时表。Oracle会在会话结束时删除所有数据并删除表。
您不需要手动drop
它。 Oracle会为您执行此操作。
CREATE PRIVATE TEMPORARY TABLE ora$ptt_temp_table (
......
)
ON COMMIT DROP DEFINITION;
-- or
-- ON COMMIT PRESERVE DEFINITION;
ON COMMIT DROP DEFINITION
的示例(在执行 COMMIT
后表将被删除)
在编程中,ON COMMIT PRESERVE DEFINITION
是一个示例(当执行COMMIT
后,表将被保留,但在会话结束时将被删除)。