1.什么是pl/sql?
sql:结构化查询语言
pl/sql:(Procedure Language&Structured Query Language)是对sql语言,存储过程语言的拓展。它可以像Java语言等一样实现简单的逻辑编程。
2.pl/sql的优点?
1.有利于客户/服务器环境应用的运行
2.适合于客户环境
3.过程化
4.模块化
5.运行错误可处理性
6.提供大量内置程序包
3.pl/sql的使用
declare-- declare 可以省略
--声明部分,在这里声明pl/sql用到的变量,游标,以及局部的存储过程及函数
begin -- 程序开始部分,不可省略,相当于java中的大括号{
--执行部分 过程及sql语句,是程序的主要部分
exception
--异常处理部分(可以省略)
end; --程序结束部分,不可省略相当于结尾大括号}
pl/sql块可以分为:
1.匿名块:没有名字的语句块,只能执行一次,可以调用其他程序,不能被其他程序调用
2.命名块:带有名称的匿名块,这个名称就是标签
3.子程序:存储在数据库中的存储过程、函数等,当在数据库中建立好后可以在其他程序中调用他们。
4.程序包:存储在数据库中的一组子程序,定义变量,在包中的子程序可以被其他程序包或子程序调用,但如果声明的是局部子程序,则只能在定义该局部子程序的块中调用该局部子程序。
5.触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序
4.标识符
pl/sql中的标识符与sql中的标识符定义基本相同,要求和限制有:
1.标识符名不能超过30个字符
2.第一个字符必须为子母
3.不分大小写
4.不能为-号
5.不能为sql保留字
匿名块举例:
举例:根据员工的编号,查询员工的姓名
declare
v_empno number:=7369;--定义变量赋值 (:=)
v_ename varchar2(20);
begin
--解释本句,查询emp表中员工编号为变量v_empno的员工的姓名,将姓名放入变量v_ename中
select ename into v_ename from emp where empno=v_empno;
--输出命令,拼接字符串为||
dbms_output.put_line('员工的名字:'||v_ename);
end;
pl/sql中变量赋值:
v_empno number:=7369
常量赋值:
v_empno constant number:=7369 --关键字constant表示为常量
引用类型变量:
在pl/sql中,引用类型变量有 :
列引用类型 %type
行引用类型 %rowtype
记录类型 %record
表格类型 %table
举例:
--列引用类型
declare
v_empno emp.empno%type;--列引用类型用法需要表名.列名来声明是那儿一列
v_ename varchar(20);
begin
select empno into v_empno from emp where ename='ALLEN';
dbms_output.put_line('员工编号:'||v_empno);
end;
--行引用类型
declare
v_row emp%rowtype;--行引用类型表名%rowtype表示为那儿张表
v_empno number(7):=7369;
begin
select * into v_row from emp where empno=v_empno;
dbms_output.put_line('员工姓名:'||v_row.ename||'员工部门:'||v_row.job);
end;
--记录类型(复杂的数据类型)
--举例根据员工号查询员工信息
declare
--定义一个记录类型,就像创建一个表 一样
type emp_record_type is record(
v_empno emp.empno%type,--逗号结尾
v_ename emp.ename%type--最后一条不用逗号
);
v_emp emp_record_type;--声明变量v_emp为记录类型
begin
select empno,ename into v_emp from emp where empno=7369;--要注意查询的数据条数要与记录中的条数对应,这里如果是select * 就会报错
dbms_output.put_line('结果为:'||v_emp.v_empno);--输出时必须写明输出的数据是哪儿一条,直接输出v_emp报错
end;
--table类型,键值的集合,record的集合
--根据员工号查询员工信息
declare
/*定义table类型,
of数据类型,基本的数据类型,引用类型..
index by 索引类型*/
type emp_table_type is table of emp%rowtype index by binary_integer;
v_emp emp_table_type;
begin
--错误 select * into v_emp from emp where empno=7369;
select * into v_emp(0) from emp where empno=7369;
select * into v_emp(1) from emp where empno=7499;
dbms_output.put_line(v_emp(0).empno||v_emp(0).ename);
dbms_output.put_line(v_emp(1).empno||v_emp(1).ename);
end;