PL/SQL

1 PL/SQL

PL/SQL:过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算。

PL/SQL块由三部分构成:声明部分、执行部分、异常部分

PL/SQL结构

[DECLARE]

    --声明变量等;

BEGIN

    --程序主要部分,一般用来执行过程语句或SQL语句;

[EXCEPTION]

    --异常处理;

END;

1.1  运算符

等于

 比较运算符

<>,!=,^=

不等于

小于

大于

<=

小于或等于

>=

大于或等于

 +

加号

 算术运算符

 -

减号

 *

乘号

 /

除号

:=

赋值号

赋值运算符

=>

关系号

关系号

..

范围运算符

范围运算符

||

字符连接符

连接运算符

is null

是空值

 逻辑运算符

between and

介于两者之间

in

在一系列值中间

and

逻辑与

or

逻辑或

not

取反

1.2  变量与常量

数据类型

常用标准类型:CHAR(CHARATER,NCHAR),VARCHAR2,NUMBER(P,S),DATE,BOOLEAN等。

属性类型:%TYPE 与 %ROWTYPE

%TYPE:可以用来定义数据变量的类型与已定义的数据变量(表中的列)一致。

%ROWTYPE:与某一数据库表的结构一致(修改数据库表结构,可以实时保持一致);访问方式声明为rowtype的 变量名.字段名。

1.2.1  基本类型

声明

【变量声明】

<变量名> 类型[:=初始值];

【示例】

name varchar2(20) := 'itcast';

 

【常量声明】

<变量名> CONSTANT 类型:=初始值;

【示例】

pi constant number(5,3):=3.14;

运用

/*定义常量或变量、赋值使用示例*/

DECLARE

     p_empno constant number(4):=7369;

     p_ename varchar2(10);

     p_sal number(7,2);

     p_comm number(7,2);

BEGIN

--赋值方式一:使用select into给变量赋值

select ename,sal into p_ename,p_sal from emp where empno =p_empno;

 

--赋值方式二:使用赋值操作符“:=”给变量赋值

     p_comm:=500;

 

--输出相关信息,DBMS_OUTPUT.PUT_LINE为具有输出功能的函数

     dbms_output.put_line('员工号:'|| p_empno||',姓名:'|| p_ename||',工资:'|| p_sal||',奖金:'|| p_comm);

END;

 

【注意】

dbms_output是oracle提供的输出对象

put_line是其一个方法,用于输出一个字符串

new_line是其一个方法,用于输出新的一行(换行)

1.2.2  %type类型

声明

【声明】

变量名称 表名.字段%type;

【示例:】

--表示变量name的类型和emp.ename的类型相同

name emp.ename%type;

 运用

/*定义常量或变量、赋值使用示例*/

DECLARE

     p_empno constantnumber(4):=7369;

     p_ename emp.ename%type;

     p_sal emp.sal%type;

     p_comm emp.comm%type;

BEGIN

--赋值方式一:使用select into给变量赋值

select ename,sal into p_ename,p_sal from emp where empno = p_empno;

 

--赋值方式二:使用赋值操作符“:=”给变量赋值

     p_comm:=500;

 

--输出相关信息,DBMS_OUTPUT.PUT_LINE为具有输出功能的函数

     dbms_output.put_line('员工号:'|| p_empno||',姓名:'|| p_ename||',工资:'|| p_sal||',奖金:'|| p_comm);

END;

 

1.2.3  %rowtype类型

声明

【声明】

变量名称 表%rowtype;

 

【示例:】

--表示变量test的类型为emp表的行类型;也有 .empno; .ename; .sal ;等属性

test emp%rowtype;

 运用

/*定义常量或变量、赋值使用示例*/

DECLARE

     p_empno constantnumber(4):=7369;

     emp_info emp%rowtype;

     p_comm emp.comm%type;

BEGIN

--赋值方式一:使用select into给变量赋值

select*into emp_info from emp where empno = p_empno;

 

--赋值方式二:使用赋值操作符“:=”给变量赋值

     p_comm:=500;

 

--输出相关信息,DBMS_OUTPUT.PUT_LINE为具有输出功能的函数

     dbms_output.put_line('员工号:'|| p_empno||',姓名:'|| emp_info.ename ||',工资:'|| emp_info.sal ||',奖金:'|| p_comm);

END;

 

1.3    控制语句
1.3.1  条件语句

【语法】

IF <条件1> THEN

    语句

[ELSIF <条件2> THEN

   语句]

          .

          .

          .

[ELSIF <条件n> THEN

   语句]

 

[ELSE

    语句]

 

END IF;

 【示例】

/*

根据员工的工资判断其工资等级(工资大于等于5000为A级,工资大于等于4000为B级,工资大于等于3000为C级,工资大于等于2000为D级,其它为E级)

*/

