首页 文章

如何创建oracle程序但不存储

提问于
浏览
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.

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

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

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

2 回答

  • 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所获得的,但是使用位置参数来消除每次编辑文件的需要 .

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

相关问题