码迷,mamicode.com
首页 > 数据库 > 详细

PL/SQL编程基础

时间:2015-06-24 20:40:37      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

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;     

PL/SQL编程基础

标签:

原文地址:http://www.cnblogs.com/moshengren-java/p/4598405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!