欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » Oracle数据库应用教程 » 正文

基本知识:PL/SQL 简介

创建时间:2012年04月03日 21:52  阅读次数:(4444)
分享到:

1,PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言
2,PL/SQL 是对 SQL 的扩展
3,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构
4,可用于创建存储过程、触发器和程序包,给SQL语句的执行添加程序逻辑
5,与 Oracle 服务器和 Oracle 工具紧密集成,具备可移植性、灵活性和安全性

PL/SQL 的优点
支持 SQL,在 PL/SQL 中可以使用:
数据操纵命令
事务控制命令
游标控制
SQL 函数和 SQL 运算符
支持面向对象编程 (OOP) 
可移植性,可运行在任何操作系统和平台上的Oralce 数据库
更佳的性能,PL/SQL 经过编译执行

与 SQL 紧密集成,简化数据处理。
支持所有 SQL 数据类型
支持 NULL 值
支持 %TYPE 和 %ROWTYPE 属性类型

安全性,可以通过存储过程限制用户对数据的访问

PL/SQL 的体系结构
PL/SQL 引擎驻留在 Oracle 服务器中
该引擎接受 PL/SQL 块并对其进行编译执行


PL/SQL 块简介
PL/SQL 块是构成 PL/SQL 程序的基本单元
将逻辑上相关的声明和语句组合在一起
PL/SQL 分为三个部分,声明部分、可执行部分和异常处理部分
   [DECLARE 
declarations]
BEGIN
executable statements
[EXCEPTION 
handlers]
END;

示例:

DECLARE
  qty_on_hand NUMBER(5);--声明部分定义变量、游标和自定义异常
BEGIN
--包含 SQL 和 PL/SQL 语句的可执行部分
  SELECT quantity INTO qty_on_hand
  FROM Products
  WHERE product = '芭比娃娃'
  FOR UPDATE OF quantity;
  IF qty_on_hand  > 0 THEN
UPDATE Products SET quantity = quantity + 1
WHERE product = '芭比娃娃';
INSERT INTO purchase_record
VALUES ('已购买芭比娃娃', SYSDATE);
  END IF;
  COMMIT;
EXCEPTION  /* 异常处理语句 */
--指定出现错误时需要执行的操作
  WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('出错:'|| SQLERRM);  
END;

变量和常量


PL/SQL 块中可以使用变量和常量
在声明部分声明,使用前必须先声明
声明时必须指定数据类型,每行声明一个标识符
在可执行部分的 SQL 语句和过程语句中使用

声明变量和常量的语法:
identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr];

给变量赋值有两种方法:
1,使用赋值语句 :=
2,使用 SELECT INTO 语句

示例:DECLARE
  icode VARCHAR2(6);
  p_catg VARCHAR2(20);
  p_rate NUMBER;
  c_rate CONSTANT NUMBER := 0.10;
BEGIN
  ...
  icode := 'i205';
  SELECT p_category, itemrate * c_rate
  INTO  p_catg, p_rate
  FROM itemfile WHERE itemcode = icode;
  ...
END;

数据类型


字符数据类型
字符数据类型包括:
CHAR
VARCHAR2
LONG
RAW
LONG RAW
PL/SQL 的数据类型与 SQL数据类型的比较


日期时间和布尔数据类型
日期时间类型
存储日期和时间数据,常用的两种日期时间类型:DATE与TIMESTAMP
布尔数据类型
此类别只有一种类型,即BOOLEAN类型,用于存储逻辑值(TRUE、FALSE和NULL)
注意:
1,不能向数据库中插入BOOLEAN数据
2,不能将列值保存到BOOLEAN变量中
3,只能对BOOLEAN变量执行逻辑操作

LOB  数据类型
用于存储大文本、图像、视频剪辑和声音剪辑等非结构化数据。
LOB 数据类型可存储最大 4GB的数据。
LOB 类型包括:
BLOB   将大型二进制对象存储在数据库中
CLOB   将大型字符数据存储在数据库中
NCLOB   存储大型UNICODE字符数据
BFILE 将大型二进制对象存储在操作系统文件中

LOB 类型的数据库列仅存储定位符,该定位符指向大型对象的存储位置
DBMS_LOB程序包用于操纵 LOB 数据
示例:
SET SERVEROUTPUT ON
DECLARE
  clob_var   CLOB;
  amount INTEGER;
  offset INTEGER;
  output_var VARCHAR2(100);
