0

以下は、私が書いたストアド プロシージャです。

create or replace procedure test005
as
begin

CREATE GLOBAL TEMPORARY TABLE TEMP_TRAN 
( 
COL1 NUMBER(9), 
COL2 VARCHAR2(30), 
COL3 DATE 
) ON COMMIT PRESERVE ROWS 

/
INSERT INTO TEMP_TRAN VALUES(1,'D',sysdate); 

INSERT INTO TEMP_TRAN VALUES(2,'I',sysdate); 

INSERT INTO TEMP_TRAN VALUES(3,'s',sysdate); 

COMMIT;
end;

実行すると、次のエラーメッセージが表示されます。

create or replace procedure test005
as
begin

CREATE GLOBAL TEMPORARY TABLE TEMP_TRAN 
( 
COL1 NUMBER(9), 
COL2 VARCHAR2(30), 
COL3 DATE 
) ON COMMIT PRESERVE ROWS 

/
INSERT INTO TEMP_TRAN VALUES(1,'D',sysdate); 

INSERT INTO TEMP_TRAN VALUES(2,'I',sysdate); 

INSERT INTO TEMP_TRAN VALUES(3,'s',sysdate); 

COMMIT;
end;
Error at line 1
ORA-00955: name is already used by an existing object

Script Terminated on line 1.

TEMP_TRAN を削除しようとすると、テーブルが存在しないと表示されます。したがって、システムには TEMP_TRAN テーブルが存在しません。なぜこのエラーが発生するのですか? このストアド プロシージャを作成するために TOAD を使用しています。

どんな助けでも大歓迎です。

4

3 に答える 3

8

グローバル一時テーブルは、ストアドプロシージャによって「オンザフライ」で作成されることを意図したものではありません。これらは、他のテーブルと同様に、永続的に1回作成されます。テーブルオブジェクトではなく、一時的なデータです。

TEMP_TRANに関しては、おそらくその名前のオブジェクトが存在しますが、テーブルではありませんか?これを試して:

select * from all_objects where object_name = 'TEMP_TRAN';
于 2010-04-22T15:39:56.423 に答える
1
IF v_Exists = 1 THEN
    EXECUTE IMMEDIATE "DROP TABLE TEMP_TRAN";
ENDIF

この手順の唯一の問題は、探しているテーブルが存在しない場合、データが見つからないというエラーで問題が発生し、v が存在するかどうかをチェックする行にさえ進まないことです。:)

于 2011-11-30T18:47:21.463 に答える
0

このクエリを試しましたか?

select * from all_tables where table_name like '%TEMP_TRAN%'

もしそうなら、表はリストされていますか?

もう1つの方法は、EXECUTEIMMEDIATEステートメントを使用することです。

CREATE OR REPLACE PROCEDURE P_TEST005 AS
v_Exists NUMBER;
BEGIN
    v_Exists := 0;
    SELECT 1 INTO v_Exists
        FROM ALL_TABLES
        WHERE TABLE_NAME LIKE '%TEMP_TRAN%';

    IF v_Exists = 1 THEN
        EXECUTE IMMEDIATE "DROP TABLE TEMP_TRAN";
    ENDIF

    EXECUTE IMMEDIATE 
        "CREATE GLOBAL TEMPORARY TABLE TEMP_TRAN (
            COL1 NUMBER(9), 
            COL2 VARCHAR2(30), 
            COL3 DATE
        ) ON COMMIT PRESERVE ROWS"

    EXCEPTION
        WHEN OTHERS THEN 
            NULL;
END;

私のさびたオラクルのスキルを考えてみてください。私は約2年間Oracleと仕事をしていません。しかし、それを回避すれば、自分がやろうとしていることを達成できるかもしれません。

ただし、一時テーブルは手続き的に削除されるのではなく、通常のテーブルと同じように存在することを意図していることに同意します。

于 2010-04-22T15:40:57.930 に答える