您的位置:首页 > 数据库 > Oracle

Oracle--plsql创建存储过程

2012-03-29 19:29 330 查看
子程序的介绍:

•命名的
PL/SQL 块,能够接受传递的参数,能够被调用。
•子程序的类型

过程:用于执行某项操作

函数:用于执行某项操作并返回值

•基于标准的PL/SQL块结构
声明部分

可执行部分

异常部分(可选)

优点:

–模块化

将程序分解为多个逻辑模块

–可重用性
子程序在被执行之后,被存储在数据库中,可以在任意数目的

应用程序中使用

–可维护性
子程序简化了维护

–提高性能

用户直接使用共享池中解析后的程序

存储过程:

•命名的PL/SQL块
•能够接受参数
•能够被重复调用
•用于执行某项操作
•存储在数据库中

形式参数与实际参数

形式参数:在子程序说明的参数列表中声明的变量

CREATEPROCEDURE raise_sal(

p_idNUMBER, p_amount NUMBER)

...

ENDraise_sal;

•实际参数:在子程序被调用的参数列表中引用的变量或表达式

raise_sal(v_id,2000)

创建带参数的过程






参数模式IN 是默认的参数模式。换句话说,如果未指定一个参数的模式,该参数就被认为是一个 IN 参数。参数模式 OUT和 IN OUT 必须在参数的前面被明确指定。

一个IN 模式的形式参数不能被指定一个值,就是说,一个在过程体中的 IN 参数不能被修改。

一个OUT 或 IN OUT 参数在返回主叫环境之前必须被指定一个值。

IN参数可以在参数列表中被指定一个默认值。OUT 和 INOUT 参数不能被指定默认值。

默认情况下IN 参数是引用传递,而 OUT 和 IN OUT 参数是值传递。

create  or replace  procedure raise_sal
(p_id   in emp.empno%type,
p_name out  varchar2,
p_sal  out   number)
Is
begin
select sal,ename into p_sal,p_name
from emp
where  empno = p_id;
end raise_sal;


DECLARE
v_sal	emp.sal%type;
v_name  emp.ename%type;
BEGIN
raise_sal(7369,v_sal,v_name);
dbms_output.put_line('雇员:'||v_name||'的薪水是 '||v_sal);
END;


声明主机变量,执行raise_sal过程

VARIABLE g_sal NUMBER
VARIABLE g_name VARCHAR2(25)
EXEC raise_sal(7369,:g_name,:g_sal)


用 VARIABLE命令创建主机变量。

调用 raise_sal过程,提供这些主机变量作为 OUT 参数。

在 EXECUTE命令中引用主机变量时,注意冒号 (:) 的使用。

传递参数的方法

•位置:实际参数与形式参数排列的顺序相同
•指定:实际参数联合其相应的形式参数以任意顺序排列
•组合:实际参数的排列一些用位置,一些用指定
CREATE OR REPLACE PROCEDURE raise_sal
(p_id 	IN 	  emp.empno%type default 7369,
p_name	OUT	  varchar2 ,
p_sal	IN OUT  number )
IS
BEGIN
UPDATE emp
SET   sal = sal + p_sal
WHERE empno = p_id;

SELECT sal,ename INTO p_sal,p_name
FROM   emp
WHERE  empno = p_id;
END raise_sal;


异常处理:

当一个异常发生时,控制立即转向块的异常部分。如果异常被处理,块终止运行,并且控制转向主叫程序。

CREATE OR REPLACE PROCEDURE test1
IS
v_deptno 		 dept.deptno%type;
BEGIN
insert into dept values(60,'nuc','kitty');
select deptno into v_deptno from dept
where deptno=99;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('内部执行的异常');
END;

CREATE OR REPLACE PROCEDURE test
IS
BEGIN
insert into dept values(70,'micro','NEW YORK');
test1();
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('外部执行的异常');
END;


删除存储在数据库中的过程

DROP PROCEDURE procedure_name

权限授予:

•为了能够在子程序中引用和访问不同方案中对象,必须被明确地授予

访问引用对象的权限,不能通过角色授权。

PLSQL对象信息存储:

通过以下方法查看PL/SQL对象的存储信息:

–user_objects
–user_source
–desc object_name
–show err
–dbms_output
通过user_objects视图查看PL/SQL对象的信息;

通过user_source视图查看PL/SQL对象的程序文本;

desc查看对象的结构;

showerr查看对象在编译过程中出现的错误;

通过dbms_output包查看PL/SQL对象的调试信息;

USER_OBJECTS:



SELECT object_name, object_type,status
FROM user_objects
WHERE object_type in ('PROCEDURE','FUNCTION')
ORDER BY object_name;


USER_SOURCE:



SELECT text
FROM   user_source
WHERE  name='GET_SAL'
ORDER BY line;


USER_ERROR:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: