Plsql 执行立即创建表和更新表

Plsql 执行立即创建表和更新表,plsql,Plsql,我正在使用executeimmediate在pl/sql中创建一个临时表&同时在表中插入why create table 之后,我将更新表。但我发现错误表不存在,因为它没有创建表thr execute immediate 示例代码--------- 您使用的是静态SQL来执行更新,这在PL/SQL运行之前经过验证,因此发现它引用了当前不存在的表。您可以使用动态SQL执行更新: begin execute immediate 'create table t23 as select ''1''

我正在使用executeimmediate在pl/sql中创建一个临时表&同时在表中插入why create table

之后,我将更新表。但我发现错误表不存在,因为它没有创建表thr execute immediate

示例代码---------


您使用的是静态SQL来执行更新,这在PL/SQL运行之前经过验证,因此发现它引用了当前不存在的表。您可以使用动态SQL执行更新:

begin
  execute immediate 'create table t23 as  select ''1'' aa from dual'; 
  execute immediate 'update t23 set aa =''2'' where aa=''1''';
  COMMIT ;
end;

然而,实际上,在Oracle中,一开始就动态创建这样的临时表是一种不好的做法。你为什么这么做?一旦我们知道了这一点,也许我们可以建议一个更好的替代方案。

您正在使用静态SQL执行更新,并且在运行PL/SQL之前对其进行验证,因此发现它引用了当前不存在的表。您可以使用动态SQL执行更新:

begin
  execute immediate 'create table t23 as  select ''1'' aa from dual'; 
  execute immediate 'update t23 set aa =''2'' where aa=''1''';
  COMMIT ;
end;

然而,实际上,在Oracle中,一开始就动态创建这样的临时表是一种不好的做法。你为什么这么做?一旦我们知道了这一点,也许我们可以建议一个更好的替代方案。

创建一个全局临时表。其他人看不到您的数据,您可以避免直接执行。@Thomas:我可能会这样建议,但目前我不知道这是否是Namita真正需要的。根据我的经验,当pl/sql过程执行直接执行创建表时,很可能是从另一个RDBMS移动的代码。但和你一样,我也不完全确定这个要求是什么。这就是我留下评论而不是答案的原因。如果基础查询每次都相同,您也可以创建一个mat视图,并根据需要进行完全刷新。当然,我们需要更多关于这里发生了什么的信息来创建一个全局临时表。其他人看不到您的数据,您可以避免直接执行。@Thomas:我可能会这样建议,但目前我不知道这是否是Namita真正需要的。根据我的经验,当pl/sql过程执行直接执行创建表时,很可能是从另一个RDBMS移动的代码。但和你一样,我也不完全确定这个要求是什么。这就是我留下评论而不是答案的原因。如果基础查询每次都相同,您也可以创建一个mat视图,并根据需要进行完全刷新。当然,在80%的时间里,你根本不需要临时表,你需要更多关于这里发生了什么的信息——你可以在一个SQL中完成。另外20%的情况下,您可以使用全局临时表或PL/SQL数组。80%的情况下,您根本不需要临时表—您可以在一个SQL中完成。另外20%的情况下,您可以使用全局临时表或PL/SQL数组。