Oracle: Можем ли мы создать глобальные таблицы TEMP или любые таблицы в сохраненном ProC?

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

  •  01-10-2019
  •  | 
  •  

Вопрос

Ниже приведен хранимые процессы, которые я писал:

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, чтобы создать этот хранимый состав.

Любая помощь будет высоко ценится.

Это было полезно?

Решение

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

Относительно temp_tran, возможно, объект из этого имени существует, но не является стол? Попробуй это:

select * from all_objects where object_name = 'TEMP_TRAN';

Другие советы

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

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

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

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;

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top