Oracle存储过程及调用

本文详细介绍了Oracle存储过程的创建与维护方法,包括无参数、带输入参数、含输入输出参数及输入输出参数的过程示例,并提供了如何删除、查看状态、重新编译及查看过程代码的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.存储过程(PROCEDURE) 

CREATE [OR REPLACE] PROCEDURE procedure_name
(arg1 [model1] datatype1, arg2[model2] datatype2)
IS [AS]
PL/SQL Block;
arg1,arg2用于指定过程的参数,IS/AS用于开始一个PL/SQL块.当指定参数数据类型时,不能指定其长度.

在建立过程的时,既可以指定输入参数(IN),也可以指定输出参数(OUT)以及输入输出参数(IN OUT).

如果不定义参数模式,则默认为输入参数,

如果要定义输出参数,则需要指定OUT关键字,

如果定义输入输出参数,要指定IN OUT关键字.

set serveroutput on打开oracle的输出.


示例一:不带参数的过程
CREATE OR REPLACE PROCEDURE out_time--存储过程没有参数时,在存储过程名字后面不能有括号
IS--声明不使用DECLARE关键字
BEGIN   
dbms_output.put_line(systimestamp);
END;

调用如下: 

begin
out_time;
end;
或者
call out_time();
或者
SQL>exec out_time;--exec是sqlplus命令,只能在sqlplus命令窗口中使用;call为SQL命令,没有限制
注意:存储过程没有参数时,exec可以直接跟过程名(可以省略()),但call则必须带上(). 
示例二:带IN参数的过程
CREATE OR REPLACE PROCEDURE getSalary(eNo NUMBER)  --参数的数据类型不能指定长度
AS
salary emp.sal%TYPE;--salary数据类型和sal相同
BEGIN
SELECT SAL INTO salary  FROM EMP WHERE EMPNO=eNo;
DBMS_OUTPUT.PUT_LINE(eNo||'号员工的工资为'||salary);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
END;
调用如下:

BEGIN
getSalary(7788);
END;
或者
SQL> EXEC getSalary(7788); --exec是sqlplus命令,只能在sqlplus命令窗口中使用;还可以使用名称传递,使用=>符号来指定值 
如 SQL> exec getSalary(dno=>50)
CALL getSalary(7788);
示例三:创建含有输入和输出参数的存储过程
CREATE OR REPLACE PROCEDURE getSalary(eNo IN NUMBER,salary OUT NUMBER)
AS
BEGIN
SELECT SAL INTO salary  FROM EMP WHERE EMPNO=eNo;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
END;

当过程中含有输出参数时,调用时必须通过BEGIN  END块,不能通过EXEC或CALL调用。如:

DECLARE
salary NUMBER(7,2);
BEGIN
getSalary(7788,salary);
DBMS_OUTPUT.PUT_LINE(salary);
END;
或者必须定义变量接收输出参数的数据.调用实例:
SQL> var sal NUMBER;
SQL> exec query_employee(77,:sal);

示例四:创建参数类型既是输入参数也是输出参数的过程
CREATE OR REPLACE PROCEDURE getSalary(noSalary IN OUT NUMBER)
AS
BEGIN
SELECT SAL INTO noSalary FROM EMP WHERE EMPNO=noSalary;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
END;

调用如下:

DECLARE
no NUMBER(7,2);
BEGIN
no:=7788;
getSalary(no);
DBMS_OUTPUT.PUT_LINE(no);
END;

二、维护过程
1、删除存储过程
DROP PROCEDURE Proc_Name;
2、查看过程状态
SELECT object_name,status  FROM USER_OBJECTS WHERE object_type='PROCEDURE';
3、重新编译过程
ALTER PROCEDURE Proc_Name COMPILE;
4、查看过程代码
SELECT * FROM USER_SOURCE WHERE TYPE='PROCEDURE';

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值