stock_info stock_cur%ROWTYPE BEGIN OPEN stock_cur('ORCL'); FETCH stock_cur INTO stock_info; 使用赋值语句将整个记录复制给另一个记录是一项非常有用的技术,不过记录必须精确地被声明为相同的类型,不能是基于两个不同的TYPE语句来获得相同的结构。 例: DECLARE TYPE stock_quote_rec IS RECORD (symbol stocks.symbol%TYPE ,bid NUMBER(10,4) ,ask number(10,4) ,volume NUMBER ); TYPE stock_quote_too IS RECORD (symbol stocks.symbol%TYPE ,bid NUMBER(10,4) ,ask number(10,4) ,volume NUMBER ); --这两个记录看上去是一样的,但实际上是不一样的 stock_one stocks_quote_rec; stock_two stocks_quote_rec; --这两个域有相同的数据类型和大小 stock_also stock_rec_too;--与stock_quote_rec是不同的数据类型 BEGIN stock_one.symbol:='orcl'; stock_one.volume:=1234500; stock_two:=stock_one;--正确 syock_also:=stock_one;--错误,数据类型错误 stock_also.symbol:=stock_one.symbol; stock_also.volume:=stock_one.volume; 记录不能用于INSERT语句和将记录直接用于比较,下面两种情况是错误的: INSERT INTO stocks VALUES (stock_record); 和 IF stock_rec1>stock_rec2 THEN 要特别注意考试中试题中有可能用%ROWTYPE来欺骗你,但这是错误的,记住这一点。还有可能会出现用记录排序的情况,ORACLE不支持记录之间的直接比较。对于记录比较,可以采用下面的两个选择: . 设计一个函数,该函数返回scalar数据类型,使用这个函数比较记录,如 IF sort_rec(stock_one)>sort_rec(stock_two) THEN . 可以使用数据库对象,数据库对象可以使用order或map方法定义,允许oracle对复合数据类型进行比较。关于数据库对象的讨论已经超越了本文的范围,要详细了解数据库对象,可以查阅oracle手册。 PL/SQL集合 集合与其他语言中的数组相似,在ORACLE7.3及以前的版本中只有一种集合称为PL/SQL表,这种类型的集合依然保留,就是索引(INDEX_BY)表,与记录相似,集合在定义的时候必须使用TYPE语句,然后才是创建和使用这种类型的变量。 集合的类型 PL/SQL有三种类型的集合 . Index_by表 . 嵌套表 . VARRAY 这三种类型的集合之间由许多差异,包括数据绑定、稀疏性(sparsity)、数据库中的存储能力都不相同。绑定涉及到集合中元素数量的限制,VARRAY集合中的元素的数量是有限,Index_by和嵌套表则是没有限制的。稀疏性描述了集合的下标是否有间隔,Index_by表总是稀疏的,如果元素被删除了嵌套表可以是稀疏的,但VARRAY类型的集合则是紧密的,它的下标之间没有间隔。 Index_by表不能存储在数据库中,但嵌套表和VARRAY可以被存储在数据库中。 虽然这三种类型的集合有很多不同之处,但他们也由很多相似的地方: . 都是一维的类似数组的结构 . 都有内建的方法 . 访问由点分隔 Index_by表 Index_by表集合的定义语法如下: TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTERGET; 这里面重要的关键字是INDEX BY BINARY_INTERGET,没有这个关键字,那么集合将是一个嵌套表,element_type可以是任何合法的PL/SQL数据类型,包括:PLS/INTEGER、SIGNTYPE、和BOOLEAN。