PL/SQL块简单的介绍

declare
  v_name varchar2(20);
begin
  select person_name into v_name from yy_fj_persons where person_id = &no;
  dbms_output.put_line('雇员名:' || v_name);
end;


当定义变量v_name 是declare必须写,&no是替代变量


执行以上代码时,当输入一个不存在的no值时,则会发生错误ORA-01403,
为了避免这种错误,做出以下修改;
declare
  v_name varchar2(20);
begin
  select person_name into v_name from yy_fj_persons where person_id = &no;
  dbms_output.put_line('雇员名:' || v_name);
exception
  when no_data_found then
    dbms_output.put_line('请输入正确的雇员号');
end;


当出现错误时则执行exception下的代码,其中no_data_found 是PL/SQL的预编译例外;


PL/SQL块的分类:匿名块,命名块,子程序和触发器


1.匿名块:指没有名称的PL/SQL块,匿名块可以内嵌套到应用程序中,也可以在交互式环境中直接使用


declare
  v_avgamount number(6, 2);
begin
  select avg(trx_amount)
    into v_avgamount
    from yy_fj_trx
   where person_id = &no;
  dbms_output.put_line('平均值为:' || v_avgamount);
end;


根据person_id 显示平均工资,但因为该PL/SQL直接以declare开始,没有给出名称,所以该PL/SQL为匿名块


2.命名块:具有特定名称的PL/SQL
<<OUTER>>  
DECLARE V_NAME VARCHAR2(5);  
BEGIN   
SELECT NAME INTO V_NAME WHERE AGE=100;   
DBMS_OUTPUT.PUT_LINE(V_NAME);  
EXCEPTION   
WHER NO_DATA_FOUND THEN   
DBMS_OUTPUT.PUT_LINE('未查到到任何数据');  
END;--<<OUTER>>  


3.子程序:包括过程、函数和包。开发PL/SQL子程序,既可以开发客户端的也可以开发服务器端的子程序;
(1)过程:用于执行特定的操作,建立过程既可以指定输入参数(in),也可以指定输出参数(out)可以使用
create procedure 命令建立过程;


create procedure update_sal(name varchar2, id number) is
begin
  update yy_fj_persons set person_name = name where person_id = id;
end;


call update_sal('秋实',3);
exec update_sal('王秋实',3);----》无法调用,具体原因不明,在command窗口执行过没有反应,一直卡顿可能是客户端版本原因。
1. 但是exec是sqlplus命令,只能在sqlplus中使用;call为SQL命令,没有限制. 


2. 存储过程没有参数时,exec可以直接跟过程名(可以省略()),但call则必须带上(). 


3.函数:用于返回特定的数据,建立函数头部必须包含return子句


CREATE OR REPLACE FUNCTION+函数名+(参数+类型)+RETURN 类型 IS+名称+类型+BEGIN+END 函数名;




4.包:用于逻辑组合相关的过程和函数,由包规范和包体两部分组成,
包规范用于定义公用的常量、变量、过程和函数,在sql*plus中建立
包规范可以使用create package命令。


--包的规范
create package sp_package is
 procedure update_sal(name varchar2,newSal number);
 function annual_income(name varchar2) return number;
end;
包规范只包含了过程和函数的说明,而没有过程和函数的实现代码。
包体用于实现包规范中的过程和函数,在SQL*Plus中使用
create package body 命令创建。


--创建包体
create package body sp_package is
--存储过程
procedure update_sal(name varchar2,newSal number)
is
begin
 update emp set sal=newSal where ename=name;
end;
--函数
function annual_income(name varchar2)
return number is 
annual_salary number;
begin
 select sal*12+nvl(comm,0) into annual_salary from emp
 where ename=name;
 return annual_salary;
end;
end;


注意:在调用包中的存储过程和函数时,需要带上报的名字在函数之前,
包名和函数之间用英文实心点。
如:调用存储过程 call sp_package.update_sal('scott',120);


4.触发器:指隐含执行的存储过程。ORACLE触发器有三种类型,
分别是:DML触发器、替代触发器和系统触发器。


定义触发器是,必须指定触发事件以及触发操作,常用的触发事件
包括insert,update 和delete 语句,而触发操作实际上是一个PL/SQL块。
建立触发器使用 create trigger 命令完成。


create trigger update_cascade
 alter update of depton on dept
 for each row
begin
 update emp set deptno=:new.deptno
 where deptno=:old。deptno;
end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值