Oracle:グローバルな温度テーブルまたは保存されたProcでテーブルを作成できますか?

StackOverflow https://stackoverflow.com/questions/2692140

  •  01-10-2019
  •  | 
  •  

質問

以下は私が書いた保存されたProcです:

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テーブルが存在しませんでした。なぜこのエラーが発生しているのですか?私はこの保存されたProcを作成するためにToadを使用しています。

どんな助けも高く評価されます。

役に立ちましたか?

解決

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

temp_tranに関しては、おそらく 物体 その名前は存在しますが、そうではありません テーブル?これを試して:

select * from all_objects where object_name = 'TEMP_TRAN';

他のヒント

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

この手順の唯一の問題は、探しているテーブルが存在しない場合、データが見つかったエラーなしでトラブルが始まり、Vをチェックするその行にさえ入らないことです。 :)

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

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

もしそうなら、テーブルはリストされていますか?

別の方法は、即時ステートメントを実行することです。

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年間働いていません。しかし、あなたがそれを回避するなら、あなたはあなたがやろうとしていることを達成するかもしれません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top