PL/SQL编程基础
来源:互联网 发布:炭知天下龙泽路手机号 编辑:程序博客网 时间:2024/05/01 18:43
PL/SQL程序块的模板
DECLARE
--变量、常量、游标、用户定义异常的声明
BEGIN
--SQL语句和 PL/SQL语句构成的执行程序
EXCEPTION
--程序出现异常时,捕捉异常并处理异常
END;
注意:DECLARE,BEGIN,和EXCEPTION后面没有分号而END以及所有SQL语句,和PL/SQL语句必须以分号结尾。
实现上述示例的PL/SQL代码块
DECLARE v_stock_count NUMBER; --声明部分 v_idNUMBER:=&ID; BEGIN SELECTstockcount INTO v_stock_count FROMes_product WHEREID = v_id; DBMS_OUTPUT.PUT_LINE(v_stock_count);EXCEPTION WHEREOTHERS THEN DBMS_OUTPUT.PUT_LINE(‘该商品不存在’);END;
变量定义语法:DECLARE variable_name type ;变量需要声明在DECLARE和BEGIN之间,variable_name代表的是变量的名称。type表示变量的数据类型。注意:给变量赋值的时候用的是:=。
变量命名规则:1、变量名首字母必须是英文字母,其后可以是字母、数字或者特殊字符$、#号和下划线。2、变量名厂部不超过30个字符。3、变量名中不能有空格。4、变量名不能使用关键字命名。
PL/SQL除了使用:=给变量赋值以外,对于已经声明的变量还可以使用SELECT INTO的方法给变量赋值
select into语法:
select select_list into {variable_name[,variable_name,……]} from table_name [wherecondition];
select_list是检索出来的结果集字段。variable_name是表示想要赋值的变量名。
注意:1、查询只能返回一条记录,多条或0条都会产生异常。2、INTO语句必须放在SELECT和FROM子句之间。3、INTO后需要赋值的变量的数据类型必须和SELECT子句中检索出的数据类型一致。4、INTO后需要赋值的变量个数需要和SELECT查询出的字段数一致。 使用命令窗口使用set serveroutput on用于显示结果。
声明变量还可以以列名或变量名作为前缀来声明变量:变量名表名.列名%TYPE; 变量名其他变量名%TYPE;
示例:根据商品id查询商品名称、商品价格、上架时间、库存,并进行连接输出
declare v_name es_product.name%TYPE; v_price es_product.price%type; v_saledate es_product.saledate%type; v_stock_count es_product.stockcount%type; v_id number := &id;begin select name, price, saledate, stockcount into v_name, v_price, v_saledate, v_stock_count from es_product where id = v_id; dbms_output.put_line('商品名称:' || v_name || '商品价格:' || v_price || '上架时间:' || v_saledate || '库存:' || v_stock_count);end;
以某张表的完整行来声明变量,语法:变量名表名%ROWTYPE;
declare v_es_pro es_product%rowtype; v_id number := &id;begin select name, price, saledate, stockcount into v_es_pro.name,v_es_pro.price,v_es_pro.saledate,v_es_pro.stockcount from es_product where id = v_id; dbms_output.put_line('商品名称:' || v_es_pro.name || '商品价格:' || v_es_pro.price || '上架时间:' || v_es_pro.saledate || '库存:' || v_es_pro.stock_count);end;
if控制,语法:IF条件 THEN –代码块 END IF;
这里的THEN以及后面的代码块代表如果条件满足以后要做什么。
示例:使用if then实现购买商品时更新库存量
declare v_id es_product.id%type := &id; v_stock_count es_product.stockcount%type;begin select stockcount into v_stock_count from es_product where id = v_id; ifv_stock_count > 0 then update es_product set stockcount = stockcount - 1 where id = v_id; commit; dbms_output.put_line('id:' || v_id || '库存已更新'); endif;end;
IF THEN ELSE 结构语法:IF 条件 THEN –代码块1;ELSE –代码块2; END IF;
declare v_id es_product.id%type:= &id; v_stock_count es_product.stockcount%type;begin select stockcount into v_stock_count from es_product where id = v_id; ifv_stock_count > 0 then update es_product set stockcount = stockcount - 1 where id = v_id; commit; dbms_output.put_line('id:' || v_id || '库存已更新'); else dbms_output.put_line('id:'||v_id||'已经没有库存!'); endif;end;
IF THEN ELSIF语法:if条件1 then –代码块1; elsif条件2 then –代码块2; else –代码3 end if;
declare v_id es_product.id%type:= &id; v_stock_count es_product.stockcount%type;begin select stockcount into v_stock_count from es_product where id = v_id; ifv_stock_count > 0 then updatees_product set stockcount = stockcount - 1 where id = v_id; commit; dbms_output.put_line('id:' || v_id || '库存已更新'); elsif v_stock_count<0 then dbms_output.put_line('id:'||v_id||'库存数量小于零不正常的数据'); else dbms_output.put_line('id:'||v_id||'已经没有库存!'); endif;end;
CASE控制,语法: 或:
CASE值 CASE
WHEN 表达式1 THEN WHEN表达式1=值 THEN
代码1; 代码1;
WHEN 表达式2 THEN WHEN表达式2 =值 THEN
代码2; 代码2;
ELSE ELSE
代码3; 代码3;
ENDCASE; ENDCASE;
示例:根据订单的状态值输出对于的状态 1、已提交 2、已付款 3、已发货 4、已完成
declare v_id es_order.id%type; v_status es_order.status%type; v_status_name varchar(20);begin select id,status into v_id, v_status from es_order where id = &id; case v_status when '1' then v_status_name := '订单已提交'; when '2' then v_status_name := '已付款'; when '3' then v_status_name := '货物已发出'; when '4' then v_status_name := '已完成'; else v_status_name := '未知状态'; endcase; dbms_output.put_line('订单id:' || v_id ||'订单状态:' ||v_status_name);end;
循环控制
loop循环语法:
LOOP
代码块;
EXIT[WHERE condition];
END LOOP
示例:初始化3个商品类别
declare v_id number := 3; v_name varchar2(40) := '类别'; v_fatherid number := 0; v_count number := 0;begin loop v_count := v_count + 1; v_id := v_id + 1; insert into es_sort values (v_id, v_name || v_count, v_fatherid); exit when v_count = 3; endloop; commit; dbms_output.put_line('插入成功');end;
弊端:1、循环体可读性差,必须通过EXIT退出循环;2、EXIT容易忘记,或者退出循环的条件如果设置不正确可能造成死循环。
FOR循环语法:FOR循环变量 IN循环开始..循环结束 LOOP –需要循环执行的代码块 END LOOP;
declare v_id number; v_name varchar2(40) := '类别'; v_fatherid number := 0;begin forv_id in 4..6 LOOP insert into es_sort values (v_id, v_name || v_count, v_fatherid); endloop; commit; dbms_output.put_line('插入成功');end;
WHILE循环,语法:WHILE循环条件 LOOP –需要循环执行的代码块 END LOOP;
declare v_id number := 4; v_name varchar2(40) := '类别'; v_fatherid number := 0;begin while v_id >= 4 and v_id <= 6 loop insert into es_sort values (v_id, v_name ||v_count, v_fatherid); v_id := v_id + 1; endloop; commit; dbms_output.put_line('插入成功');end;
异常处理,异常处理的语法结构
EXCEPTION
WHENfirst_exception THEN --捕捉到的第一个异常
statements1; --对第一个异常的处理代码
WHENsecond_exception THEN --捕捉到的第二个异常
statements2; --对第二个异常的处理代码
WHENOTHERS THEN --除了前面捕获的异常外的其他异常
statements3; --对其他异常处理代码
END;
NO_DATA_FOUND
当没有使用返回数据的SELECT… INTO语句给给变量赋值时,抛出此异常
TOO_MANY_ROWS
在使用SELECT…INTO给变量赋值时,如果返回的数据量多于一行,就会抛出此异常
DUP_VAL_ON_INDEX
在插入数据是违反了唯一性索引而抛出的异常
INVALLID_NUMBER
将非数字字符串隐式转换为数值时引起的异常
CURSOR_ALREADY_OPEN
在已经打开的游标上执行OPEN语句时抛出异常
declare v_id number := 4; v_name varchar2(40) := '类别'; v_fatherid number := 0;begin while v_id >= 4 and v_id <= 6 loop insertinto es_sort values (v_id, v_name || v_id, v_fatherid); v_id := v_id + 1; endloop; commit; dbms_output.put_line('插入成功');exception when others then dbms_output.put_line('插入失败!');end;
自定义异常处理语法结构
DECLARE
exception1EXCEPTION; --exception1表示自定义异常变量的名称
BEGIN
RAISEexception1; --抛出自定义异常
EXCEPTION
WHENexception1 THEN
statements1;
WHENOTHERS THEN
statements2;
END;
示例:捕捉“删除订单”的异常
declare v_id es_sort.id%type := &id; e_no_result exception;begin delete es_order where id = v_id; ifSQL%NOTFOUND THEN --表示前面的delete语句没有删除任何数据 RAISE e_no_result;--所谓的触发异常 endif;exception when e_no_result then dbms_output.put_line('删除数据不成功!'); when others then dbms_output.put_line('发生其他错误!'); rollback;end;
在开发中一般使用常量保存定义好的异常,常量定义语法:变量名 CONSTANT变量的数据类型 :=初始值;
- PL/SQL编程基础
- PL/SQL编程基础
- PL/SQL编程基础
- PL/SQL编程基础
- PL/sql编程基础
- pl/sql编程基础
- 2.PL/SQL 编程基础
- Oracle PL/SQL 编程基础
- oracle pl/sql 编程基础
- Oracle数据库编程:PL/SQL编程基础
- oracle之PL/SQL编程基础
- Oracle的pl/sql编程基础
- 《精通Oracle10gPLSQL编程》3、PL/SQL基础
- Oracle之PL/SQL编程基础
- Oracle PL/SQL 编程基础 实例
- Oracle PL/SQL 编程基础 实例 2
- PL/SQL编程基础(章节摘要)
- Ch 2 PL/SQL编程基础
- oracle 笔记 游标
- C++中如何根据多个字节读取二进制文件
- 上海传智播客JAVASE_day09学习笔记
- Qt浅谈之十六:TCP和UDP(之二)
- 用到哪学到哪------Thinkphp ajaxReturn的数据类型
- PL/SQL编程基础
- 字符串的排列
- 12,activity 屏幕触摸汇总
- WinForm自定义弹出框边角圆滑处理
- 吴大全案
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
- 一只小蜜蜂...(2044)
- java7新功能解析
- --PL/SQL基础 Procedure Language & Structured Query Language