3

この回答に基づいて、一時テーブルを作成しようとしましたが、ステートメントにORA-00942:table or view does not exist何か問題があると思われる例外が発生しました。 以下のSQLステートメントを見つけてください。'CREATE OR REPLACE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS'insert into TempQandA(column1) VALUES (1);

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;
4

2 に答える 2

6

動的に作成する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 はすべてのセッションに対してローカルになります。

編集: Lalitが言うように、GTTDDL受け入れませんCREATE OR REPLACE

于 2014-10-06T08:43:50.200 に答える
2

'CREATE OR REPLACE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS';

キーワード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>
于 2014-10-06T08:42:34.720 に答える