oracle中zero divide,Oracle第六章

第六章使用PL/SQL编程

初识PL/SQL(Procedure Language & Structured Query Language)

PL/SQL是Oracle在标准SQL语言上的过程性扩展,允许嵌入SQL语句,定义变量和常量允许过程语言结构(条件分支语句和循环语句)允许使用异常来处理Oracle错误 可以用于创建存储过程、触发器和程序包等,也可以用于处理业务  规则、数据库事件或给SQL命令的执行添加程序逻辑

普通SQL语言只能实现访问,操作数据;

PL/SQL可以实现流程控制,异常处理,创建可存储的代码块;

8b7ce6a7e5218e551398dce7f0ccbd8c.png

PL/SQL块

所有的PL/SQL程序都以块作为基本单位

块中包含过程化语句和SQL的DML语句。这些块可以按顺序出现,也可以相互嵌套(一个块在另一个块的内部)

块的分类

1. 无名块或匿名块(anonymous):动态构造,只能执行一次,可调用其它程序,但不能被其它程序调用。

2. 命名块(named):是带有名称的匿名块,这个名称就是标签。

3. 子程序(subprogram):存储在数据库中的存储过程、函数等。当在数据库上建立好后可以在其它程序中调用它们。

4. 触发器(Trigger):当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。

5. 程序包/包(package):存储在数据库中的一组子程序、变量定义。在包中的子程序可以被其它程序包或子程序调用。但如果声明的是局部子程序,则只能在定义该局部子程序的块中调用该局部子程序。

PL/SQL块的结构

示例1:

DECLARE

V_NAME varchar2(20)  := '郭老师';

BEGIN

DBMS_OUTPUT.put_line(V_NAME||'的第一条PL/SQL语句');

END;

与用户交互输入参数

declare

v_name  varchar2(20):= '&input_name';

begin

dbms_output.put_line(v_name||'的第一条PL/SQL语句');

end;

示例2:

DECLARE

v_name1 varchar2(32);

v_name2 varchar2(32) := 'ABC';

v_num1 number := 13;

v_num2 number;

BEGIN

dbms_output.put_line(v_name1);

dbms_output.put_line(v_name1 || v_name2);

dbms_output.put_line(v_num1);

dbms_output.put_line(v_num1 + v_num2);

END;

注意:

1. 声明变量时,必须要指定类型

2. 变量名需要先赋值,后使用

3. 变量名没有默认值(表现是空,无意义)

示例3:

CONSTANT 定义常量值,定义后无法修改

DECLARE

v_number1 number  := 13;

v_number2 CONSTANT number := 3.14;

BEGIN

DBMS_OUTPUT.put_line(v_number1 * v_number2);

END;

示例4:

变量与指定的列的类型一致 采用%TYPE

DECLARE

v_num1 employees.salary%type  := 13.234;

v_num2 employees.manager_id%type := 2;

BEGIN

DBMS_OUTPUT.put_line(v_num1 / v_num2);

END;

示例5:

DML结果装载入PLSQL变量

DECLARE

v_empId number;

BEGIN

select employee_id empId  into v_empId from employees where employee_id = 100;

dbms_output.put_line(v_empId);

END;

示例6:

%ROWTYPE表示数据类型是一行数据

DECLARE

v_emp employees%rowtype;

BEGIN

select * into v_emp from employees where employee_id = 100;

dbms_output.put_line('部门编号:'||v_emp.department_id ||

' 员工姓名:'|| v_emp.first_name);

END;

insert操作,接收返回值

示例6:

99c97bcc378635527110efb5a8a0cded.png

返回值拼接

bb1d225e35aefa8cb06719296d2bba65.png

update操作,接收返回值

示例7:

8434277112090920494432958f6c9e34.png

delete操作,接收返回值

示例8:

5a80ece6be541b2badee41fbc02673f1.png

数组类型

bb1d225e35aefa8cb06719296d2bba65.png

题:通过用户输入的员工号,查询一行记录

异常处理

a31282caf8b0d3c017cd2dabcd34d505.png

异常名称异常编码异常解释

TIMEOUT_ON_RESOURCEORA-0051发生超时

TOO_MANY_ROWSORA-1422SELECT INTO命令返回的多行

TRANSACTION_BACKED_OUTORA-006由于死锁提交被退回

VALUE_ERRORORA-6502转换或者裁剪错误

ZERO_DIVIDEORA-1476试图被零除

LOGIN_DENIEDORA-1017无效的用户名或者口令

NO_DATA_FOUNDORA-1403查询未找到数据

NOT_LOGGED_ONORA-1012还未连接就试图数据库操作

PROGRAM_ERRORORA-6501内部错误

ROWTYPE_MISMATCHORA-6504主变量和光标的类型不兼容

STORAGE_ERRORORA-6500内部错误

ACCESS_INTO_NULLORA-6530试图访问一个未初始化的对象时出现

CASE_NOT_FOUNDORA-6592CASE语句中的选项与用户输入数据不匹配时出现

CURSOR_ALREADY_OPENORA-6511试图打开一个已打开的光标

DUP_VAL_ON_INDEXORA-0001试图破坏一个唯一性限制

INVALID_CURSORORA-1001试图使用一个无效的光标

INVALID_NUMBERORA-1722试图对非数字值进行数字操作

流程控制

if

IF THEN

PL/SQL 和 SQL语句

ELSE

其它语句

END IF;

0b85c4a9c97f27cb6ff52f7a97aefe74.png

case

CASE 条件表达式

WHEN 条件表达式结果1 THEN

语句段1

WHEN 条件表达式结果2 THEN

语句段2

......

WHEN 条件表达式结果n THEN

语句段n

[ELSE 条件表达式结果]

END;

5a80ece6be541b2badee41fbc02673f1.png

loop 三种循环方法

LOOP

要执行的语句;

EXIT WHEN ; --条件满足,退出循环语句

END LOOP;

c6a821c37eb32cab171a38cbe94a8aa4.png

while

WHILE LOOP

要执行的语句;

END LOOP;

ff4dbffcc1d717c13932ff27413d6def.png

for 推荐

FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP

要执行的语句;

END LOOP ;

IN 每次循环加一;

IN REVERSE 每次循环减一;

EXIT 退出循环;

9c3c38ba24de64614a8d5ed700d894b0.png

5a80ece6be541b2badee41fbc02673f1.png

数组的输出采用for循环方式,打印出来

标签:语句,END,put,第六章,SQL,Oracle,PL,ORA

来源: https://blog.csdn.net/careyliang/article/details/114624482

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值