广

oracle数据库

  • MYSQL
  • MSSQL
  • Redis
  • MongoDB
  • oracle数据库
  • 数据管理

    Oracle复合数据类型(2)

    2018-04-05 20:16:57 次阅读 稿源:互联网
    广告
    全网推广平台,软文发布

    使用记录

      用户可以给记录赋值、将值传递给其他程序。记录作为一种复合数据结构意味作他有两个层次可用。用户可以引用整个记录,使用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手册。

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告
    广告