2017-02-11 137 views
0

我在Oracle中创建存储过程,其中一个是永久创建的,另一个是在服务其目的后暂时创建并消失。如何使用它,请指导您何时使用以及如何使用它创建。临时和永久存储过程

----这不是在DB创建的,只是暂时创建,消失

DECLARE name varchar2(10); 
PROCEDURE printVal (name varchar2) IS 
BEGIN 
    dbms_output.put_line ('name:' || name); 
END; 
BEGIN 
    name := 'Joe'; 
    printVal(name); 
END; 
/

----这在DB创建永久可用

create PROCEDURE printVal (name varchar2) IS 
BEGIN 
    dbms_output.put_line ('name:' || name); 
END; 
+0

我认为你是困惑,因为第一个匿名块包含PL/SQL [子程序](https://docs.oracle.com/cloud/latest /db112/LNPLS/subprograms.htm#LNPLS008),它定义了名称(printVal)。但是因为它存在于匿名块中,所以它不存储在数据库中。 – tbone

+0

感谢您的答复和答案。 – sunleo

回答

4

了解,在两个部分划分您的SQL。

存储过程:

  • 存储过程都存储在数据库中。
  • 我们可以调用存储过程创建之后的任何时间。
  • 存储过程还支持输入输出参数。

匿名块:

  • 这些是未命名的PL/SQL块。
  • 匿名块不存储在数据库中。
  • 不能通过paramters

---------- Stored Procedure Start-------- 

DECLARE name varchar2(10); 
PROCEDURE printVal (name varchar2) IS 
BEGIN 
    dbms_output.put_line ('name:' || name); 
END; 
--------- Stored Procedure End----------- 

----------anonymous block Start---------- 
BEGIN 
    name := 'Joe'; 
    printVal(name); 
END; 
/
----------anonymous block end ------------ 
+0

你的意思是不能传递参数?在我的第一个例子中,我们将价值传递给SP临时创建。 – sunleo

+0

“无法传递参数” - 我的意思是我们无法在匿名块中定义输入输出参数,就像我们在存储过程中定义的那样。 – Tajinder

+0

该示例中的程序不被存储,所以它不是一个存储过程。另外值得一提的是,只有一些客户端工具需要'/'字符来指示输入结束和执行指令,而不是PL/SQL语言的一部分。 –