首页  登陆  注册  博客集  下载频道  网络硬盘  学院论坛  家园
IT学院 网站地图 网站地图
收藏本站 收藏本站
高级搜索 高级搜索
 新闻IT新闻 互联网 微软 黑客新闻 网络网络协议 故障 网络管理 TCP/IP 无线技术 解决方案 黑客技术 漏洞 软件评测 安全资讯
 数据MSsql Oracle Mysql PL/SQL 备份 系统:Linux vista Windows FTP 防火墙 注册表 服务器行情 服务器应用 解决方案 WEB服务器
 墙纸风景壁纸 游戏壁纸 体育壁纸 汽车壁纸 人文壁纸 影视壁纸 广告壁纸 花卉壁纸 节日壁纸 动漫壁纸 明星壁纸 绘画壁纸 月历壁纸
当前位置: > 主页>数据库技术>Oracle>PL/SQL>全面探讨PL/SQL的复合数据类型
热门文章排行
 
热门文章排行 SQL 语法参考手册
SQL*NET 的加密问题
两个sql程序
用Oracle SQL实现文件访
用PL/SQL产生随机数
加速SQL查询的特征函数
Oracle PL/SQL语言基础
全面探讨PL/SQL的复合数
Oracle9i的简化SQL语法
PL/SQL中调用Java源对象
精采文章推荐
 
精采文章推荐 用T-SQL强制所有用户退
最新更新文章
 
最新更新文章 用T-SQL强制所有用户退
PL/SQL中调用Java源对象
Oracle9i的简化SQL语法
全面探讨PL/SQL的复合数
Oracle PL/SQL语言基础
加速SQL查询的特征函数
用PL/SQL产生随机数
用Oracle SQL实现文件访
两个sql程序
SQL*NET 的加密问题

全面探讨PL/SQL的复合数据类型

