Oracle中的存储过程和独立过程有什么区别?

时间:2015-07-08 07:28:49

标签: oracle stored-procedures plsql

立法程序

create procedure proc1
(
begin

end;
)

存储过程

create package pkg1
(
procedure proc2
begin

end;
)

2 个答案:

答案 0 :(得分:4)

这些都是存储过程,因为它们都存储在数据库中,以后可以调用。

将程序放在包中只是组织它们的一种巧妙方法。它有助于记住一起更新所有相关程序,保持创建脚本整洁等。主要功能区别在于能够授予和撤销整个包的权限,而不必管理十几个独立的" #34;程序独立。

答案 1 :(得分:3)

来自CREATE PROCEDURE

的oracle文档
  

独立程序是存储在数据库中的程序(执行特定操作的子程序)。

nested procedure是PL / SQL块或包中的过程。

来自CREATE PACKAGE文档:

  

CREATE PACKAGE语句创建或替换存储包的规范,存储包是数据库中作为一个单元存储的相关过程,函数和其他程序对象的封装集合。包规范声明了这些对象。随后指定的包体定义了这些对象。

嵌套在包中的独立过程和过程都存储(编译)在数据库中 - 因此是“存储”过程。匿名PL / SQL块中定义的过程不是“存储”过程。

这不是存储过程:

DECLARE
  n NUMBER := 1;

  PROCEDURE incr( a IN OUT NUMBER ) IS
  BEGIN
    a := a + 1;
  END;
BEGIN
  incr(n);
  DBMS_OUTPUT.PUT_LINE(n);
END;
/

包和独立过程中的嵌套过程之间没有太大的区别:

  • 使用CREATE PROCEDURE ...定义独立过程,而使用PROCEDURE ...在PL / SQL块中定义嵌套过程。
  • 独立过程总是需要一个过程定义(AS BEGIN ... END;部分),但是一个包中的(公共)嵌套过程只声明过程标题(PROCEDURE NAME(...)部分)然后在包体中将重述标题并定义程序定义。
  • 将过程嵌套在一个包中允许它与类似的功能组合在一起,并允许它访问包的私有函数,过程和数据(即在包体中定义但不在公共包规范中定义)。 / LI>