我想使用我写的一些智能程序,但不能存储它们。例如,这是一个非常大的选择,它检索表的主键:
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的别名在启动时执行该文件。
答案 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所做的,但是使用位置参数来消除每次编辑文件的需要。