网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.Oracle中系统process与session的.
.Oracle的Password文件作用.
.如何在Spring中解决中文乱码的方.
.LogMiner Enhancements In Oracl.
.oracle 日期函数介绍.
.显示数据库中所有表及其信息.
.学会看oracle SQL语法图.
.Oracle数据库常见问题答疑.
.在Linux下安装VNC 远程安装Oracle.
.Oracle安全全程接触(完整版)一.
.讲解Oracle数据库逐渐增大时的归.
.Oracle数据库环境下数据文件丢失.
.isql*plus中经常使用修改select语.
..NET中用Oracle 10g Single-Sign.
.MSSQL7.0SysbaseAccess向Oracle8.
.Oracle常见错误诊断.
.ORA-03113错误分析与解决.
.[HOWTO]ORACLE中如何实现ASC字符.
.在Oracle层次查询中给SIBLINGS排.
.Oracle数据库的优化.

Oracle复合数据类型(2)

发表日期:2008-2-9



  使用记录
  
  用户可以给记录赋值、将值传递给其他程序。记录作为一种复合数据结构意味作他有两个层次可用。用户可以引用整个记录,使用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);
  
  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手册。
上一篇:Oracle复合数据类型(4) 人气:919
下一篇:Oracle复合数据类型(3) 人气:708
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