2013-09-19 3 views
0

Я новичок в Oracle Sql и облицовочный вопрос:Oracle Sql: Процедура, которая может создавать временные таблицы внутри него

Я хочу, чтобы создать временную таблицу внутри процедуры.

LIKE:

CREATE PROCEDURE P 
    AS 
    BEGIN 
    CREATE TEMPORARY TABLE A(ID int); 
    END P; 

НО ЭТО ДАЕТ МНЕ ОШИБКУ

Как я могу создать временную таблицу внутри процедуры.

Я видел другие ответы на stackoverflow, но это не отвечает на мой вопрос правильно Не могли бы вы помочь мне?

+1

Возможного дубликат [как к создать-и-потребительный временный стол-в-оракул хранимой процедуры] (HTTP: // StackOverflow. com/questions/9310860/how-to-create-and-use-tempor-table-in-oracle-stored-procedure) – tbone

+0

И зачем вы хотите создать временную таблицу внутри процедуры? –

+1

Я думаю, что то, что вы хотите, это нечто вроде размещения 'CREATE GLOBAL TEMPORARY TABLE A (ID INT) ON COMMIT DELETE ROWS' вне процедуры. Он будет специфичным для сеанса и будет очищен при каждой фиксации. –

ответ

3

Вы можете использовать динамический SQL с EXECUTE IMMEDIATE:

CREATE OR REPLACE 
PROCEDURE p 
AS 
BEGIN 
    EXECUTE IMMEDIATE 'CREATE TEMPORARY TABLE A(id NUMBER)...etc'; 
END p; 

Edit: Очевидно, что вы должны будете обеспечить ваш синтаксис правилен внутри EXECUTE IMMEDIATE заявления.

Надеюсь, это поможет.

+0

-1 Не полезно помогать кому-то стрелять в ногу :) –

+4

Это то, что они действительно хотят делать. Люди задают вопросы здесь по разным причинам, на которые я ответил на заданный вопрос. Сдвиг - это отражение вашей интерпретации их причины, лежащей в основе вопроса, а не ответа на реальный вопрос. – Ollie

+0

Нет, нисходящая линия связана с тем, насколько полезен ответ, ни больше, ни меньше. Существует призыв к суждению - иногда вполне нормально отвечать буквально, даже если подход, который делается, не самый лучший способ; но в других случаях (например, этот) вам нужно помочь OP понять, что они находятся на совершенно неправильном курсе. Даже если это сказать «вот как вы можете это сделать, но вы, скорее всего, не должны, потому что ...» –

7

Почему вы хотите создать временную таблицу в хранимой процедуре в первую очередь?

Общепринято создавать временные таблицы в других базах данных (например, SQL Server и MySQL). Очень очень редко можно сделать то же самое в Oracle. Почти в каждом случае, когда у вас возникает соблазн создать временную таблицу в Oracle, есть лучший архитектурный подход. В стеке DBA есть поток, который обсуждает alternatives to temporary tables и почему они вообще не нужны в Oracle.

Программный, вы можете создавать объекты с использованием динамического SQL

CREATE OR REPLACE PROCEDURE dont_do_this 
AS 
BEGIN 
    EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE a(id INTEGER)'; 
END; 

При создании временной таблицы динамически, однако, все ссылки на эту таблицу также должны быть с помощью динамического SQL-- не будешь в состоянии написать простые операторы SELECT против таблицы. И определение временной таблицы в Oracle является глобальным, поэтому оно видимо для каждого сеанса. Если у вас есть два разных сеанса, которые пытаются создать одну и ту же таблицу, второй сеанс получит ошибку. Если вы ожидаете, что таблица будет иметь другое определение в разных сеансах, у вас будет еще больше проблем.

+0

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

+0

@ManishSharma - Если таблица существует, вы можете ссылаться на нее в PL/SQL напрямую. Но если возможно, что таблица не существует (какой она должна быть, если какая-то другая процедура ее создает), тогда вам нужно использовать динамический SQL для ссылки на таблицу, иначе ваш блок PL/SQL не сможет скомпилироваться. –

1

Вы должны объявить процедуру, как:

create or replace PROCEDURE MYPROCEDURE AUTHID CURRENT_USER IS 

script varchar(4000); 

BEGIN 

script:= 'CREATE GLOBAL TEMPORARY TABLE BNMCODIAGNOSTICASSOCIE_TEMP 
ON COMMIT PRESERVE ROWS 
as select ........'; 

EXECUTE IMMEDIATE script; 

commit; 

END; 
Смежные вопросы