sql - ORA-00942 未创建 oracle 中的 EXECUTE IMMEDIATE 临时表

标签 sql oracle plsql oracle11g execute-immediate

基于 this answer我试图创建临时表,但是我收到异常 ORA-00942:table or view does not exist 我认为 'CREATE OR REPLACE GLOBAL TEMPORARY TABLE TempQandA( column1 number) ON COMMIT PRESERVE ROWS' 语句,它在 insert into TempQandA(column1) VALUES (1); 时失败。
请在下面找到 SQL 语句。

DECLARE 
TransactioDetailId numeric := 3132;
HomePhoneNumber varchar(20);
MobileNumber varchar(20);
Email varchar(20);
whatever varchar(20);
BEGIN
EXECUTE IMMEDIATE 'CREATE OR REPLACE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS';

        BEGIN
        SELECT contactvalue into HomePhoneNumber  FROM customercontact CC
         inner join TRANSACTIONMAIN tm on tm.customerid = CC.customerid
         inner join transactiondetail td on td.transactionid = tm.transactionid
         where contacttypeid = 2 and td.transactiondetailid = TransactioDetailId;
         EXCEPTION
         WHEN NO_DATA_FOUND THEN
         HomePhoneNumber := NULL;
                         begin
                         SELECT  contactvalue into MobileNumber  FROM customercontact CC
                         inner join TRANSACTIONMAIN tm on tm.customerid = CC.customerid
                         inner join transactiondetail td on td.transactionid = tm.transactionid
                         where contacttypeid = 3 and td.transactiondetailid = TransactioDetailId;
                         EXCEPTION
                         WHEN NO_DATA_FOUND THEN
                         MobileNumber := NULL;
                                      begin
                                      SELECT  contactvalue into Email  FROM customercontact CC
                                      inner join TRANSACTIONMAIN tm on tm.customerid = CC.customerid
                                      inner join transactiondetail td on td.transactionid = tm.transactionid
                                      where contacttypeid = 1 and td.transactiondetailid = TransactioDetailId;
                                      EXCEPTION
                                      WHEN NO_DATA_FOUND THEN
                                      Email := NULL;

                                            begin
                                            insert into TempQandA(column1) VALUES (1);
                                             end;
                                     end;
                     end;
         end;
END;

最佳答案

动态创建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 都会本地到每个 session 。

编辑:正如拉利特所说,GTTDDL 不接受 CREATE OR REPLACE

关于sql - ORA-00942 未创建 oracle 中的 EXECUTE IMMEDIATE 临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26212557/

相关文章:

sql - 如何为某些列保持不变的连续记录合并 Effective_dt 和 expire_dt 时间片?

database - 在 Perl 脚本中运行 PL/SQL 过程

mysql - 将 MySQL 函数转换为 Oracle PL/SQL

sql - LinqPad 像操作错误

php - 限制从 SQL 数据库中提取的行数并组织成页面

SQL - 对表中的所有值执行存储过程

sql - 在 oracle 树查询中加入其他表

java - Oracle数据库: access multiple database schemas

sql - 从 Oracle SQL 过程中的表执行 SQL 语句

sql - 获取聚合数据的 UNION ALL 的替代方案