分享
 
 
 

PL/SQL入门

王朝mssql·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

1.1 PL/SQL简介

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

默认安装完Oracle后,初学者应该了解下面的一些SQL语句:

1、连接

SQL*Plus system/manager

2、显示当前连接用户

SQL show user

3、查看系统拥有哪些用户

SQL select * from all_users;

4、新建用户并授权

SQL create user a identified by a;(默认建在SYSTEM表空间下)

SQL grant connect,resource to a;

5、连接到新用户

SQL conn a/a

6、查询当前用户下所有对象

SQL select * from tab;

7、建立第一个表

SQL create table a(a number);

8、查询表结构

SQL desc a

9、插入新记录

SQL insert into a values(1);

10、查询记录

SQL select * from a;

11、更改记录

SQL update a set a=2;

12、删除记录

SQL delete from a;

13、回滚

SQL roll;

SQL rollback;

14、提交

SQL commit;

1.2 创建PL/SQL程序块

DECLARE

BEGIN

EXCEPTION

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 THEN

WHEN second_exception THEN

WHEN OTHERS THEN

/*THERS异常处理器必须排在最后,它处理所有没有明确列出的异常。*/

END;

1.4.2 预定义异常

异常名称 ORACLE错误 说明

CURSOR_ALREADY_OPEN ORA-6511 试图打开一个已打开的光标

DUP_VAL_ON_INDEX ORA-0001 试图破坏一个唯一性限制

INVALID_CURSOR ORA-1001 试图使用一个无效的光标

INVALID_NUMBER ORA-1722 试图对非数字值进行数字操作

LOGIN_DENIED ORA-1017 无效的用户名或者口令

NO_DATA_FOUND ORA-1403 查询未找到数据

NOT_LOGGED_ON ORA-1012 还未连接就试图数据库操作

PROGRAM_ERROR ORA-6501 内部错误

ROWTYPE_MISMATCH ORA-6504 主变量和光标的类型不兼容

STORAGE_ERROR ORA-6500 内部错误

TIMEOUT_ON_RESOURCE ORA-0051 发生超时

TOO_MANY_ROWS ORA-1422 SELECT INTD命令返回的多行

TRANSACTION_BACKED_OUT ORA-006 由于死锁提交被退回

VALUE_ERROR ORA-6502 转换或者裁剪错误

ZERO_DIVIDE ORA-1476 试图被零除

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)内,当服务器上执行了一个查询后,查询返回的记录集存放在上下文相关区,通过光标上的操作可以把这些记录检索到客户端的应用程序。

1.6.1 使用光标的基本方法

DECLARE

CURSOR C1 IS SELECT VIEW_NAME FROM ALL_VIEWS

WHERE ROWNUM

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循环

DECLARE

CURSOR C1 IS

SELECT VIEW_NAME

FROM ALL_VIEWS

WHERE ROWNUM

ORDER BY VIEW_NAME;

BEGIN

FOR I IN C1 LOOP

DBMS_OUTPUT.PUT_LINE(I.VIEW_NAME);

END LOOP;

END LOOP;

EXCEPTION WHEN OTHERS 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

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

DECLARE

D_NO DEPT.DEPT_NO%TYPE;

D_NAME DEPT.DEPT_NAME%TYPE;

BEGIN

SELECT DEPT_NO,DEPT_NAME INTO D_NO,D_NAME

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有