PL/SQL编程学习笔记

1、理解PL/SQL编程概念;
2、掌握PL/SQL编程的技术;存储过程,函数,触发器,包
一、理解PL/SQL编程概念;
1、procedural language/sql可以使用嵌入SQL定义变量常量;
2,过程,函数,触发器在oracle中;
3、pl/sql是非常强大的过程化语言;
4、存储过程和函数,可以在java中调用;
优点:提高应用程序的运行性能;模块化设计(分页过程,订单过程,转账过程


);减少网络传输量;提高安全性;
缺点:移植性不好,oracle的存储过程在DB2中无法使用;
开发工具:1、SQLPLUS;PL/SQL developer


示例程序:
create table pro1(proid varchar2(10), passwd varchar2(20));
alter table pro1 add  (proname varchar2(20));
创建表备用;
create procedure sq_pre1 is
begin 
insert into pro1 values('001','fanjf');
end;


oracle命令行查看错误;
show error;
如果调用过程:
1、exec 过程名(参数1,参数2...)
2、call 过程名(参数1,参数2...)
 开发人员要求:1、SQL语句;2、语法;


块编程分类:存储过程;函数;触发器;包;


编写规范:
1、注释:单行注释 --;多行注释 /*-----*/
2、标识符:变量v_;常量c_;游标_cursor;例外:e_


块结构:定义部分,执行部分,例外处理部分;
declear--定义常量,变量,游标例外,复杂数据类型;
begin--执行部分;
exception--例外处理部分
end;
demo1
set serveroutput on;--输出选项打开
begin
dbms_output.put_line('hello');
end;


demo2:有定义变量的块


declare
   v_ename varchar2(20);
   v_id    varchar2(20);
begin 
 select passwd,proid into v_ename,v_id from pro1 where proid =&aa;
 dbms_output.put_line('ID :'||v_ename||'--'||v_id );
exception
when no_data_found then
dbms_output.put_line('找不到对i数据啊啊啊啊啊啊');
end;





存储过程,函数,触发器,包
存储过程:可以输入参数,输出参数,可以用 create procedure命令来建立;


demo:
1、编写一个存储过程,输入雇员,新工资,可以修改工资
2、如何调用存储过程;
3、如何在Java中调用存储过程;
4、java存储过程返回值;
--创建过程
create procedure sp_pro3(spid varchar2, spname varchar2) is
begin
--执行,根据编号修改用户名
update pro1 set proname =spname  where proid=spid;
end;
/
--PL/SQL调用过程
exec sp_pro3('001','haha');
--JAVA中调用存储过程
String strCall = "{ call sq_pre2 }";//注意一定要有空格必须用call
conn = getConnection();
callLableStmt = conn.prepareCall(strSql);
bRst = callLableStmt.execute();


带参数的存储过程调用:
strCall = "{ call sq_pre3(?,?) }";
iRst = executeCall(strCall,new  Object[] {"001","fan"});


conn = getConnection();callLableStmt = conn.prepareCall(strSql);
for (int i = 0; i < params.length; i++) {
callLableStmt.setObject(i + 1, params[i]);
}
bRst = callLableStmt.execute();


函数:
函数必须有renturn
create or replace function sp_fun2(spName varchar2) return 
number is yearSal number(10,2);
begin
select nvl(sal,99999)*12 into yearSal from pro1 where proname=spName;
return yearSal;
end;
/


SQL/PLUS中调用:
SQL>  var income number
SQL>  call sp_fun2('fanjf1') into:income;


Method called
income
---------
119.88
JAVA中调用:像使用SQL查询语句一样:
select sp_fun2('fanjf1') from dual;


包:
写分页存储过程;
逻辑上组合过程与函数.由包规范和包体两部分组成;
create package命令创建包;
示例:
create  or replace package sp_package is
     procedure update_sal(pname varchar2, newsal number);
     function annual_income(pname varchar2) return number;
end;
/
包的规范只包含过程和函数的声明;没有实现;
包体可以使用create package body命令;
实现包体:
create or replace package body sp_package is
procedure update_sal(pname varchar2, newsal number)--注意参数名一定要


一样
is
begin 
    update pro1 set sal = newsal  where proname=pname;
end;
     function annual_income(pname varchar2) return number
is annual_sal number;
begin
select nvl(sal,2)*12 into annual_sal from pro1 where proname=pname;
return annual_sal;
end;
end;
/


调用包的过程与函数需要加上包名称;
exec sp_package.update_sal('fanjf1',120);


触发器:
本质是隐含执行的存储过程;
定义触发器时,必须要定义触发事件和触发操作,常用的触发事件包括


insert,update,delete 可以使用create trigger


定义并使用变量
四类变量:
标量(scalar),复合(composite),参照(reference),lob(large object)
标量:用来存放普通的变量。 变长字符串 v_ename varchar2(10);小数 v_sal 


number(6,2);定义小数带默认值 v_sal number(6,2):=5.4 ;定义日期类型:


v_hiredate date;定义布尔变量,不能为空,初始值为false v_valid boolean 


not null default false;
变量赋值 :=
示例:输入员工号,显示姓名,工资,个人所得税(税率0.03)
declare
c_tax_rate number(3,2):=0.03;--税率
v_ename pro1.proname%type;--姓名或者v_ename varchar2(10);
v_sal number(10,2);
v_tax_sal number(10,2);
begin
select proname,sal into v_ename,v_sal from pro1 where proid = &no;
--计算所得税
v_tax_sal:=v_sal*c_tax_rate;
--输出
dbms_output.put_line('姓名:'||v_ename||'工资'||v_sal||'所得税'||


v_tax_sal);
end;
/

猜你喜欢

转载自blog.csdn.net/jifeijixufly/article/details/17273353
今日推荐