BEGIN
  SELECT chapter_text INTO clob_var 
  FROM my_book_text
  WHERE chapter_id=5;
  amount := 24;  -- 要读取的字符数
  offset := 1;   -- 起始位置
  DBMS_LOB.READ(clob_var,amount,offset,output_var);
  DBMS_OUTPUT.PUT_LINE(output_var);
END;
/

复合类型
  PL/SQL语言的复合类型是用户定义的,复合类型是标量类型的组合,使用这些数据类型可以拓宽应用范围。先定义,再声明,最后才能使用。

常用的复合类型:属性类型,记录类型,表类型,数组类型.

属性类型
用于引用数据库列的数据类型,以及表示表中一行的记录类型
属性类型有两种:
%TYPE  -  引用变量和数据库列的数据类型
%ROWTYPE  -  提供表示表中一行的记录类型
使用属性类型的优点:
不需要知道被引用的表列的具体类型,如果被引用对象的数据类型发生改变,PL/SQL 变量的数据类型也随之改变

记录类型
由一组相关的记录成员组成的,通常用来表示对应数据库表中的一行。使用PL/SQL记录时应自定义记录类型和记录变量,也可以使用%ROWTYPE属性定义记录变量。引用记录成员时,必须要记录变量作为前缀。
自定义记录类型和记录变量的语法: 
TYPE <记录类型名 > IS RECORD(  
 <数据项 1 > <数据类型 >[NOT NULL[:=<表达式 1 >]],   
<数据项 2 > <数据类型 >[NOT NULL[:=<表达式 2 >]],  
 ……   
<数据项 n > <数据类型 >[NOT NULL[:=<表达式 n >]]);
<记录变量名 >  <记录类型名 >;

示例:
例 6-2 将雇员信息定义为记录类型如下:
  declare
   type emp_record_type is record
(v_ename   emp.ename%type,
 v_job  emp.job%type,
 v_sal  emp.sal%type);
   emp_rec emp_record_type;
  begin
select ename,job,sal into emp_rec
from emp where empno=&eno;
   dbms_output.put_line(emp_rec.v_ename||':'||
   emp_rec.v_job||':'||emp_rec.v_sal);
 end;


表类型
是一种复合数据类型,保存在数据缓冲区中的没有特别的存储次序的、可以离散存储的数据结构,它可以是一维的,也可以是二维的。
语法:
TYPE <表类型名 > IS TABLE OF <数据类型 > INDEX BY BINARY_INTEGER;
<表变量名 ><表类型名 >;
表类型名是用户定义的,数据类型是表中元素的数据类 型,表中所有元素的数据类型是相同的,索引变量缺省为 BINARY_INTEGER(范围介于-231-1~231-1之间)类型的变量,用于指定索引表元素下标的数据类型。

示例:
例6.3 索引表类型的定义

SQL > DECLARE
 TYPE ename_table_type IS TABLE OF emp.ename%TYPE 
 INDEX BY BINARY_INTEGER;
 Ename_table ename_table_type;
   BEGIN
 SELECT ename INTO ename_table(1) FROM emp
   WHERE empno=7902;
 Dbms_output.put_line('员工名:'|| ename_table(1));
   END;
 /


数组类型
数组也是一种复合类型,与表不同的是声明了一个数组,就确定了数组中元素的数目。同时,数组存储时,其元素的次序是固定且连续的,而且索引变量从 1 开始一直到其定义的最大值为止。
语法如下:
TYPE <数组类型名 > IS VARRAY  (<MAX_SIZE >)OF <数据类型 >;
<表变量名 ><表类型名 >;
数组类型名是用户定义的,数据类型是数组中元素的数据类型,所有数组元素的数据类型是一致的,MAX_SIZE 指明数组元素个数的最大值。

引用类型
   PL/SQL 语言中的引用类型是用户定义的指向某一数据缓冲区的指针,与 C 语言中的指针类似。游标即为 PL/SQL 语言的引用类型。

本示例适用于教学大纲,电子档下载地址:Oracle学习情境4:统计分析与报表

来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 98+88=? 的结果(结果是:186)
结  果: