PL/SQL编程基础

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;     

posted on 2015-06-24 18:44  陌生人的问候  阅读(147)  评论(0编辑  收藏  举报