Как создавать оракулы, а не хранить - PullRequest
1 голос
/ 01 февраля 2012

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

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;

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

Так вот, где я сейчас нахожусь:

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.

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

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

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

Ответы [ 2 ]

3 голосов
/ 01 февраля 2012

Вы можете поместить каждый из ваших запросов (действительно ли они выполняются?) В отдельный файл в вашем каталоге 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, но с позиционным параметром, который устранял необходимость каждый раз редактировать файл.

3 голосов
/ 01 февраля 2012

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

--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.
...