首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pl/sql编程---过程、函数、包

pl/sql编程---过程、函数、包

作者头像
微醺
发布2019-01-17 11:09:35
5120
发布2019-01-17 11:09:35
举报

1.注释

单行注释 --
	select * from emp where empno=7788; --取得员工信息
多行注释 /*...*/来划分

2.标志符号的命名规范

1).当定义变量时,建议用v_作为前缀v_sal
2).当定义常量时,建议用c_作为前缀c_rate
3).当定义游标时,建议用_cursor作为后缀emp_cursor
4).当定义例外时,建议用e_作为前缀e_error

3.块结构示意图

pl/sql块由三个部分构成:定义部分,执行部分,例外处理部分。
如下所示:
declare
/*定义部分——定义常量、变量、游标、例外、复杂数据类型*/
begin
/*执行部分——要执行的pl/sql语句和sql语句*/
exception
/*例外处理部分——处理运行的各种错误*/
end;
定义部分是从declare开始的,该部分是可选的;
执行部分是从begin开始的,该部分是必须的,至少要写null,不能不写;
例外处理部分是从exception开始的,该部分是可选的。
& 表示要接收从控制台输入的变量。

4.过程

过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out),
通过在过程中使用输入参数,可以将数据传递到执行部分;
通过使用输出参数,可以将执行部分的数据传递到应用环境。
在sqlplus中可以使用create procedure命令来建立过程。

--只有输入参数的存储过程
create or replace procedure proc01(eno number) --in 输入参数  out输出参数
as
begin
  update emp set sal = sal+500 where empno = eno;
   ---select sal into money from emp where empno=eno;
end proc01;
在oracle中调用存储过程:
第一种:call proc01(7654);
第二种:在plsql块中调用	
	SQL> begin
	  3  proc01(7654);
	  5  end;
	  6  /

–既有输入又有输出参数的存储过程

create or replace procedure proc02(eno in number,money out number) is
begin
  update emp set sal=sal+1000 where empno=eno;
  select sal into money from emp where empno=eno;
  commit;
  exception
	rollback;
end proc02;

在oracle中调用存储过程:

	SQL> set serveroutput on;
	SQL> declare money number;
	  2  begin
	  3  proc02(7654,money);
	  4  dbms_output.put_line(money);
	  5  end;
	  6  /

5.JAVA中调用存储过程

Java代码   
1.	CallableStatement cs = con.prepareCall("{call emp_pro(?,?)}");  
2.	//4.给?赋值  
3.	cs.setString(1,"SMITH");  
4.	cs.setInt(2,10);  
5.	//5.执行  
6.	cs.execute();  

6.函数

函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句。
而在函数体内必须包含return语句返回的数据。我们可以使用create function来建立函数,实际案例:
Sql代码   
1.	--编写函数 返回指定人员的年薪  
2.	create function annual_income(name varchar2)  
3.	return number is  
4.	annual_salary number(7, 2);  
5.	begin  
6.	  select sal*12 + nvl(comm, 0) into annual_salary from emp where ename = name;  
7.	  return annual_salary;  
8.	end;  
在sqlplus中调用函数
Sql代码   
1.	SQL> var income number  
2.	SQL> call annual_incomec('scott') into :income; --注意:和income之间不能有空白  
3.	SQL> print income  
同样我们可以在java程序中调用该函数 select annual_income('SCOTT') from dual;

7.包

包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成。
1).我们可以使用create package命令来创建包。
Sql代码   
1.	--使用create package命令创建包  
2.	create package pkg_sal is  
3.	  procedure update_sal(name varchar2, new_sal number);  
4.	  function annual_income(name varchar2) return number;  
5.	end;  
包的规范只包含了过程和函数的说明,但是没有过程和函数的实现代码。包体用于实现包规范中的过程和函数。
2).建立包体可以使用create package body命令
Sql代码   
1.	--使用create package body创建包体  
2.	create or replace package body pkg_sal is  
3.	  procedure update_sal(name varchar2, new_sal number) is  
4.	    begin  
5.	      update emp set sal = new_sal where ename = name;  
6.	    end;  
7.	  function annual_income(name varchar2) return number is  
8.	    income number(7, 2);  
9.	    begin  
10.	      select sal*12 + nvl(comm, 0) into income from emp where ename = name;  
11.	      return income;  
12.	    end;  
13.	end;  
3).如何调用包的过程或是函数
当调用包的过程或是函数时,在过程和函数前需要带有包名,如果要访问其它方案的包,还需要在包名前加方案名。
调用存储过程
exec pkg_sal.update_sal('zhang',50000);
调用函数

1.plsql代码块
   DECLARE 
  v_income number;
     begin
     v_income :=pkg_sal.annual_income('zhang');
      DBMS_OUTPUT.PUT_LINE('年薪为:'||v_income);
    end;
    /
  
    2.execute
     variable v_income number
     execute :v_income :=pkg_sal.annual_income('xiaoming');
结果:
PL/SQL procedure successfully completed
     v_income
     ---------
     60000
   
    3.call
    var v_income number;
    call pkg_sal.annual_income('xiaoming') into :v_income;
    
    4.select
    select pkg_sal.annual_income('xiaoming') from dual;
    结果:
    PKG_SAL.ANNUAL_INCOME('XIAOMIN
      ------------------------------
                     60000
5.将函数作为另一个子程序的参数
    execute dbms_output.put_line(pkg_sal.annual_income('xiaoming'));
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年12月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档