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

博客介绍了存储过程和函数的相关知识。存储过程参数模式有IN、OUT、IN OUT,不同模式有不同特点和使用规则。函数创建与存储过程类似,但有显示返回值,创建时用is或as代替declare,且必须有返回值,一般不执行DML操作。

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

存储过程

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

  1. IN(默认参数模式):表示当存储过程别调用时,实参值被传递给形参;形参起变量作用,只能该参数,而不能修改该参数。IN模式参数可以是变量或表达式。
  2. OUT:表示当存储过程被调用时,实参值被忽略;形参起未初始化的PL/SQL变量的作用,形参的初始值为NULL,可以进行读/写操作,在存储过程调用结束后,形参值被给实参。OUT模式参数只能是变量,不能是常量或表达式。
  3. IN OUT表示当存储过程被调用时,形参值被传递给形参。形参起已初始化的PL/SQL变量的作用,可读可写。IN OUT 模式参数只能是变量,不能是常量或表达式。
  4. 使用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) 
 is
begin
  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,theName,theSalary,theMessage);--输入员工id
    dbms_output.put_line('ID为:'||theId||'的员工,名字为'||theName
                          ||', 收入为'||theSalary||','||theMessage); 
end;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值