`
hdy007
  • 浏览: 31217 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
阅读更多
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<=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 PL/SQL从入门到精通"的配套源代码,显然是为了帮助读者通过实践来深入理解和掌握Oracle数据库的编程技术。 首先,让我们探讨Oracle PL/SQL的基础知识。PL/SQL是Oracle数据库的内置编程语言,由块构成...

    Oracle PL/SQL语言入门基础

    Oracle PL/SQL是一种专为Oracle数据库...学习Oracle PL/SQL语言是理解和利用Oracle数据库功能的关键,它提供了更强大的数据库编程能力,适用于数据库管理员(DBA)、开发人员以及需要进行复杂数据库操作的任何用户。

    PL/SQL入门到精通书的源代码

    PL/SQL是Oracle数据库系统中的过程式语言,它结合了SQL的数据操作能力与结构化编程语句,使得开发者能够创建复杂的数据处理逻辑和业务规则。本资料“PL/SQL入门到精通书的源代码”是一份针对初学者到高级用户的实践...

    PL_SQL基础 Oracle PL/SQL语言入门

    PL/SQL(Procedural Language/SQL)是一种过程化语言,属于第三代语言,它与C、C++、Java等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑。它允许SQL的数据操纵语言和查询语句包含在块结构(block_...

    Oracle PL/SQL程序设计(第5版)(上下册)

    - **PL/SQL简介**:PL/SQL(Procedural Language for SQL)是Oracle数据库的一种内嵌式过程化语言,用于增强SQL的功能。它允许在SQL查询的基础上添加控制流语句、变量定义、错误处理等特性。 - **环境搭建与配置**:...

    PL/SQL开发文档1

    标题中提到的“PL/SQL开发文档1”,说明本文档是关于PL/SQL开发的入门级指导材料,面向希望学习使用PL/SQL进行数据库程序单元开发的用户。文档很可能是Oracle公司内部或其授权的培训机构用于教学目的的官方材料。 ...

    Oracle PL/SQL编程及最佳实践

    Oracle PL/SQL 是一种高级编程语言,用于开发 Oracle 数据库中的存储过程、函数和触发器。PL/SQL language 提供了强大的编程能力,可以实现复杂的业务逻辑,并且与 Oracle 数据库紧密集成。 一、Oracle 简介 ...

    pl/sql学习笔记

    1. **什么是PL/SQL语言** PL/SQL是Oracle数据库为数据库管理员和开发人员设计的一种编程语言。它扩展了SQL的功能,允许编写包含控制结构、变量、过程和函数的程序段,这些程序段可以存储在数据库中并按需执行。通过...

    Oracle+11g+SQL和PL+SQL从入门到精通

    SQL(Structured Query Language)是用于与关系型数据库交互的标准语言,而PL/SQL是Oracle特有的过程化语言,用于编写复杂的数据库应用程序。本教程《Oracle 11g SQL和PL/SQL从入门到精通》旨在帮助初学者快速掌握这...

    oracle 经典资料及PL/SQL 使用指南 英文版

    PL/SQL是Oracle专为数据库管理设计的一种结构化查询语言,是Oracle开发人员进行数据库编程的核心工具。这篇“Oracle经典资料及PL/SQL使用指南”的英文版,将帮助学习者深入理解Oracle数据库的基础概念以及PL/SQL的...

    pl/sql精通

    通过《PL/SQL从入门到精通》这本书,读者可以从基础开始逐步掌握这些概念和技术,提升在Oracle数据库开发和管理中的技能。书中的实例和练习将帮助读者深入理解并熟练运用PL/SQL,从而在实际工作中更有效地处理数据和...

    PL/SQL中文帮助手册

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库的一种扩展,它集成了SQL语言的查询功能和过程性编程语言的控制结构,为数据库开发提供了强大的工具。这个"PL/SQL中文帮助手册"是7.0...

    Oracle 11g PL/SQL 从入门到精通(视屏讲解)第一章

    PL/SQL则是Oracle数据库中专为处理结构化查询语言(SQL)而设计的一种过程编程语言,它将SQL与程序设计语言结合在一起,使得数据库操作更加高效和灵活。 在"Oracle 11g PL/SQL 从入门到精通(视频讲解)第一章"中,...

    非常合适的PL/sql 入门

    【PL/SQL 入门详解】 PL/SQL(Procedural Language/Structured Query Language)是Oracle公司为标准SQL添加的编程扩展,它被深度集成到Oracle数据库系统中,成为数据库管理和开发的重要工具。PL/SQL提供了更丰富的...

    Oracle Database 10g PL/SQL入门教程

    Oracle Database 10g PL/SQL入门教程是针对初学者设计的一份教程,旨在帮助读者掌握Oracle数据库系统中PL/SQL编程语言的基础知识。PL/SQL是Oracle数据库特有的编程语言,它结合了SQL(结构化查询语言)的功能,用于...

    oracle PL/ SQL语言基础

    Oracle PL/SQL(Procedural Language/Structured Query Language)是Oracle数据库系统中的一种编程语言,它结合了SQL的查询...这份"Oracle PL/SQL语言基础"的资料正是为此目的而设计,对初学者来说是一份宝贵的资源。

    pl/sql开发

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库提供的一种过程化SQL语言,它扩展了SQL的功能,使其能够处理复杂的业务逻辑和数据处理任务。 1.2 **PL/SQL块结构基础** PL/SQL程序由...

    oracle pl/sql入门教程

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据库查询功能和PL的程序设计特性,为Oracle数据库的开发提供了一种高效、灵活的方式。本入门教程旨在帮助初学者快速理解并掌握Oracle PL/SQL的基础知识,通过...

    PL/SQL详解 从入门到精通 英文版

    PL/SQL(Procedure Language for SQL)是一种过程化语言,专为Oracle数据库设计。它将SQL语句与传统的程序流程控制结构相结合,使得开发人员能够在数据库内部编写复杂的业务逻辑。这不仅提高了数据处理的速度,还...

Global site tag (gtag.js) - Google Analytics