ORACLE: мы можем создать глобальные временные таблицы или любые таблицы в хранимых процессах? - PullRequest
0 голосов
/ 22 апреля 2010

ниже хранится процедура, которую я написал:

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 для создания этого хранимого процесса.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

7 голосов
/ 22 апреля 2010

Глобальные временные таблицы не предназначены для создания «на лету» с помощью хранимых процедур. Они должны быть созданы один раз, навсегда, как любая другая таблица. Это временные данные, а не объект таблицы.

Что касается TEMP_TRAN, возможно, объект с таким именем существует, но не является ли таблицей ? Попробуйте это:

select * from all_objects where object_name = 'TEMP_TRAN';
1 голос
/ 30 ноября 2011
IF v_Exists = 1 THEN
    EXECUTE IMMEDIATE "DROP TABLE TEMP_TRAN";
ENDIF

единственная проблема с этой процедурой в том, что когда таблица, которую вы ищете, не существует затем начались проблемы с ошибкой при отсутствии данных, и вы даже не попадете в эту строку эта проверка для v существует значение. :)

0 голосов
/ 22 апреля 2010

Вы пробовали этот запрос?

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

Если да, указана ли таблица?

Другой способ - использовать инструкцию EXECUTE IMMEDIATE.

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;

Пожалуйста, рассмотрите мои ржавые навыки Oracle. Я не работал с Oracle около 2 лет. Но если вы обойдете это, вы можете достичь того, что пытаетесь сделать.

Однако я согласен, что временная таблица не предназначена для процедурного удаления, а скорее существует как обычная таблица.

...