我更喜欢在pl/sql块中使用这种"嵌入式"样式插入(与执行立即样式动态sql相反 - 您必须在其中分隔引号等).
-- a contrived example PROCEDURE CreateReport( customer IN VARCHAR2, reportdate IN DATE ) BEGIN -- drop table, create table with explicit column list CreateReportTableForCustomer; INSERT INTO TEMP_TABLE VALUES ( customer, reportdate ); END; /
这里的问题是oracle检查'temp_table'是否存在并且它具有正确的colunms数并且如果它不存在则抛出编译错误.
所以我想知道是否有任何方式围绕这个?!基本上我想使用占位符表示表名,以欺骗oracle不检查表是否存在.
编辑:
我应该提到用户能够执行任何"报告"(如上所述).一种机制,它将执行任意查询但始终写入temp_table(在用户的模式中).因此,每次运行报告proc时,它都会删除temp_table并使用最可能的不同列列表重新创建它.
您可以使用动态SQL语句插入到可能存在的temp_table中,然后捕获并处理表不存在时发生的异常.
例:
execute immediate 'INSERT INTO '||TEMP_TABLE_NAME||' VALUES ( :customer, :reportdate )' using customer, reportdate;
请注意,在动态SQL语句中使表名有所不同,所以如果确保表名保持不变,那将是最好的.
也许你应该使用全局临时表(GTT).这些是永久表结构,用于保存Oracle会话的临时数据.许多不同的会话可以将数据插入到同一GTT中,并且每个会话只能看到自己的数据.根据GTT的定义,数据会在COMMIT或会话结束时自动删除.
你创建GTT(只有一次)像这样:
create globabal temporary table my_gtt (customer number, report_date date) on commit delete/preserve* rows;
*删除适用的
然后你的程序可以像任何其他表一样使用它 - 唯一的区别是它总是从你的会话开始为空.