加入收藏 | 设为首页 | 会员中心 | 我要投稿 湘西站长网 (https://www.0743zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Oracle————存储过程与函数

发布时间:2021-02-28 01:05:24 所属栏目:站长百科 来源:网络整理
导读:存储过程 存储过程参数模式包括IN、OUT、 IN OUT。 IN(默认参数模式):表示当存储过程别调用时,实参值被传递给形参;形参起变量作用,只能读该参数,而不能修改该参数。IN模式参数可以是变量或表达式。 OUT:表示当存储过程被调用时,实参值被忽略;形参起

存储过程
存储过程参数模式包括IN、OUT、 IN OUT。

IN(默认参数模式):表示当存储过程别调用时,实参值被传递给形参;形参起变量作用,只能读该参数,而不能修改该参数。IN模式参数可以是变量或表达式。
OUT:表示当存储过程被调用时,实参值被忽略;形参起未初始化的PL/SQL变量的作用,形参的初始值为NULL,可以进行读/写操作,在存储过程调用结束后,形参值被给实参。OUT模式参数只能是变量,不能是常量或表达式。
IN OUT表示当存储过程被调用时,形参值被传递给形参。形参起已初始化的PL/SQL变量的作用,可读可写。IN OUT 模式参数只能是变量,不能是常量或表达式。
使用OUT、IN OUT模式参数时只有当程序正常结束时形参值才会传递给实参。
举例:

create or replace procedure proc_divide
(num1 in out number,num2 in out number) is
r1 number;
r2 number;
begin
r1:=trunc(num1/num2);
r2:=mod(num1,num2);
num1 := r1;
num2 := r2;

exception
when zero_divide then
dbms_output.put_line(‘除法中分母不能为零‘);
when others then
dbms_output.put_line(‘程序运行错误!请使用游标‘);
end proc_divide;

set serveroutput on
declare
n1 number:=&n1;
n2 number:=&n2;
begin
proc_divide(n1,n2);
dbms_output.put_line(‘两个数字相除的结果是:‘||n1);
dbms_output.put_line(‘取余的结果是:‘||n2);
end;
函数
(1)函数的创建与存储过程的创建相似,不同之处在于,函数有一个显示的返回值。

(2)在函数的创建过程中没有declare关键字,而是使用is或者as关键字来代替。

(3)函数必须有返回值:return datatype。

(4)一般不在函数中执行 DML(数据操纵语言-插入、删除、更新)操作。

?

举例:存储过程调用函数

--函数 increaseSalary()create or replace function increaseSalary(theIncome in number) return varchar2 as theMessage varchar2(50); begin if theIncome <=4000 then theMessage := ‘收入太低,工资增加10%‘; elsif theIncome <=8000 then theMessage := ‘收入偏低,工资增加5%‘; elsif theIncome <=20000 then theMessage := ‘收入一般,工资增加2%‘; else theMessage := ‘收入很高,工资增加1%‘; end if; return theMessage; end;--存储过程create or replace procedure getEmpInfo (theId in out employees.employee_id%type,theName out employees.first_name%type,theSalary out employees.salary%type,theMessage out varchar2) isbegin select employee_id,first_name,salary,increaseSalary(salary) into theId,theName,theSalary,theMessage from employees where employee_id = theId; exception when NO_DATA_FOUND then dbms_output.put_line(‘没有该员工信息‘); end; set serveroutput on ;declare theId employees.employee_id%type:=&theId; theName employees.first_name%type; theSalary employees.salary%type; theMessage varchar2(50);begin getEmpInfo(&theId,theMessage);--输入员工id dbms_output.put_line(‘ID为:‘||theId||‘的员工,名字为‘||theName ||‘,收入为‘||theSalary||‘,‘||theMessage); end; ---------------------?

(编辑:湘西站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读