基于this answer我试图创建临时表,但是我得到异常ORA-00942:table or view does not exist
我会认为'CREATE OR REPLACE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS'
语句有问题,它在{{1}上失败}。
请在下面找到SQL语句。
insert into TempQandA(column1) VALUES (1);
答案 0 :(得分:5)
您动态创建GTT
,因此您的INSERT
也应动态 ..
请注意,PL / SQL在执行之前验证每个静态查询。
这就是为什么即使在编译时也会出现ORA-942 Table or view doesn't exist
错误的原因!
因此,为了避免这种语义检查,我们必须使调用动态化。
BEGIN
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS';
.....
EXECUTE IMMEDIATE ' insert into TempQandA(column1) VALUES (1)';
END;
最终,您不应在运行时创建GTT
。以避免此类问题。 GTT无论如何都要去 local 到每个会话。
编辑:正如Lalit所说,GTT
的{{1}}不接受DDL
答案 1 :(得分:2)
'创建或替换全局临时表TempQandA(column1号)ON 承诺保留行';
关键字REPLACE
不正确。您只需创建GTT
并使用EXECUTE IMMEDIATE
:
SQL> BEGIN
2 EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE Temp_gtt(column1 number) ON COMMIT PRESERVE ROWS';
3 EXECUTE IMMEDIATE 'insert into temp_gtt(column1) values(1)';
4 END;
5 /
PL/SQL procedure successfully completed.
SQL>
SQL> select * from temp_gtt;
COLUMN1
----------
1
SQL>