DECLARE

     p_empno number(4):=7566;

     p_sal emp.sal%type;

BEGIN

--用变量代替条件语句中的真值

select sal into p_sal from emp where empno = p_empno;

 

IF p_sal >=5000THEN

        dbms_output.put_line('员工号为:'|| p_empno ||'的员工的工资级别为:A级');

ELSIF p_sal >=4000THEN

        dbms_output.put_line('员工号为:'|| p_empno ||'的员工的工资级别为:B级');

ELSIF p_sal >=3000THEN

        dbms_output.put_line('员工号为:'|| p_empno ||'的员工的工资级别为:C级');

ELSIF p_sal >=2000THEN

        dbms_output.put_line('员工号为:'|| p_empno ||'的员工的工资级别为:D级');

ELSE

        dbms_output.put_line('员工号为:'|| p_empno ||'的员工的工资级别为:E级');

END IF;

END;

1.3.2 循环语句
1、LOOP

LOOP

   语句;

   EXIT WHEN <条件>

END LOOP;

 【示例】

/*

计算1-10的总和

*/

DECLARE

     p_sum number(4):=0;

     p_num number(2):=1;

BEGIN

LOOP

     p_sum := p_sum + p_num;

     p_num := p_num +1;

EXITWHEN p_num >10;

END LOOP;

     dbms_output.put_line('1-10的总和为:'|| p_sum);

END;

 

2、WHILE LOOP

WHILE <条件>

LOOP

   语句;

END LOOP;

【示例】

/*

计算1-10的总和

*/

DECLARE

     p_sum number(4):=0;

     p_num number(2):=1;

BEGIN

WHILE p_num <=10

LOOP

     p_sum := p_sum + p_num;

     p_num := p_num +1;

ENDLOOP;

     dbms_output.put_line('1-10的总和为:'|| p_sum);

END;

 

3、FOR

FOR <循环变量> IN[REVERSE] 下限..上限

LOOP

   语句;

END LOOP;

【说明】..两点表示范围,1..4表示时将从1到4进行循环,起始(例如 1)写前边,REVERSE表示反转,循环时变成从4到1进行。

【示例】

/*

计算1-10的总和

*/

DECLARE

     p_sum number(4):=0;

     p_num number(2):=1;

BEGIN

FOR p_num IN 1..10

LOOP

     p_sum := p_sum + p_num;

ENDLOOP;

     dbms_output.put_line('1-10的总和为:'|| p_sum);

END;

 

1.3.3  顺序语句

        指定顺序执行的语句;主要包括 null语句。null语句:是一个可执行语句,相当于一个占位符或不执行操作的空语句。主要用来提高程序语句的完整性和程序的可读性。

 /*

输出1-10的数字但跳过数字4

*/

DECLARE

     flag number(2):=0;

BEGIN

WHILE flag <10

LOOP

     flag := flag +1;

if flag =4then

null;-- 占位,不能去掉

else

        dbms_output.put_line(flag);

endif;

ENDLOOP;

END;

1.4  异常处理
1.4.1  异常语法

EXCEPTION

   WHEN <异常类型> THEN

            语句;

   WHEN OTHERS THEN

            语句;

 

常配套使用的函数:

    SQLCODE函数:返回错误代码,

    SQLERRM函数:返回错误信息

例如输出异常信息: DBMS_OUTPUT.PUT_LINE('其它异常,代码号:'||SQLCODE||',异常描述:'||SQLERRM);

1.4.2  预定义异常

预定义异常指PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发(由oracle自动引发)。

常见的预定义异常

CURSOR_ALREADY_OPEN 试图"OPEN"一个已经打开的游标

DUP_VAL_ON_INDEX 试图向有"UNIQUE"中插入重复的值

INVALID_CURSOR 试图对以关闭的游标进行操作

INVALID_NUMBER 在SQL语句中将字符转换成数字失败

LOGIN_DENIED 使用无效用户登陆

NO_DATA_FOUND 没有找到数据时

NOT_LOGIN_ON 没有登陆Oracle就发出命令时

PROGRAM_ERROR PL/SQL存在诸如某个函数没有"RETURN"语句等内部问题

STORAGE_ERROR PL/SQL耗尽内存或内存严重不足

TIMEOUT_ON_RESOURCE Oracle等待资源期间发生超时

TOO_MANY_ROWS "SELECT INTO"返回多行时

VALUE_ERROR 当出现赋值错误

ZERO_DIVIDE 除数为零

【示例】

/*

预定义异常捕获并处理

*/

DECLARE

     p_result number(2);

BEGIN

     p_result :=1/0;

     dbms_output.put_line('没有异常!');

EXCEPTION

WHEN ZERO_DIVIDE THEN

         dbms_output.put_line('除数不能为0!代码为:'||sqlcode||',异常信息为:'||sqlerrm);

