Oracle:グローバルな温度テーブルまたは保存されたProcでテーブルを作成できますか?
質問
以下は私が書いた保存された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年間働いていません。しかし、あなたがそれを回避するなら、あなたはあなたがやろうとしていることを達成するかもしれません。
ただし、一時的なテーブルは手続き的にドロップされることを意図しているのではなく、通常のテーブルのように存在することを意図していることに同意します。
所属していません StackOverflow