如何创建oracle程序但不存储

时间:2012-02-01 10:34:19

标签: sql oracle procedure

我想使用我写的一些智能程序,但不能存储它们。例如,这是一个非常大的选择,它检索表的主键:

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.

...所以我可以从命令行声明和定义hello函数。我可以在声明之后从开始 - 结束块调用它,但之后hello过程就消失了。

问题:是否有解决方案使第二个“你好”;工作,所以我可以创建聪明有用的程序,而不是在数据库本身做任何垃圾?

如果这样可行,我会用它创建一个文件,并使sqlplus的别名在启动时执行该文件。

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:3)

您可以将每个查询(它们真的是procs?)放在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所做的,但是使用位置参数来消除每次编辑文件的需要。