`
happyqing
  • 浏览: 3156959 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle函数返回表类型(结果集)

阅读更多

一.用自定义类型实现

1、创建表对象类型。

   在Oracle中想要返回表对象,必须自定义一个表类型,如下所示:

create or replace type type_table is table of number; 

上面的类型定义好后,在function使用可用返回一列的表,稍后介绍返回多列的

 

2、 创建函数

在函数的定义中,可以使用管道化表函数和普通的方式,下面提供两种使用方式的代码:

1)、管道化表函数方式:

create or replace function f_pipe
(s number)
return type_table pipelined
as  
begin    
    for i in 1..s loop 
    pipe row(i); 
end loop;
return;
end f_pipe;

  

注意:管道的方式必须使用空的return表示结束.

调用函数的方式如下:

 

2)、 普通的方式:

create or replace function f_normal
(s number)
return type_table
as
    rs type_table:= type_table();
begin
    for i in 1..s loop
        rs.extend;
        rs(rs.count) := i;
    end loop;
return rs;
end f_normal;

 

调用方式如下:

select * from table(f_normal(5));

如果需要多列的话,需要先定义一个对象类型。可以把对象类型替换上面语句中的number;

定义对象类型:

create or replace type type_row as object
(
  id int,
  name varchar2(50)
)

 

修改表对象类型的定义语句如下:

create or replace type type_table is table of type_row;

 

1)、管道化表函数方式:

 

create or replace function f_pipe(s number)
return type_table pipelined
as
    v_type_row type_row;   
begin    
for i in 1..s loop 
    v_type_row :=  type_row(i,to_char(i*i));
    pipe   row(v_type_row);   
end loop;
return;
end f_pipe;

 测试:select * from table(f_pipe(5));

 

2)、 普通的方式:

 

create or replace function f_normal(s number)
return type_table
as
    rs type_table:= type_table();
begin
    for i in 1..s loop
        rs.extend;
        rs(rs.count) := type_row(rs.count,'name'||to_char(rs.count));
	--Result(Result.count) := type_row(NULL,NULL);

        --rs(rs.count).name := rs(rs.count).name || 'xxxx';
    end loop;
return rs;
end f_normal;

  测试:select * from table(f_normal(5));

 

其他代码段

把权限(和)值拆分成多条记录

create or replace type type_table_number is table of number; 
  
create or replace function f_right_table(
    rights number
)
    --自定义table类型 --pipelined 管道关键字
    return type_table_number pipelined   
as   
begin
    --调用方法:select column_value as right from table(f_right_table(power(2,15)*2-2));   
    for i in 1..15 loop  
      IF bitand(rights,power(2,i))=power(2,i) THEN
         pipe row(power(2,i)); --pipe row 特定写法,输出记录
      END IF;  
    end loop;
return;
end f_right_table;

 

一种遍历数据的方法,

只是演示myrow,myrow 就相当于一个临时变量

for myrow in (
      select 2 as right from dual where bitand(rights,2)=2
      union
      select 4 as right from dual where bitand(rights,4)=4
) loop
      rs.extend;
      rs(rs.count) := myrow.right;
end loop;

二.其他实现
 

包里面用一个存储过程,返回游标,就可以了

>包的定义
1) 包头

create or replace package mypk  
as  
type t_cursor is ref cursor;  
procedure proc(name varchar2,c out t_cursor,a number);  
end;

 

2) 包体

create or replace package body mypk  
as  
procedure proc(name varchar2,c out t_cursor,a number)  
as   
begin  
open c for select * from test where id=a and name=name;  
end proc;  
end;

 

这个方案的局限性太大,无法实现select * from function()的要求

 

调用:

declare
    cur_out_arg mypk.t_cursor;
    rec_arg test%rowtype;
begin
    mypk.proc('abc',cur_out_arg,3);
  --open cur_out_arg;         
    loop           
      --提取一行数据到rec_arg           
      fetch cur_out_arg into rec_arg;           
      --判读是否提取到值,没取到值就退出           
      --取到值cur_out_arg%notfound 是false            
      --取不到值cur_out_arg%notfound 是true           
      exit when cur_out_arg%notfound;            
      dbms_output.put_line(rec_arg.id||'-'||rec_arg.name);         
    end loop;       
  --关闭游标      
  close cur_out_arg;
end;

  

 

分享到:
评论

相关推荐

    oracle function 返回结果集

    有类型返回结果集,包括也插入后返回,也有sql调用.

    oracle10g 函数返回游标类型

    根据所示 代码 可以实现返回记录集类型的函数

    oracle函数大全.doc

    ORACLE函数大全 ________________________________________ 作者:[本站编辑] 来源:[CSDN] 浏览:[ ] SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,...

    Oracle 数据类型

    5、DATE数据类型,使用7个字节固定长度,每个字节分别存储世纪,年,月,日 ,时,分,秒,ORACLE中SYSDATE函数的功能是返回当前的日期和时间 6、TIMESTAMP数据类型,和DATE相似,但是这个类型的秒精确到小数点后6...

    MYSQL,SQLSERVER,ORACLE常用的函数

    SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A A ZERO SPACE --------- --------- --------- --------- ...

    Oracle数据库学习指南

    40.在oracle中限制返回结果集的大小 41.在远端如何建立standby数据库 42.怎样分析你的SQL语句的效率 43.自动备份Oracle数据库 44.总结SQL语句中的优化提示 45.使用Database Configuration Assistant安装...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...

    Oracl技术资料(EBook)

    40.在oracle中限制返回结果集的大小 41.在远端如何建立standby数据库 42.怎样分析你的SQL语句的效率 43.自动备份Oracle数据库 44.总结SQL语句中的优化提示 45.使用Database Configuration Assistant安装第二个...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    10.2 描述SQL中可用的各种类型的转换函数 359 10.3 使用TO_CHAR、TO_NUMBER 和TO_DATE转换函数 361 10.4 在SELECT语句中应用条件表达式 368 10.4.1 嵌套函数 368 10.4.2 条件函数 369 10.5 本章知识点回顾 375...

    oracle数据库经典题目

    18. 表空间是Oracle数据库中数据的逻辑组织,每个数据库至少有一个SYSTEM系统表空间。 19.视图是一个表示表的数据的数据库对象,它允许用户从一个表或一组表中通过一定的查询语句建立一个“虚表”。 20.序列是一种...

    C# Oracle数据库操作类实例详解

    本文所述为C#实现的Oracle数据库操作类,可执行超多常用的Oracle数据库操作,包含了基础数据库连接、关闭连接、输出记录集、执行Sql语句,返回带分页功能的dataset 、取表里字段的类型和长度等,同时还有哈稀表自动...

    OCA认证考试指南1Z0-051

    8.2.1 将子查询的结果集用于比较 8.2.2 星型转换(StarTransformation) 8.2.3 生成执行SELECT语句的表 8.2.4 生成投影值 8.2.5 生成传递给DML语句的行 8.3 列举子查询的类型 8.3.1 单行和多行子查询 ...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第1/2部分)

    10.2 描述SQL中可用的各种类型的转换函数 359 10.3 使用TO_CHAR、TO_NUMBER 和TO_DATE转换函数 361 10.4 在SELECT语句中应用条件表达式 368 10.4.1 嵌套函数 368 10.4.2 条件函数 369 10.5 本章知识点回顾 375...

    Oracle9i的init.ora参数中文说明

    Oracle9i初始化参数中文说明 Blank_trimming: 说明: 如果值为TRUE, 即使源长度比目标长度 (SQL92 兼容) 更长, 也允许分配数据。 值范围: TRUE | FALSE 默认值: FALSE serializable: 说明: 确定查询是否获取表级...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例070 网页版九九乘法表 104 实例071 读取数组购物车中的数据 105 实例072 图像验证码的生成 106 2.6 跳转语句 107 实例073 控制页面中表情图的输出 107 实例074 控制页面中数据的输出数量 108 实例075 动态改变...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例070 网页版九九乘法表 104 实例071 读取数组购物车中的数据 105 实例072 图像验证码的生成 106 2.6 跳转语句 107 实例073 控制页面中表情图的输出 107 实例074 控制页面中数据的输出数量 108 实例075 动态改变...

Global site tag (gtag.js) - Google Analytics