2012-02-01 2 views
1

Я хочу использовать некоторые умные процедуры, которые я написал, но не хранил их. Например вот это довольно большой выбор, который извлекает первичные ключи для таблицы:Как создать процедуры оракула, но не хранить

SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner 
FROM all_constraints cons, all_cons_columns cols 
WHERE cols.table_name = 'TABLE_NAME' 
AND cons.constraint_type = 'P' 
AND cons.constraint_name = cols.constraint_name 
AND cons.owner = cols.owner 
ORDER BY cols.table_name, cols.position; 

Я не хочу, чтобы помнить об этом, даже не вводить его каждый раз, когда мне нужно ограничения таблицы. НО я не хочу создавать процедуру для этого в БД, потому что это база данных prod, и никто другой не нуждается в моей процедуре. Только я. Просто для развития.

Так вот где я сейчас:

SQL> declare procedure hello as begin dbms_output.put_line('Hello world!'); end; begin hello; end; 
    2/
Hello world! 

PL/SQL procedure successfully completed. 

SQL> hello; 
SP2-0042: unknown command "hello" - rest of line ignored. 

... так что я могу объявить и определить функцию привет из командной строки. Я могу вызвать его из начального блока после объявления, но после этого процедура привет исчезла.

Вопрос: есть ли решение сделать второй «привет»; работать, поэтому я могу создавать умные и полезные процедуры и не создавать мусор в самой базе данных?

Если это сработает, я создам файл с этим и сделаю псевдоним для sqlplus для запуска этого файла при запуске.

+1

вы можете создать другую схему и поместить туда свои процедуры. не будет оглашать производственного пользователя .... –

+1

вы разрабатываете на prod DB :) –

+0

хорошо, это не prod, но многие другие разработчики используют его, и нежелательно его загрязнять. – torbatamas

ответ

3

Вы можете поместить каждый из ваших запросов (они на самом деле прок?) в своем собственном файле в вашем каталоге SQLPATH, но с позиционными параметрами; например файл с именем pkeys.sql:

SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner 
FROM all_constraints cons, all_cons_columns cols 
WHERE cols.table_name = '&1' 
AND cons.constraint_type = 'P' 
AND cons.constraint_name = cols.constraint_name 
AND cons.owner = cols.owner 
ORDER BY cols.table_name, cols.position; 

От SQL * Plus вы можете просто сделать:

@pkeys TABLE_NAME 

Если это процедура, которую вы все равно можете иметь свой declare procedure ... begin ... end форму, и имеют пропуск вызовов &1 к процедура. Фактически, это в значительной степени то, что StevieG получал, но с параметром positional, чтобы удалить необходимость редактировать файл каждый раз.

+0

вот что Я хотел! danke :) – torbatamas

3

Вы можете поместить эту процедуру в файл сценария и запустить ее из командной строки с помощью оператора @. Например

--c:\temp\helloworld.sql 

begin 
    dbms_output.put_line('Hello World'); 
end; 
/

затем войти в базу данных и выполните команду:

SQL> set serveroutput on 
SQL> @c:\temp\helloworld 

и вы должны получить:

Hello World 

PL/SQL procedure successfully completed. 
+0

Я подумал об этом, но я все еще не могу использовать процедуру 'hello' из командной строки и должен отредактировать helloworld.sql в текстовом редакторе, а затем @c: \ temp \ helloworld ... – torbatamas

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