Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1467578
  • 博文数量: 416
  • 博客积分: 13005
  • 博客等级: 上将
  • 技术积分: 3297
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 16:26
文章分类

全部博文(416)

文章存档

2014年(1)

2013年(4)

2012年(46)

2011年(64)

2010年(12)

2009年(4)

2008年(40)

2007年(187)

2006年(58)

分类: Oracle

2007-02-02 09:53:34

ORACLE PLSQL使用经验总结_9

使用符合数据类型 
一个PL/SQL表按两个步骤声明(declare),首先声明表的类型,然后一个PL/SQL表声明为这种类型。例: 
DECLARE 
TYPE customer_table_type IS TABLE OF customer%ROWTYPE 
INDEX BY BINARY_INTEGER; 
customer_table customer_table_type; 
声明部分必须先基于CUSTOMER表创建CUSTOMER_TABLE_TYPE 的表的数据类型,然后,把CUSTOMER_TABLE 声明成CUSTOMER_TABLE_TYPE类型。 
一个记录(record)至少要有一个域,必要时可有多个域。你可以声明和引用嵌套的记录。 
记录可以定义为NOT NULL。记录中的数据可以是不同的数据类型。 
DECLARE 
TYPE product_table_type IS TABLE OF product%ROWTYPE 
INDEX BY BINARY_INTEGER; 
product_table product_table_type; 
执行以下语句: 
product_table(10).manufacturer_id := 5; 
PL/SQL
表PRODUCT_TABLE 的记录10中的MANUFACTURER_ID域被设置为5。 
如果不知道数据
库字段的数据类型和数目,或者运行时,数据库字段的数据类型和数目可能会改变,可使用%ROWTYPE属性来声明一个PL/SQL域。%ROWTYPE属性可根据数据库表格或视图的字段集合,声明一个PL/SQL记录。 
BINARY_INTEGER 
是主关键字(primary key)的数据类型,用作PL/SQL的索引。 
编写显式游标 
游标FOR循环立时不需要FETCH语句的。游标打开,在循环中每次重复提取一行,所有的行都处理后,游标会自动关闭。 
控制显式游标的四个命令里,CURSOR语句用于声明一个显式游标,定义参数。OPEN语句用于执行查询和为引用的变量赋值,如果查询没有返回行,PL/SQL不会产生异常。FETCH语句和INTO子句用于把当前行的值提取到变量中。在完成行的处理后,CLOSE语句会关闭游标,释放行的活动集合,游标关闭后可以重新打开并建立新的活动集合。 
显式游标用于返回多于一行的查询,隐式游标会被隐式声明,用于所有的DML语句和SELECT语句,每一次只处理一行。隐式游标不能通过使用OPEN, FETCH, 和CLOSE语句控制。显式游标用于个别地处理查询返回的多行数据。 
在PL/SQL的执行部分为一个记录赋值的语法: 
record_name.field_name := expression; 
高级显式游标概念 
伴随FOR UPDATE子句一起使用的UPDATE 和 DELETE 语句中可以使用WHERE CURRENT OF 子句。WHERE CURRENT OF字句用于更新或删除当前行。FOR UPDATE OF子句会锁定被SELECT语句影响的行。 
DECLARE 
CURSOR inv_cursor (p_man_id NUMBER, p_name VARCHAR2) 
IS SELECT id, name FROM inventory 
WHERE manufacturer_id = p_man_id AND name = p_name; 
如果你
创建了一个带参数的游标,你可以在打开游标时传递值。要把值传递到游标INV_CURSOR,执行以下句子:OPEN inv_cursor (45094, 'Cable'); 
游标打开时,45094和‘Cable’会传递到参数P_MAN_ID和 P_NAME。 
你可以在FROM子句中使用子
查询来为查询创建一个数据源,这样的查询可以用作游标的数据源。 
如果你声明游
标时定义了一个带参数的游标,你必须指定指定参数的数据类型,但不用指定大小。处理例外 
声明部分用于声明ORACLE服务器的非预定义异常和用户定义异常,俘获非预定义异常先要在声明部分声明异常的名称。语法:exception EXEPTION; 
然后把声明的异常和标准的ORACLE服务器错误编号相关联,使用EXCEPTION_INIT语句,语法:PRAGMA EXCEPTION_INIT (exception,error_number); 
俘
获用户自定义异常,先要在声明部分声明用户自定义异常的名称,语法: 
exception EXEPTION; 
然后在执行部分,使用RAISE语句显式引发异常,语法:RAISE exception; 
当一个子
块处理异常后,它会正常结束,并且控制在封闭块(enclosing block)的子块END语句后恢复。如果PL/SQL引发了异常,而当前块没有该异常的处理程序,异常会在封闭块中传播,直到它找到一个处理程序。如果上述块均未处理该异常,这将会在主机环境中引起一个未处理异常。当异常传播到封闭块时,块的其余部分将被绕过。 
一些预定义的异常: 
NO_DATA_FOUND 
单行SELECT查询没有返回数据。 
TOO_MANY_ROWS 
单行SELECT查询返回多行数据。 
INCALID_CURSOR 
发生非法游标操作。 
ZERO_DIVIDE 
试图被0除。 
DUP_VAL_ON_INDEX 
试图在具有唯一索引的字段中插入重复值。 
WHEN OTHERS
子句放置在所有其他异常处理自居的后面,用于所有未显示列出的异常。

阅读(1042) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~