WHEN OTHERS THEN

         dbms_output.put_line('其它异常!代码为:'||sqlcode||',异常信息为:'||sqlerrm);

END;

 

1.4.3  自定义异常

自定义异常:程序在运行过程中,根据业务等情况,认为非正常情况,可以自定义异常。对于这种异常,主要分三步来处理:

1、定义相关异常;在声明部分定义相关异常,

格式:<自定义异常名称> EXCEPTION;

2、抛出异常;在出现异常部分抛出异常,

格式:RAISE <异常名称>;

3、处理异常;在异常处理部分对异常进行处理,

格式:when <自定义异常名称> then ...,

处理异常也可以使用RAISE_APPLICATION_ERROR(ERROR_NUMBER,ERROR_MESSAGE)存储过程进行处理,

其中参数ERROR_NUMBER取值为-20999~-20000的负整数,参数ERROR_MESSAGE为异常文本消息。

【示例】

/*

判断emp中相应empno对应用户的奖金是否低于500,如果低于则抛出并处理自定义异常

*/

declare

     p_comm emp.comm%type;

--自定义异常,名称为comm_exception

     comm_exception EXCEPTION;

BEGIN

Select nvl(comm,0)into p_comm from emp where empno=7499;

--nvl(comm,0)如果comm为null就填充0

if p_comm >=500then

      dbms_output.put_line('奖金大于等于500。');

else

RAISE comm_exception;

End if;

EXCEPTION

WHEN comm_exception THEN

         RAISE_APPLICATION_ERROR(-20001,'奖金低于500,太少了!');

--dbms_output.put_line('奖金低于500!');

WHEN OTHERS THEN

         dbms_output.put_line('其它异常!代码为:'||sqlcode||',异常信息为:'||sqlerrm);

END;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20sccm_SCCM 2012安装图解教程(一步一步详细步骤)

本系列文章的环境架构如下图所示&#xff1a;所有服务器安装的操作系统都是windows Server 2008 R2 中文企业版。计算机名软件、版本及角色SC-DC.SC.COMwindows Server 2008 R2 Enterprise /Active Directory 2008 R2SC-SQL.SC.COMSQL Server 2008 R2 EnterpriseSC-SCCM.SC.COM…

【Java中级篇】Dom4j解析xml数据

一、依赖 <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency> 二、test.xml <?xml version"1.0" encoding"UTF-8"?> <students>…

redis 附近的人_使用redis—geo api实现搜索附近的人,自己写的一个composer包

安装如果是应用在项目当中的话找到根目录&#xff0c;需要和 composer.json同级composer require gaopengfei/redis_lbs基本操作初始化require_once __DIR__./vendor/autoload.php;$lbs new \LBS\Services\LBSService();添加$add_params [[name > yabao_road,long > 11…

【Java中级篇】使用zxing生成二维码

一、pom.xml添加依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.google.zxing</groupId><artifa…

微信小程序弹出框竖向滚动_微信小程序 解决自定义弹出层滑动时下层页面滚动问题...

WXML将整个底层页面使用 scroll-view 包裹起来&#xff0c;设置 scroll-y 当显示弹出层的时候为 true&#xff0c; 闭关弹出层的时候为 falseWXSSPage 设置为绝对定位&#xff0c;宽高各百分之百 &#xff0c; scroll-view 高度 百分之百Page{position: absolute;width: 100%;h…

win10环境安装使用svn客户端和服务端

一、下载安装包 安装包下载传送门http://subversion.apache.org/packages.html 无法下载的童鞋去百度云下载 链接&#xff1a;https://pan.baidu.com/s/1EuGohoZKIPmRvynp5-Subw 提取码&#xff1a;ohna 链接&#xff1a;https://pan.baidu.com/s/1EJrd5DzGCBE4rRfdhuno6Q …

openglshader实现虚拟场景_opengl – 如何使用GLSL着色器将径向模糊应用于整个场景?...

我在GLSL中有一个径向模糊着色器,它采用纹理,对其进行径向模糊,并将结果呈现给屏幕.这个工作很好,到目前为止.问题在于,它将径向模糊应用于场景中的第一个纹理.但是我实际上想做的就是将这个模糊应用于整个场景.实现此功能的最佳方式是什么&#xff1f;我可以只使用着色器,还是…

记一次尴尬的面试

昨天信达雅公司邀请我去平安面试&#xff0c;然后我今天10点到科技信息中心&#xff0c;等了接近20分钟才有人过来接我。 第一个环节是机试 40个题目&#xff0c;主要是选择题&#xff0c;花了40分钟结束战斗&#xff0c;总分100得了75分&#xff08;手机快没电了&#xff0c…

所选元素非联通_非固化橡胶沥青防水涂料与耐根穿刺防水卷材(沥青基)施工要点...

