ORACLE: podemos crear tablas temporales globales o cualquier tablas de procedimiento almacenado?

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

  •  01-10-2019
  •  | 
  •  

Pregunta

a continuación es el procedimiento almacenado que escribí:

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;

cuando lo ejecuté, me sale un mensaje de error mencionar:

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.

He intentado dejar caer el TEMP_TRAN y dice tabla no existe. Por lo tanto no hay una mesa TEMP_TRAN existido en el sistema. ¿por qué estoy consiguiendo este error? Estoy usando SAPO para crear esta proc almacenado.

Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

Las tablas temporales globales no están destinados a ser creado "sobre la marcha" mediante procedimientos almacenados. Ellos se van a crear una vez, de forma permanente, como cualquier otra tabla. Se trata de los datos que es temporal, no el objeto de tabla.

En cuanto a TEMP_TRAN, tal vez un objetivo de que existe ese nombre, pero no es un tabla ? Prueba esto:

select * from all_objects where object_name = 'TEMP_TRAN';

Otros consejos

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

El único problema con este procedimiento es que cuando la mesa está buscando no existe entonces comenzaron los problemas con ningún dato se encuentra el error y ni siquiera se meterá en esa línea El registro de entrada para v existe valor. :)

¿Usted ha intentado esta consulta?

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

Si es así, es la tabla en la lista?

Otra forma de hacerlo es mediante la instrucción 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;

Por favor, considere mis conocimientos de Oracle oxidados. No he trabajado con Oracle durante unos 2 años. Pero si usted trabaja su manera alrededor de ella, es posible lograr lo que estamos tratando de hacer.

Sin embargo, estoy de acuerdo en que una tabla temporal no está destinado a ser dejado caer procedurely, pero en lugar de existir como una mesa normal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top