编辑:   来源:  日期:2008-02-06   我要投稿      家园

  PL/SQL有两种复合数据结构:记录和集合。记录由不同的域组成,集合由不同的元素组成。在本文中我们将讨论记录和集合的类型、怎样定义和使用记录和集合。
  PL/SQL 记录
  记录是PL/SQL的一种复合数据结构,scalar数据类型和其他数据类型只是简单的在包一级进行预定义,但复合数据类型在使用前必须被定义,记录之所以被称为复合数据类型是因为他由域这种由数据元素的逻辑组所组成。域可以是scalar数据类型或其他记录类型,它与c语言中的结构相似,记录也可以看成表中的数据行,域则相当于表中的列,在表和虚拟表(视图或查询)中非常容易定义和使用,行或记录中的每一列或域都可以被引用或单独赋值,也可以通过一个单独的语句引用记录所有的域。在存储过程或函数中记录也可能有参数。
  创建记录
  在PL/SQL中有两种定义方式:显式定义和隐式定义。一旦记录被定义后,声明或创建定义类型的记录变量,然后才是使用该变量。隐式声明是在基于表的结构或查询上使用%TYPE属性,隐式声明是一个更强有力的工具,这是因为这种数据变量是动态创建的。
  显式定义记录
  显式定义记录是在PL/SQL程序块中创建记录变量之前在声明部分定义。使用type命令定义记录,然后在创建该记录的变量。语法如下:
  TYPE record_type IS RECORD (field_definition_list);
  field_definition_list是由逗号分隔的列表。
  域定义的语法如下:
  field_name data_type_and_size [NOT NULL][{:=|DEFAULT} default_value]
  域名必须服从与表或列的命名规则相同的命名规则。下面我们看一个例子:
  DELCARE
  TYPE stock_quote_rec IS RECORD
  (symbol stock.symbol%TYPE
  ,bid NUMBER(10,4)
  ,ask NUMBER(10,4)
  ,volume NUMBER NOT NULL:=0
  ,exchange VARCHAR2(6) DEFAULT 'NASDAQ'
  );
  real_time_quote stock_quote_rec;
  variable
  域定义时的%TYPE属性用于引用数据库中的表或视图的数据类型和大小,而在此之前程序不知道类型和大小。在上面的例子中记录域在编译时将被定义为与列SYMBOL相同的数据类型和大小,当代码中要使用来自数据库中的数据时,在变量或域定义中最好使用%TYPE来定义。
  隐式定义记录
  隐式定义记录中,我们不用描述记录的每一个域。这是因为我们不需要定义记录的结构,不需要使用TYPE语句,相反在声明记录变量时使用%ROWTYPE命令定义与数据库表,视图,游标有相同结构的记录,与TYPE命令相同的是它是一种定义获得数据库数据记录的好方法。
  DECLARE
  accounter_info accounts%ROWTYPR;
  CURSOR xactions_cur(acct_no IN VARCHAR2) IS
  SELECT action,timestamp,holding
  FROM portfolios
  WHERE account_nbr='acct_no'
  ;
  xaction_info xactions_cur%ROWTYPE;
  variable
  有一些PL/SQL指令在使用隐式定义记录时没有使用%ROWTYPE属性,比如游标FOR循环或触发器中的:old和:new记录。
  DELCARE
  CURSOR xaction_cur IS
  SELECT action,timeamp,holding
  FROM portfolios
  WHERE account_nbr='37'
  ;
  BEGIN
  FOR xaction_rec in xactions_cur
  LOOP
  IF xactions_rec.holding='ORCL'
  THEN
  notify_shareholder;
  END IF;
  END LOOP;
  使用记录
  用户可以给记录赋值、将值传递给其他程序。记录作为一种复合数据结构意味作他有两个层次可用。用户可以引用整个记录,使用select into或fetch转移所有域,也可以将整个记录传递给一个程序或将所有域的值赋给另一个记录。在更低的层次,用户可以处理记录内单独的域,用户可以给单独的域赋值或者在单独的域上运行布尔表达式,也可以将一个或更多的域传递给另一个程序。
  引用记录
  记录由域组成,访问记录中的域使用点(.)符号。我们使用上面的例子看看
  DELCARE
  TYPE stock_quote_rec IS RECORD
  (symbol stock.symbol%TYPE
  ,bid NUMBER(10,4)
  ,ask NUMBER(10,4)
  ,volume NUMBER NOT NULL:=0
  ,exchange VARCHAR2(6) DEFAULT 'NASDAQ'
  );
  TYPE detailed_quote_rec IS RECORD
  (quote stock_quote_rec
  ,timestamp date
  ,bid_size NUMBER
  ,ask.size NUMBER
  ,last_tick VARCHAR2(4)
  );
  real_time_detail detail_quote_rec;
  BEGIN
  real_time_detail.bid_size:=1000;
  real_time_detail.quote.volume:=156700;
  log_quote(real_time_detail.quote);
  给记录赋值
  给记录或记录中的域赋值的方法有几种,可以使用SELECT INTO或FETCH给整个记录或单独的域赋值, 可以将整个记录的值赋给其他记录,也可以通过给每个域赋值来得到记录,以下我们通过实例讲解每一种赋值方法。
  1、使用SELECT INTO
  使用SELECT INTO给记录赋值要将记录或域放在INTO子串中,INTO子串中的变量与SELECT中列的位置相对应。
  例:
  DECLARE
  stock_info1 stocks%ROWTYPE;
  stock_info2 stocks%ROWTYPE;
  BEGIN
  SELECT symbol,exchange
  INTO stock_info1.symbol,stock_info1.exchange
  FROM stocks
  WHERE symbol='ORCL';
  SELECT * INTO stock_info2 FROM stocks
  WHERE symbol='ORCL';
  2、使用FETCH
  如果SQL语句返回多行数据或者希望使用带参数的游标,那么就要使用游标,这种情况下使用FETCH语句代替INSTEAD INTO是一个更简单、更有效率的方法,但在安全性较高的包中FETCH的语法如下:
  FETCH cursor_name INTO variable;
  我们改写上面的例子:
  DECLARE
  CURSOR stock_cur(symbol_in VARCHAR2) IS
  SELECT symbol,exchange,begin_date
  FROM stock
  WHERE symbol=UPPER(symbol_in);
上一页12 下一页


上一篇:Oracle PL/SQL语言基础  
下一篇:Oracle9i的简化SQL语法
 关键字:  
文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【论坛讨论

   相关文章:

   文章评论:(0条)
  
 请留名: 匿名评论   点击查看所有评论
 

  责任编辑:IT学院  声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。