2014-05-06 6 views
0

В настоящее время я занимаюсь серьезным программированием PL/SQL. Формат для создания процедурPL/SQL CREATE ИЛИ REPLACE PROCEDURE Использование инструкции CREATE TABLE

[CREATE [OR REPLACE]] 
    PROCEDURE procedure_name[(parameter[, parameter]...)] 
[AUTHID {DEFINER | CURRENT_USER}] {IS | AS} 
    [PRAGMA AUTONOMOUS_TRANSACTION;] 
    [local declarations] 
BEGIN 
    executable statements 
[EXCEPTION 
    exception handlers] 
END [name]; 

и я помещаю executable statements под BEGIN. Почему мне не разрешено размещать оператор CREATE TABLE в качестве исполняемого заявления в рамках процедуры?

ответ

1

Поскольку CREATE TABLE является оператором DDL, и вы не можете выполнять DDL-инструкции из PL/SQL (по крайней мере, не напрямую).

Если (и это большая если) вы действительно должны сделать это, вы можете использовать либо DBMS_SQL пакет или EXECUTE IMMEDIATE (проще):

create or replace procedure do_it as 
begin 
    execute immediate 'CREATE TABLE foo(pk number not null)'; 
end; 

Но это, как правило, не требуется. Люди, идущие с фона SQL Server, часто обучаются созданию множества временных таблиц из своих хранимых процедур - в Oracle вы обычно используете для этого глобальную временную таблицу.

+0

Вы предлагаете мне не хранить хранимую процедуру? Если бы мне захотелось даже этого, я мог бы сделать это и быть верным да? – Mushy

+0

Я предлагаю, если вы когда-нибудь почувствуете необходимость выполнять DDL-инструкции из хранимой процедуры, вы должны задать вопрос, действительно ли это необходимо. Для этого существуют допустимые варианты использования, но, по моему опыту, они довольно редки. Хранимые процедуры сами по себе хороши - пакеты ИМХО еще лучше. –

+0

Вы хотите представить простой, но элегантный пример пакета? Я использую книгу программирования PL/SQL для чтения в Пакетах, но хотел бы видеть хороший пример. – Mushy

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