PL/SQL入门[zt]

转载 2006年06月23日 20:44:00

1.1 PL/SQL简介
1.2 创建PL/SQL程序块
1.3 PL/SQL数据类型
1.4 处理PL/SQL的异常
1.4.1 PL/SQL的异常
1.4.2 自定义异常处理
1.4.3 自定义异常
1.5 在PL/SQL中单条记录的查询
1.6 用光标查询多条记录
1.6.1 使用光标的基本方法
1.6.2 使用光标FOR循环
1.6.3 带参数的光标
1.7 创建代表数据库记录和列的变量
1.8 怎样用PL/SQL表实现数组功能


[Ref: http://www.oradb.net/plsql.htm ]

1.1 PL/SQL简介

PL/SQLORACLE的过程化语言,包括一整套的数据类型、条件结构、循环结构和异常处理结构,PL/SQL可以执行SQL语句,SQL语句中也可以使用PL/SQL函数。

DECLAREBEGINEXCEPTION
END;
1.3 PL/SQL数据类型

名称

类型

说明

NUMBER

数字型

能存放整数值和实数值,并且可以定义精度和取值范围

BINARY_INTEGER

数字型

可存储带符号整数,为整数计算优化性能

DEC

数字型

NUMBER

的子类型,小数

DOUBLE PRECISION

数字型

NUMBER

的子类型,高精度实数

INTEGER

数字型

NUMBER

的子类型,整数

INT

数字型

NUMBER

的子类型,整数

NUMERIC

数字型

NUMBER

的子类型,与NUMBER等价

REAL

数字型

NUMBER

的子类型,与NUMBER等价

SMALLINT

数字型

NUMBER

的子类型,取值范围比INTEGER

VARCHAR2

字符型

存放可变长字符串,有最大长度

CHAR

字符型

定长字符串

LONG

字符型

变长字符串,最大长度可达32,767

DATE

日期型

以数据库相同的格式存放日期值

BOOLEAN

布尔型

TRUE OR FALSE

ROWID

ROWID

存放数据库的行号

例子:DECLARE
ORDER_NO NUMBER(3);
CUST_NAME VARCHAR2(20);
ORDER_DATE DATE;
EMP_NO INTEGER:=25;
PI CONSTANT NUMBER:=3.1416;
BEGIN
NULL;
END;
1.4
处理PL/SQL的异常1.4.1 PL/SQL的异常

例如:DECLARE
X NUMBER;
BEGIN
X:= 'yyyy';--Error Here
EXCEPTION WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('EXCEPTION HANDED');
END;

实现技术:EXCEPTION WHEN first_exception THENWHEN second_exception THENWHEN OTHERS THEN
/*THERS
异常处理器必须排在最后,它处理所有没有明确列出的异常。*/
END;

1.4.2 预定义异常

 1.4.3 自定义异常处理

DECLARE
BAD_ROWID EXCEPTION;
X ROWID;
PRAGMA EXCEPTION_INIT(BAD_ROWID,-01445);
BEGIN
SELECT ROWID INTO X FROM TAB
WHERE ROWNUM=1;
EXCEPTION WHEN BAD_ROWID THEN
DBMS_OUTPUT.PUT_LINE('CANNOT QUERY ROWID FROM THIS VIEW');
END;
注意:-01445 因为PRAGMA EXCEPTION_INIT命令把这个变量(-01455)
连接到
这个
ORACLE
错误,该语句的语法如下:PRAGMA EXCEPTION_INIT(exception_name, error_number);其中error_number是负数,因为错误号被认为负数,当定义错误时记住使用负号1.4.4 自定义异常

异常不一定必须是oracle返回的系统错误,用户可以在自己的应用程序中创
建可触发及可处理的自定义异常
DECLARE
SALARY_CODE VARCHAR2(1);
INVALID_SALARY_CODE EXCEPTION;
BEGIN
SALARY_CODE:='X';
IF SALARY_CODE NOT IN('A', 'B', 'C') THEN
RAISE INVALID_SALARY_CODE;
END IF;
EXCEPTION WHEN INVALID_SALARY_CODE THEN
DBMS_OUTPUT.PUT_LINE('INVALID SALARY CODE');
END;
1.5
PL/SQL中单条记录的查询

在PL/SQL内,有时在没有定义显式光标的情况下需要查询单条记录,并把记录的数据赋给变量。
DECLARE
ln_dno NUMBER;
lvs_dname VARCHAR2(40);
BEGIN
SELECT DEPT_NO,DEPT_NAME
INTO ln_dno,lvs_dname
FROM dept
WHERE DEPT_NO=1;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ln_dno)||'.'||lvs_dname);
EXCEPTION WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO DATA_FOUND')
; WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS');
END;

