1.PL/SQL是一种块结构语言,意味着PL/SQL程序可以分为逻辑块。PL/SQL块由三个部分组成:定义部分、执行部分、异常处理部分。其中,定义部分用于定于常量、变量、游标、用户自定义异常、复杂数据类型等。 执行部分用于实现应用模块功能,该部分包含了要执行的PL/SQL语句和SQL语句。异常处理部分用于处理执行部分可能出现的运行错误。
PL/SQL块的基础结构:
DECLARE -- 定义部分 BEGIN -- 执行部分 EXCEPTION -- 异常处理部分 END;-- 块结束标记
2.PL/SQL特征:
(1).有利于客户、服务器环境应用运行
(2).适合于客户环境
(3).模块化
(4).过程化
(5).提供大量内置程序包
(6).运行错误的可处理性
3.PL/SQL块的类型:匿名块、子程序、触发器
匿名块:指没有名称的PL/SQL块。可内嵌到应用程序(例如Java)中,也可以在交互环境(例如SQL*Plus)中直接使用。
子程序:包括存储过程(用于执行特定操作)、函数(用于返回特定数据)、包(用于逻辑组合相关的过程和函数)。
触发器:指隐含执行的存储过程。
4.数据类型与变量
例如:
-- 创建表 create table DEPT -- 部门 ( id NUMBER(4) not null constraint PK_DEPT_ID primary key, name VARCHAR2(20) ); create table EMPLOYEE -- 员工 ( id NUMBER(4) not null constraint PK_EMP_ID primary key, name VARCHAR2(20) not null, birthday DATE, address VARCHAR2(100), did NUMBER(4), constraint FK_EMP_DEPT foreign key (DID) references DEPT (ID) ); -- 添加测试数据 INSERT INTO DEPT VALUES(1, '财务部'); INSERT INTO DEPT VALUES(2, '市场部'); INSERT INTO DEPT VALUES(3, '综合部'); INSERT INTO DEPT VALUES(4, '研发部'); INSERT INTO DEPT VALUES(5, '网络部'); INSERT INTO EMPLOYEE VALUES(1, '李飞', TO_DATE('1975.07.03','yyyy.mm.dd'), '四川成都', 1); INSERT INTO EMPLOYEE VALUES(2, '刘兰', TO_DATE('1985.09.03','yyyy.mm.dd'), '四川成都', 1); INSERT INTO EMPLOYEE VALUES(3, '张强', TO_DATE('1987.11.22','yyyy.mm.dd'), '广东广州', 2); INSERT INTO EMPLOYEE VALUES(4, '刘武龙', TO_DATE('1979.07.18','yyyy.mm.dd'), '陕西西安', 2); INSERT INTO EMPLOYEE VALUES(5, '向小梅', TO_DATE('1982.03.03','yyyy.mm.dd'), '四川成都', 2); INSERT INTO EMPLOYEE VALUES(6, '周斌', TO_DATE('1985.11.08','yyyy.mm.dd'), '四川成都', 4); INSERT INTO EMPLOYEE VALUES(7, '王强', TO_DATE('1985.01.25','yyyy.mm.dd'), '四川成都', 4);
-- 定义变量 DECLARE cnt NUMBER(4) := 5; BEGIN DBMS_OUTPUT.PUT_LINE('数字:' || CNT); END; -- %TYPE DECLARE emp_name employee.name%TYPE; -- emp_name类型与employee表中name列的类型一致 BEGIN SELECT name INTO emp_name FROM employee WHERE id=&emp_id; -- &emp_id 从键盘接收输入 DBMS_OUTPUT.PUT_LINE('姓名:' || emp_name); END; -- %ROWTYPE DECLARE rec employee%ROWTYPE; BEGIN SELECT * INTO rec FROM employee WHERE id=1; DBMS_OUTPUT.PUT_LINE('姓名:' || rec.name || ', 生日:' || rec.birthday || ',地址:' || rec.address); END; -- 定义 RECORD DECLARE TYPE emp_type IS RECORD( ename employee.name%TYPE NOT NULL := '匿名', ebirth employee.birthday%TYPE, eaddr employee.address%TYPE ); emp emp_type; BEGIN SELECT name,birthday,address INTO emp FROM employee WHERE id=4; DBMS_OUTPUT.PUT_LINE('姓名:' || emp.ename || ', 生日:' || emp.ebirth || ',地址:' || emp.eaddr); END; -- 定义索引表 DECLARE TYPE emp_name_type IS TABLE OF employee.name%TYPE -- INDEX BY BINARY_INTEGER; INDEX BY VARCHAR2(20); emp_names emp_name_type; BEGIN emp_names('lily') := 'Lily'; emp_names('lucy') := 'Lucy'; emp_names('tom') := 'Tommy'; -- SELECT name INTO emp_names('abc') FROM employee WHERE id=1; DBMS_OUTPUT.PUT_LINE('姓名:' || emp_names('lily') || ',' || emp_names('lucy') || ',' || emp_names('tom')); END; -- 定义VARRAY DECLARE TYPE array_type IS VARRAY(5) OF VARCHAR2(20); arr array_type; BEGIN -- 为各元素赋初值 arr := array_type('a','b',NULL,'c', 'd'); DBMS_OUTPUT.PUT_LINE('第一个:' || arr(1)); DBMS_OUTPUT.PUT_LINE('第三个:' || arr(3)); arr(3) := '张三'; DBMS_OUTPUT.PUT_LINE('修改后第三个:' || arr(3)); END;