1.1概念和目的
什么是PL/SQL?
PLSQL是Oracle对sql语言的过程化扩展
指在SQL命令语言中增加了过程处理语句(如分支,循环等),使SQL语言具有过程处理能力
1.2程序结构
通过Plsql Developer工具的Test Window 创建程序模板或者通过语句在SQL Window编写
提示:PLSQL语言的大小写是不区分的
PL/SQL可以分为三个部分:声明部分,可执行部分,异常处理部分
在cmd命令行中使用sqlplus得
---打开输出开关(默认关闭)
set serveroutput on
-- Created on 2018/10/15 by TANLEI declare -- 声明变量的地方,还包括游标 --相当于public class A{} begin -- 执行部分 --public static void main(String args[]){ --} --异常处理 --System.out.println("hello world") DBMS_OUTPUT.put_line('hello world'); end;
其中declare部分用来声明变量或游标(结果集类型变量),如果程序中无变量声明可以省掉
DBMS_OUTPUT为oracle内置程序包,相当于java中的System.out,而put_line()是调用的方法,相当于println()方法
1.3变量
变量分类
- 普通数据类型(char,varchar2,number,boolean,long)
- 特殊变量类型(引用型变量,记录型变量)
声明变量的方式为:
变量名 变量类型(变量长度) v_nume varchar(20);
1.3.1普通变量
- 直接赋值
- 语句赋值
-- 声明一个人的信息,姓名,薪水,地址 declare -- 姓名 v_name VARCHAR2(50) := '张三'; --薪水 v_sal NUMBER; --地址 v_addr VARCHAR2(200); begin -- 直接赋值 v_sal := 15800; --语句赋值 select '上海传智播客' INTO v_addr FROM dual; --打印变量 DBMS_OUTPUT.put_line('姓名:' || v_name || ',薪水:' || v_sal || ',地址:' || v_addr); end;
1.3.2引用型变量
变量的类型和长度取决于表中字段的类型和长度
emp%type (引用型变量:表%type 代表类型)
通过表名.列名%TYPE指定变量的类型和长度,例如 v_name emp.name%TYPE;
举例:my_name emp.ename%type; 引用emp表中ename列的类型作为变量my_name的类型,并且变量的类型始终与其保持一致
示例:查询emp表中某号员工的个人信息,打印姓名和薪水
-- 查询emp表中某号员工的个人信息,打印姓名和薪水 declare -- 姓名 V_NAME emp.ename%Type; -- 薪水 V_SAL emp.sal%TYPE; begin -- 查询姓名和薪水并赋值给变量 select ename,sal INTO V_NAME,V_SAL from emp where empno=7839; --打印变量 DBMS_OUTPUT.put_line('姓名:'||V_NAME||',薪水:'||V_SAL); end;
好处:灵活
1.3.3记录型变量
接收表中的一整行记录,相当于java的一个对象
语法: 变量名称 表名%ROWTYPE 例如:v_emp emp%rowtype
示例
查询并打印某号的员工的姓名和薪水
-- 查询emp表中某号员工的个人信息,打印姓名和薪水 declare -- 记录型变量 v_emp emp%ROWTYPE; begin -- 查询并赋值给变量 select * INTO v_emp from emp where empno=7839; --打印变量 DBMS_OUTPUT.put_line('姓名:'||v_emp.ename||',薪水:'||v_emp.sal); end;
1.4流程控制
1.4.1条件分支
语法
注意关键字ELSIF
begin if 条件1 then 执行1 elsif 条件2 then 执行2 else 执行3 end if; end;
示例:判断emp表中记录是否超过20条,10-20之间,或者10条以下
-- 判断emp表中记录是否超过20条,10-20之间,或者10条以下 declare -- 声明变量接收emp表中的记录数 v_count number; begin --查询并赋值给变量 select count(1) INTO v_count from emp; if v_count>20 then DBMS_OUTPUT.put_line('emp表中的记录数在20以上为:'||v_count); elsif v_count>=10 then DBMS_OUTPUT.put_line('emp表中的记录数在10-20之间为:'||v_count); else DBMS_OUTPUT.put_line('emp表中的记录数在10以下为:'||v_count); end if; end;
1.4.2循环
loop循环
语法
begin loop exit when 退出循环条件 end loop end;
示例:打印数字1-10
-- 打印数字1-10 declare -- 声明一个循环变量 v_num number:=1; begin loop EXIT WHEN v_num>10; DBMS_OUTPUT.put_line(v_num); --循环变量的自增长 --java --v_num++ v_num:=v_num+1; end loop; end;