1.6 用光标查询多条记录

光标(CURSOR)是指向一个称为上下文相关区的区域的指针,这个区域在服务器的处理过程全局区(PGA)内,当服务器上执行了一个查询后,查询返回的记录集存放在上下文相关区,通过光标上的操作可以把这些记录检索到客户端的应用程序。

DECLARE
CURSOR C1 IS SELECT VIEW_NAME FROM ALL_VIEWS
WHERE ROWNUM<=10
ORDER BY VIEW_NAME;
VNAME VARCHAR2(40);
BEGIN
OPEN C1;
FETCH C1 INTO VNAME;
WHILE C1%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(C1%ROWCOUNT)||' '||VNAME);
FETCH C1 INTO VNAME;
END LOOP;
END;

属性

含量

%FOUND

布尔型属性,当最近一次该记录时成功返回,则值为TRUE

%NOTFOUND

布尔型属性,它的值总与%FOUND属性的值相反

%ISOPEN

布尔型属性,当光标是打开时返回TRUE

%ROWCOUNT

数字型属性,返回已从光标中读取的记录数

 1.6.2 使用光标FOR循环

1.7 创建代表数据库记录和列的变量

变量名 基表名.列名%TYPE变量名 基表名%ROWTYPE说明:
当用户要创建一个变量来表示一个基表列或者要创建多个变量来代表一整条记录时,可以实际使用%TYPE属性和%ROWTYPE属性,使用%TYPE属性和%ROWTYPE属性可以保证当基表的结构或者其中某列的数据类型改变了时,用户的PL/SQL代码仍可正常工作。
DECLARE
D VEQU12%ROWTYPE;
BEGIN
SELECT ASSET12ID,ASSET12NAME
INTO D.ASSET12ID, D.ASSET12NAME
FROM VEQU12;
DBMS_OUTPUT.PUT_LINE(D.ASSET12ID);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS');
END;1.9
怎样用PL/SQL表实现数组功能

PL/SQL表与其他过程化语言(如C语言)的一维数组类似。实现PL/SQL表需要创建一个数据类型并另外进行变量说明。
Type <类型名> Is
Table Of <数据类型>
Index by Binary_Integer;
以下为一个例子:
Declare
Type Array_type is
Table Of Number
Index by Binary_Integer;
My_Array Array_type;
Begin
For I In 1..10 Loop
My_Array(I) := I*2;
End Loop;
For I In 1..10 Loop
Dbms_Output.Put_line(To_char(My_Array(I)));
End Loop;
End;

DECLARE
D_NO DEPT.DEPT_NO%TYPE;
D_NAME DEPT.DEPT_NAME%TYPE;
BEGIN
SELECT DEPT_NO,DEPT_NAME INTO D_NO,D_NAME
FROM DEPT;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(D_NO));
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
END;
1.6.3 带参数的光标

DECLARE
CURSOR C1(VIEW_PATTERN VARCHAR2) IS
SELECT VIEW_NAME
FROM ALL_VIEWS
WHERE VIEW_NAME LIKE VIEW_PATTERN||'%' AND
ROWNUM<=10
ORDER BY VIEW_NAME;
VNAME VARCHAR2(40);
BEGIN
FOR I IN C1('USER_AR') LOOP
DBMS_OUTPUT.PUT_LINE(I.VIEW_NAME);
END LOOP;
DBMS_OUTPUT.PUT_LINE();
FOR I IN C1('USER') LOOP
DBMS_OUTPUT.PUT_LINE(I.VIEW_NAME);
END LOOP;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('AAA');
END;

1.7 创建代表数据库记录和列的变量

变量名 基表名.列名%TYPE变量名 基表名%ROWTYPE说明:
当用户要创建一个变量来表示一个基表列或者要创建多个变量来代表一整条记录时,可以实际使用%TYPE属性和%ROWTYPE属性,使用%TYPE属性和%ROWTYPE属性可以保证当基表的结构或者其中某列的数据类型改变了时,用户的PL/SQL代码仍可正常工作。

DECLARE
D VEQU12%ROWTYPE;
BEGIN
SELECT ASSET12ID,ASSET12NAME
INTO D.ASSET12ID, D.ASSET12NAME
FROM VEQU12;
DBMS_OUTPUT.PUT_LINE(D.ASSET12ID);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS');
END;

