Oracle  创建存储过程
创建存储过程之前,先来看一下创建存储过程的语法结构。定义存储过程的语法如下:
create procedure procedure_name [(parameter[,parameter,...])] is
[local declarations]
begin
  execute statements
[exception
  exception handlers ]
end [procedure _name]
从存储过程的语法中可以看出,创建存储过程与创建匿名程序块非常类似。存储过程也包括三
部分:声明部、执行部和异常处理部。执行部和异常处理部与匿名程序块相同,不同之外是存储过程中不能使用DECLARE关键字表示声明部。存储过程使用PROCEDURE关键字表示创建存储过程,并为存储过程指定名称和参数。在指定参数的类型时,也不能指定参数类型的长度。IS关键字后声明的变量为过程体内的局部变量,它们只能被存储过程内部使用。
根据上面的语法规则,先来创建一个最简单的存储过程。代码如下:
SQL> create procedure sample_proc is
oracle手动调用存储过程
  2  begin
  3    null;
  4  end sample_proc;
  5  /
过程已创建。
对于这个简单的存储过程,在成功编译后,用户就可以调用和运行它。虽然它的过程体内只有一个不处理任何命令的NULL语句,但它是一个正确的存储过程。
当用户需要在某个用户模式中重新定义存储过程时,由于该存储过程已经被存储在数据库中,所以重新定义存储过程的操作将失败。下面将重新定义前面的存储过程,让它完成打印Hello World字符:
SQL> create procedure sample_proc is
  2  begin
  3    dbms_output.put_line('Hello World');
  4  end sample_proc;
  5  /
create procedure sample_proc is
                *
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用
为了重新定义存储过程,可以在CREATE PROCEDURE语句中使用OR REPLACE选项,使新版本覆盖旧版本的存储过程。
SQL> create or replace procedure sample_proc is
  2  begin
  3    dbms_output.put_line('Hello World');
  4  end sample_proc;
  5  /
过程已创建。
创建存储过程后,用户就调用该存储过程。用户可以在PL/SQL程序块中调用存储过程,也可以在直接在SQL*Plus中使用EXECUTE语句调用存储过程。例如,下面的代码将在一个匿名块中调用存储过程SAMPLE_PROC。
SQL> set serverout on
SQL> begin
  2    sample_proc;
  3  end;
  4  /
Hello World
PL/SQL 过程已成功完成。
在该匿名程序块中,可以直接在BEGIN-END部使用过程名调用存储过程SAMPLE_PROC。
在SQL*Plus使用EXECUTE语句直接调用存储过程的形式如下:
SQL> execute sample_proc;
Hello World
PL/SQL 过程已成功完成。
也可以采用简写形式:
SQL>exec sample_proc;
如果在创建存储过程时出现了错误,则可以使用SHOW ERRORS命令显示创建时所产生的错误。例如,修改存储过程SAMPLE_PROC,省略输出语句的引号,则在编译时会出现如下的错误:
SQL> create or replace procedure sample_proc is
  2  begin
  3    dbms_output.put_line(Hello World);
  4  end sample_proc;
  5  /
警告: 创建的过程带有编译错误。
为了查看错误的详细信息,可以随后输入SHOW ERROR命令显示错误信息:
SQL> show error
PROCEDURE SAMPLE_PROC 出现错误:
LINE/COL ERROR
-------- -------------------------------------------------------------
3/30    PLS-00103: 出现符号 "WORLD"在需要下列之一时:
        . ( ) , * @ % & = - + < /
        > at in is mod remainder not rem => <an exponent (**)>
        <> or != or ~= >= <= <> and or like like2 like4 likec as
        between from using || multiset member submultiset
        符号 "." 被替换为 "WORLD" 后继续。
产生该错误的原因是因为在输出语句中省略了表示字符的引号,使系统误以为该字符为变量。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。