设为首页 收藏本站
查看: 369|回复: 0

[经验分享] Oracle PL/SQL 学习笔记(三)

[复制链接]

尚未签到

发表于 2016-8-10 07:40:21 | 显示全部楼层 |阅读模式
  3.PL/SQL基础
  3.1PL/SQL块简介
  块(BLOCK)是PL/SQL的基本程序单元,编写PL/SQL程序就是编写PL/SQL块。
  3.1.1PL/SQL块结构
  PL/SQL由3个部分组成:定义部分、执行部分、例外处理部分。
  定义部分:定义常量、变量、游标、例外、复杂数据类型等。
  执行部分:实现应用模块功能,该部分包含要执行的PL/SQL语句和SQL语句。
  例外处理部分:处理执行部分可能出现的运行错误。
  基本结构:
  DECLARE
  /* 定义部分(可选) */
  BEGIN
  /* 执行部分(必须) */
  EXCEPTION
  /* 例外处理部分(可选) */
  END; /*块结束标记*/
  注意:DECLARE,BEGIN,EXCEPTION后面没有分号,END后必须有分号。
  
  示例:
  DECLARE
  name VARCHAR2(100);
  BEGIN
  SELECT offer_name INTO name FROM bbnn
  WHERE offer_id = &id;
  dbms_output.put_line('套餐名:'||name);
  EXCEPTION
  WHEN NO_DATE_FOUND THEN
  dbms_output.put_line('请输入正确的套餐号!');
  END;
  输入不正确套餐号,会提示输入正确套餐号。其中NO_DATE_FOUND是PL/SQL的预定义例外。
  
  3.1.2 PL/SQL块分类
  (1)匿名块:没有名称的PL/SQL块,既可以内嵌到应用程序中,也可以在交互式环境中使用。
  (2)命名块:具有特定标识的PL/SQL块,使用<<>>标记。
  <<outer>>
  DECLARE
  v_deptno NUMBER(2);
  v_dname VARCHAR2(10);
  BEGIN
  <<inter>>
  BEGIN
  SELECT deptno INTO v_deptno FROM emp
  Where lower(ename)=lover(‘&name’);
  END;--- <<inner>>
  SELECT dname INTO v_dname FROM dept
  WHERE deptno = v_deptno;
  Dbms_output.put_line(‘部门名:’||v_dname);
  END;--- <<outer>>
  (3)子程序:包括过程、函数和包。
  过程
  用于执行特定操作。当建立过程时,既可以指定输入参数(IN),也可以指定输出参数(OUT)。通过在过程中使用输入参数,可以将应用环境的数据传递到执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。
  CREATE PROCEDURE update_sal(name VARCHAR2, newsal NUMBER)
  IS
  BEGIN
  UPDATE emp SET sal = newsal
  WHERE lower(ename) = lower(name);
  END;
  过程update_sal用于更新雇员工资。
  示例一:exec update_sal(‘scott’,2000)
  示例二:call update_sal(‘scott’,2000)
  
  函数
  用于返回特定数据。当建立函数时,在函数头必须包含RETURN子句,而在函数体内必须要包含RETURN语句返回数据。
  CREATE FUNCTION annual_income(name VARCHAR2)
  RETURN NUMBER IS
  Annual_salary NUMBER(7,2);
  BEGIN
  SELECT sal*12+nvl(comm,0) INTO annual_salary
  FROM emp WHERE lower(ename)=lower(name);
  RETURN annual_salary;
  END;
  函数annual_income返回雇员的全年收入(包括工资和奖金)。
  SQL>VAR income NUMBER
  SQL>CALL annual_income(‘scott’) INTO : income
  SQL>PRINT income
  
  包
  包用于逻辑组合相关的过程和函数,由包规范和包体两部分组成。包规范用于定义公用的常量、变量、过程和函数。
  CREATE PACKAGE emp_pkg IS
  PROCEDURE update_sal(name VARCHAR2, newsal NUMBER);
  FUNCTION annual_income(name VARCHAR2) RETURN NUMBER;
  END;
  包规范只包含了过程和函数的说明,没有过程和函数的实现代码。包体用于实现包规范中的过程和函数。建立包体使用CREATE PACKAGE BODY命令。
  CREATE PACKAGE BODY emp_pkg IS
  PROCEDURE update_sal(name VARCHAR2, newsal NUMBER)
  IS
  BEGIN
  UPDATE emp SET sal=newsal
  WHERE lower(ename)=lower(name);
  END;
  FUNCTION annual_income(name VARCHAR2) RETURN NUMBER
  IS
  Aunnual_salary NUMBER(7,2);
  BEGIN
  SELECT sal*12+nvl(comm,0) INTO annual_salary
  FORM emp WHERE lower(ename)=lower(name);
  RETURN annual_salary;
  END;
  END;
  
  当调用包的过程和函数时,在过程和函数名之前必须要带有包名作为前缀(包名.子程序名),如果访问其他方案的包,还必须加方案名作为前缀(方案名.包名.子程序名)
  示例一:SQL> call emp_pkg.update_sal(‘scott’,1500);
  示例二:SQL> VAR income NUMBER
  SQL> CALL emp_pkg.annual_income(‘scott’) INFO:income;
  SQL> PRINT income
  
  
  (4)触发器:
  触发器是指隐含执行的存储过程。当定义触发器时,必须要制定出发事件以及处罚操作,常用的触发事件包括INSERT,UPDATE和DELETE语句。触发操作实际是一个PL/SQL块。
  CREATE TRIGGER update_cascade
  AFTER UPDATE OF deptno ON dept
  FOR EACH ROW
  BEGIN
  UPDATE emp SET deptno=:new.deptno
  WHERE deptno=:old.deptno;
  END;
  触发器update_cascade用于实现级联更新,如果不建立该触发器,那么当更新dept表的deptno列数据时就会出错,”ORA-02292:违反完整约束条件(SCOTT.FK_DEPTNO)”。而建立触发器后,当更新deptno列时,就会级联更新emp表的deptno列的相关数据。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-255706-1-1.html 上篇帖子: Oracle的FORM中如何存取图象 下篇帖子: Oracle PL/SQL 学习笔记(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表