1.9 怎样用PL/SQL表实现数组功能

PL/SQL表与其他过程化语言(如C语言)的一维数组类似。实现PL/SQL表需要创建一个数据类型并另外进行变量说明。
Type <类型名> Is
Table Of <数据类型>
Index by Binary_Integer;
以下为一个例子:
Declare
Type Array_type is
Table Of Number
Index by Binary_Integer;
My_Array Array_type;
Begin
For I In 1..10 Loop
My_Array(I) := I*2;
End Loop;
For I In 1..10 Loop
Dbms_Output.Put_line(To_char(My_Array(I)));
End Loop;
End;

DECLARE
D_NO DEPT.DEPT_NO%TYPE;
D_NAME DEPT.DEPT_NAME%TYPE;
BEGIN
SELECT DEPT_NO,DEPT_NAME INTO D_NO,D_NAME
FROM DEPT;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(D_NO));
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
END;

PL/SQL基础语法入门

先前安装了PL/SQL软件 PL/SQL全称为Procedural Language/SQL。 PL/SQL也是一种程序语言,叫做过程化SQL语言,是Oracle数据库对SQL语句...
  • chance2015
  • chance2015
  • 2015年12月26日 18:20
  • 2350

PL/SQL基础(1):语法

目录 1、什么是PL/SQL? 2、PL/SQL基本结构 3、PL/SQL符号定义 4、PL/SQL数据类型 5、PL/SQL条件句法 6、PL/SQL循环 什么是PL/SQL? PL/SQL...
  • dou3516
  • dou3516
  • 2016年09月03日 19:29
  • 695

PL/SQL编程入门之一

关于存储过程、包存储过程是存储在数据库中的用户自定义的程序通俗叫法。根据Oracle的操作手册,与SQL/PSM相似的功能可以分为以下三个部分,·PL/SQL procedure / stored p...
  • slamdunkning1983
  • slamdunkning1983
  • 2008年04月24日 17:20
  • 1491

Oracle PL/SQL 存储过程 入门之案例实践

一. 案例介绍  某数据库有两张表,是关于某公司员工资料、薪水和部门信息的,它们分别是emp表和dept表,两张表的结构如下:  要求如下:  1、按照上表结构建立相应的表,并每张表写入5组合法数据。...
  • laoyang5219
  • laoyang5219
  • 2007年07月30日 10:27
  • 1176

PL/SQL 存储过程入门小例子

1.为什么要有存储过程? 过程是指用于执行特定操作的PL/SQL块。如果客户应用经常需要执行特定操作,那么可以考虑基于这些操作建立过程。(类似C函数,Java方法) 2.oracle的存储过程里的传递...
  • dazengq
  • dazengq
  • 2015年06月12日 13:50
  • 3612

oracle 数据库入门pl/sql 基本操作

pl/sql基本使用总结
  • lsf921016
  • lsf921016
  • 2017年02月25日 04:58
  • 350

源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 1

随书附带的源码没有序号,部分有bug,调试过程中一并更正。 --代码2.1 使用书序结构计算员工薪资 DECLARE v_sal1 NUMBER; v_sal2 NUMBER; ...
  • hpdlzu80100
  • hpdlzu80100
  • 2016年07月13日 12:21
  • 2855

Oracle PL/SQL入门之案例实践

 一. 案例介绍  某数据库有两张表,是关于某公司员工资料、薪水和部门信息的,它们分别是emp表和dept表,两张表的结构如下:  要求如下:  1、按照上表结构建立相应的表,并每张表写入5组合法数据...
  • jiafeia1
  • jiafeia1
  • 2004年09月30日 17:04
  • 794

《精通Oracle10g PL/SQL编程》 是本oracle入门的好书

从网上找了一本读完感觉这本书还是很不错的.很适合刚接触oracle的程序员们阅读.这本书从一些最基本的知识入手,配合着简单易懂的实例,让你一点一点地从简单地知识点切入然后一步一步地深入,每一步都会配合...
  • xuwedo2003
  • xuwedo2003
  • 2011年04月30日 01:33
  • 1777

PL/SQL developer基础语法学习(一)之变量

PL/SQL中的变量1)、声明--变量名 类型 :=初始值 v_str varchar2(10):='abc'; 注意:变量必须在declare语句块中声明。2)、简单类型 number:数字 ...
  • xshuaiwen
  • xshuaiwen
  • 2017年03月11日 14:14
  • 1028
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PL/SQL入门[zt]
举报原因:
原因补充:

(最多只允许输入30个字)