目前&#xff0c;非固化复合耐根穿刺防水卷材在车库顶板的应用逐渐受到客户及用户的认可&#xff0c;也有不少慕名而来的防水从业者打电话来咨询此系统的应用情况及优势。下面就由小编来给大家系统介绍此应用系统的特点吧。01性能优势1.两种材料高度的相容性非固化橡胶沥青防水…

事务的理解

事务的概念 事务是一组SQL组成的逻辑处理单元&#xff0c;通常有四个特性&#xff0c;简称ACID&#xff1a; 原子性&#xff08;Atomic&#xff09;&#xff1a;数据库事务是不可分割的工作单位。事务中的SQL语句要么都执行成功&#xff0c;要么都执行失败。 一致性&#xf…

vscode设置templates_在VScode中创建你的代码模板的方法

使用VScode的用户代码片段功能&#xff0c;来生成自己习惯的代码模板&#xff0c;提升开发效率1.选择菜单里的 文件 > 首选项 > 用户代码片段2.选择你需要自定义模板的文件&#xff0c;以vue为例3. 配置对应文件json把代码片段写在json里。每个代码段都是在一个代码片段名…

【Java中级篇】动态代理机制

要想搞明白动态代理之前&#xff0c;我们先来了解一下代理是什么意思&#xff0c;先来谈谈设计模式中的代理模式。 什么是代理模式&#xff08;Proxy&#xff09; 定义&#xff1a;给目标对象提供一个代理对象&#xff0c;并由代理对象控制对目标对象的引用。 在代理模式中&…

二维分类教案_幼儿园中班数学教案中班数学教案二维排序——师乐汇幼儿教师教育网...

中班数学教案&#xff1a;二维排序一、活动目标&#xff1a;1. 在分类的基础上初步运用二维排列表进行物品放置。2. 通过场景设置、温故知新由易到难的课程安排&#xff0c;幼儿能积极参与大胆表达并且根据表格来进行物品放置。3&#xff0e;在生活化的情境中体验学习数学活动的…

【JAVA基础篇】String类详解

昨天参加了一场机试&#xff0c;发现自己居然对String类的api不熟了&#xff0c;所以今天来总结一下&#xff08;基于JDK1.8&#xff09;。 1、父类和实现的接口 没有父类&#xff0c;或者说父类是Object 接口&#xff1a;Serializable、Comparable<String>、CharSequ…

python精确计时_PYTHON在WINDOWS下高精度计时的体会

2011-02-23 14:51:19其实也是WINDOWS下的通用办法啦&#xff0c;只不过我用PYTHON表达。用win32api.GetSystemTime()不是太精确&#xff0c;值15毫秒才变一下&#xff0c;最好用time.clock()&#xff0c;这个能到毫秒级&#xff0c;最精确的办法是用QueryPerformanceFrequency(…

什么叫大数据人物画像_大数据时代,如何构建精准用户画像,直击精细化运营...

移动互联网时代&#xff0c;精细化运营逐渐成为企业发展的重要竞争力&#xff0c;“用户画像”的概念也应运而生。用户画像是指&#xff0c;在大数据时代&#xff0c;企业通过对海量数据信息进行清洗、聚类、分析&#xff0c;将数据抽象成标签&#xff0c;再利用这些标签将用户…

【Java中级篇】使用itextpdf生成PDF

我们可以发现很多求职网站都会将我们录入的信息来生成一个PDF简历文件。所以我这里提供了用itextpdf生成的PDF的代码。 一、步骤 1.1、使用Adobe Acrobat Pro工具编辑PDF模板 1.2、根据PDF模板文件路径创建一个PDFReader对象 1.3、创建一个输出流对象&#xff0c;用于存放生…

adb bugreport保存位置_adb 常用命令---日常提升效率

做为 Android 开发&#xff0c;怎么能不懂点 adb 命令呢&#xff1f;速看~adb 重置、断连的状况这里不说了&#xff0c;先来说一些直观的命令吧1、adb devices查看当前连接的设备如果当前正在连接着设备&#xff0c;那么就可以进行后续的操作了&#xff0c;如果没有&#xff0c…

【Java基础篇】你真的懂switch语句吗?

switch语句语法 switch (expression) {case value://语句break;//可选//可以有任意个case语句default://可选//语句} 注意点 switch的语句中表达式expression返回类型只能是byte、char、short、int和枚举类型&#xff0c;java1.7开始支持String类型&#xff1b; case语句值的…

jsp springmvc 视图解析器_Java面试题整理——SpringMVC

SpringMVC1、什么是SpringMVCSpring MVC是一个MVC的开源框架&#xff0c;Spring MVC Struts2spring&#xff0c;Spring MVC就相当于是Struts2加上Spring的整合&#xff0c;但是这里有一疑惑是Spring MVC和Spring是什么样的关系呢。Spring MVC是Spring的一个后续产品&#xff0…