PL/SQL是ORACLE的过程化语言,包括一整套的数据类型、条件结构、循环结构和异常处理结构,PL/SQL可以执行SQL语句,SQL语句中也可以使用PL/SQL函数。
默认安装完Oracle后,初学者应该了解下面的一些SQL语句:
1、连接
2、显示当前连接用户
3、查看系统拥有哪些用户
SQL> select * from all_users; |
4、新建用户并授权
SQL> create user a identified by a;(默认建在SYSTEM表空间下) SQL> grant connect,resource to a; |
5、连接到新用户
6、查询当前用户下所有对象
7、建立第一个表
SQL> create table a(a number);
8、查询表结构
9、插入新记录
SQL> insert into a values(1); |
10、查询记录
11、更改记录
12、删除记录
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<=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循环
DECLARE CURSOR C1 IS SELECT VIEW_NAME FROM ALL_VIEWS WHERE ROWNUM<=10 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<=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 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; 变量名 基表名%ROWTYPE 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; |
说明:
当用户要创建一个变量来表示一个基表列或者要创建多个变量来代表一整条记录时,可以实际使用%TYPE属性和%ROWTYPE属性,使用%TYPE属性和%ROWTYPE属性可以保证当基表的结构或者其中某列的数据类型改变了时,用户的PL/SQL代码仍可正常工作。
1.8 怎样用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; |
pl/sql小例
set serveroutput on declare v_empid int(10):=0; v_depid int(10):=0; in_empid varchar2(10):='13'; in_deptid varchar2(10):='1'; in_empname varchar2(10):='shabi'; begin select count(*) into v_empid from emp where empid=in_empid; select count(*) into v_depid from dept where deptid=in_deptid; if v_empid >0 then dbms_output.put_line('该用户编号已存在'); end if; if v_depid =0 then dbms_output.put_line('该部门号不存在'); end if; if v_empid=0 and v_depid>0 then insert into emp(empid,empname,deptid) values(in_empid,in_empname,in_deptid); end if; commit; end; |
分享到:
相关推荐
这本书"Oracle PL/SQL从入门到精通"的配套源代码,显然是为了帮助读者通过实践来深入理解和掌握Oracle数据库的编程技术。 首先,让我们探讨Oracle PL/SQL的基础知识。PL/SQL是Oracle数据库的内置编程语言,由块构成...
Oracle PL/SQL是一种专为Oracle数据库...学习Oracle PL/SQL语言是理解和利用Oracle数据库功能的关键,它提供了更强大的数据库编程能力,适用于数据库管理员(DBA)、开发人员以及需要进行复杂数据库操作的任何用户。
PL/SQL是Oracle数据库系统中的过程式语言,它结合了SQL的数据操作能力与结构化编程语句,使得开发者能够创建复杂的数据处理逻辑和业务规则。本资料“PL/SQL入门到精通书的源代码”是一份针对初学者到高级用户的实践...
PL/SQL(Procedural Language/SQL)是一种过程化语言,属于第三代语言,它与C、C++、Java等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑。它允许SQL的数据操纵语言和查询语句包含在块结构(block_...
- **PL/SQL简介**:PL/SQL(Procedural Language for SQL)是Oracle数据库的一种内嵌式过程化语言,用于增强SQL的功能。它允许在SQL查询的基础上添加控制流语句、变量定义、错误处理等特性。 - **环境搭建与配置**:...
标题中提到的“PL/SQL开发文档1”,说明本文档是关于PL/SQL开发的入门级指导材料,面向希望学习使用PL/SQL进行数据库程序单元开发的用户。文档很可能是Oracle公司内部或其授权的培训机构用于教学目的的官方材料。 ...
Oracle PL/SQL 是一种高级编程语言,用于开发 Oracle 数据库中的存储过程、函数和触发器。PL/SQL language 提供了强大的编程能力,可以实现复杂的业务逻辑,并且与 Oracle 数据库紧密集成。 一、Oracle 简介 ...
1. **什么是PL/SQL语言** PL/SQL是Oracle数据库为数据库管理员和开发人员设计的一种编程语言。它扩展了SQL的功能,允许编写包含控制结构、变量、过程和函数的程序段,这些程序段可以存储在数据库中并按需执行。通过...
SQL(Structured Query Language)是用于与关系型数据库交互的标准语言,而PL/SQL是Oracle特有的过程化语言,用于编写复杂的数据库应用程序。本教程《Oracle 11g SQL和PL/SQL从入门到精通》旨在帮助初学者快速掌握这...
PL/SQL是Oracle专为数据库管理设计的一种结构化查询语言,是Oracle开发人员进行数据库编程的核心工具。这篇“Oracle经典资料及PL/SQL使用指南”的英文版,将帮助学习者深入理解Oracle数据库的基础概念以及PL/SQL的...
通过《PL/SQL从入门到精通》这本书,读者可以从基础开始逐步掌握这些概念和技术,提升在Oracle数据库开发和管理中的技能。书中的实例和练习将帮助读者深入理解并熟练运用PL/SQL,从而在实际工作中更有效地处理数据和...
PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库的一种扩展,它集成了SQL语言的查询功能和过程性编程语言的控制结构,为数据库开发提供了强大的工具。这个"PL/SQL中文帮助手册"是7.0...
PL/SQL则是Oracle数据库中专为处理结构化查询语言(SQL)而设计的一种过程编程语言,它将SQL与程序设计语言结合在一起,使得数据库操作更加高效和灵活。 在"Oracle 11g PL/SQL 从入门到精通(视频讲解)第一章"中,...
【PL/SQL 入门详解】 PL/SQL(Procedural Language/Structured Query Language)是Oracle公司为标准SQL添加的编程扩展,它被深度集成到Oracle数据库系统中,成为数据库管理和开发的重要工具。PL/SQL提供了更丰富的...
Oracle Database 10g PL/SQL入门教程是针对初学者设计的一份教程,旨在帮助读者掌握Oracle数据库系统中PL/SQL编程语言的基础知识。PL/SQL是Oracle数据库特有的编程语言,它结合了SQL(结构化查询语言)的功能,用于...
Oracle PL/SQL(Procedural Language/Structured Query Language)是Oracle数据库系统中的一种编程语言,它结合了SQL的查询...这份"Oracle PL/SQL语言基础"的资料正是为此目的而设计,对初学者来说是一份宝贵的资源。
PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库提供的一种过程化SQL语言,它扩展了SQL的功能,使其能够处理复杂的业务逻辑和数据处理任务。 1.2 **PL/SQL块结构基础** PL/SQL程序由...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据库查询功能和PL的程序设计特性,为Oracle数据库的开发提供了一种高效、灵活的方式。本入门教程旨在帮助初学者快速理解并掌握Oracle PL/SQL的基础知识,通过...
PL/SQL(Procedure Language for SQL)是一种过程化语言,专为Oracle数据库设计。它将SQL语句与传统的程序流程控制结构相结合,使得开发人员能够在数据库内部编写复杂的业务逻辑。这不仅提高了数据处理的速度,还...