Plsql 在存储过程中创建一行并将其插入表中

Plsql 在存储过程中创建一行并将其插入表中,plsql,oracle11g,Plsql,Oracle11g,错误是: create or replace procedure sample as ID VARCHAR(20); BEGIN execute immediate 'CREATE GLOBAL TEMPORARY TABLE UPDATE_COLUMN_NO_TP ( NAME VARCHAR2(256) )'; INSERT INTO UPDATE_COLUMN_NO_TP SELECT SRC_PK_COLUMNS.PK_KEY FROM SRC_PK_COLUMNS WHE

错误是:

create or replace procedure sample
as
ID VARCHAR(20);
BEGIN
execute immediate
'CREATE GLOBAL TEMPORARY TABLE UPDATE_COLUMN_NO_TP
(
NAME VARCHAR2(256)
)';

INSERT INTO UPDATE_COLUMN_NO_TP
SELECT SRC_PK_COLUMNS.PK_KEY 
  FROM SRC_PK_COLUMNS 
  WHERE NOT EXISTS ( 
  SELECT 1
  FROM TGT_PK_COLUMNS
 WHERE TGT_PK_COLUMNS.ID = SRC_PK_COLUMNS.ID);
END;

所以,我想要这个场景的最佳解决方案。在我的存储过程中,我有10个临时表。所有这些都是动态创建和插入。

更新列\u NO\u TP
在编译时不存在,因此您得到了错误。
如果动态创建表,则应动态访问该表。
注意Mat对GTT本质的评论



全局临时表的全部意义在于,您不会动态创建它们。您只需创建一次,然后在需要时使用它们。(你不能“修复”这个过程。)可能是重复的好吧,我有一个想法。。。我将创建10个表,并在需要时使用它们,并在结束时截断它们。。。这是最好的吗?但是,n个用户一次将访问存储过程。对于这种情况,我们可以应用上面所说的。@user1990383-GTT在提交删除行时有选项
,因此它在提交或回滚时自动截断。@user1990383-GTT对每个会话都有单独的实例,GTT中的数据对其他用户不可见。@user1990383-wrap
insert
语句到
executeimmediate
The table is no exist. 
execute immediate '
INSERT INTO UPDATE_COLUMN_NO_TP
SELECT SRC_PK_COLUMNS.PK_KEY 
  FROM SRC_PK_COLUMNS 
  WHERE NOT EXISTS ( 
    SELECT 1
    FROM TGT_PK_COLUMNS
    WHERE TGT_PK_COLUMNS.ID = SRC_PK_COLUMNS.ID
  )
';