2012-02-01 25 views
1

我想用我写的一些智能程序,但不能存储它们。例如,下面是这个相当大的选择,检索该主键的表:如何创建oracle程序但不能存储

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. 

...所以我可以声明和命令行定义你好功能。我可以在声明之后从begin - end块中调用它,但在此之后,hello过程消失了。

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

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

+1

您可以创建另一个架构并将您的程序放在那里。将不会污染生产用户... – 2012-02-01 10:41:20

+1

您正在开发的prod数据库:) – 2012-02-01 10:42:28

+0

好吧,它不是刺激,但许多其他开发人员使用它,并不希望污染它。 – torbatamas 2012-02-01 10:54:04

回答

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所掌握的,但是通过位置参数来消除每次编辑文件的需要。

+0

这就是我想了!丹克:) – torbatamas 2012-02-01 11:16:09

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 2012-02-01 10:59:31