• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >oracle > 利用函数返回oracle对象表的三种方法

利用函数返回oracle对象表的三种方法

作者:ryan1985 字体:[增加 减小] 来源:互联网 时间:2017-05-11

ryan1985通过本文主要向大家介绍了oracle nvl函数,oracle substr函数,oracle 日期函数,oracle decode函数,oracle 函数等相关知识,希望本文的分享对您有所帮助

因为要返回表对象,无论后续用什么方法返回,都先要声明全局type;并且,字段变量类型要为object,不能为record:

create or replace type t_test as object(
 EMPNO  NUMBER(4),
 ENAME  VARCHAR2(10),
 JOB   VARCHAR2(9),
 SAL   NUMBER(7,2)
);

create or replace type t_test_table as table of t_test;
</div>

至于返回表对象的方法,目前发现三种:
 1、用数组

create or replace function f_test_array(v_deptno in number default null)
return t_test_table
is 
v_test t_test_table := t_test_table();
cursor cur is select empno, ename, job, sal from emp where deptno = v_deptno;
begin
for c in cur loop
v_test.extend();
v_test(v_test.count) := t_test(c.empno, c.ename, c.job, c.sal);
end loop;
return v_test;
end;
</div>

2、用pipe

create or replace function f_test_pipe(v_deptno in number default null)
return t_test_table PIPELINED 
is
v_test t_test_table := t_test_table();
cursor cur is select empno, ename, job, sal from emp where deptno = v_deptno;
begin 
for c in cur loop
pipe row(t_test(c.empno, c.ename, c.job, c.sal)); 
end loop; 
return; 
end;
</div>

这两种都需要用游标遍历,得到表对象,性能上估计第2种较高。 

3、用collect(不需要游标,代码相对简单)

create or replace function f_test_collect(v_deptno in number default null)
return t_test_table
is 
v_test t_test_table := t_test_table();
begin
select t_test(empno, ename, job, sal) bulk collect into v_test from emp where deptno = v_deptno;
return v_test;
end;
</div>

需要注意的是,select into之前要先把输出结果对象化:
t_test(empno, ename, job, sal)
否则会报错: 
ORA-00947: 没有足够的值(object多字段)
ORA-00932: 数据类型不一致(object单一字段)
而如果直接在plsql块中declare类型的话,是不需要先对象化输出结果的。
三种函数定义方式可以测试输出一样的结果:

select * from table(f_test_pipe(30));
select * from table(f_test_array(30));
select * from table(f_test_collect(30));
</div>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 利用函数返回oracle对象表的三种方法
  • oracle的nvl函数的使用介绍
  • oracle排名函数的使用方法分享
  • oracle常用函数汇总(分享)
  • 在Oracle的函数中,返回表类型的语句

相关文章

  • 2017-05-11Oracle连接出现ora-12154无法解析指定的连接标识符
  • 2017-05-11oracle正则表达式regexp_like的用法详解
  • 2017-05-11Orcale 数据库客户端PL/SQL 中文乱码的问题解决方法
  • 2017-05-11Oracle 查找与删除表中重复记录的步骤方法
  • 2017-05-11CentOS6.2上安装Oracle10g报ins_emdb.mk错误处理方法
  • 2017-05-11ORACLE错误一览表 方便查询
  • 2017-05-11深入浅析mybatis oracle BLOB类型字段保存与读取
  • 2017-05-11Oracle中instr和substr存储过程详解
  • 2017-05-11Oracle用户连续登录失败次数限制如何取消
  • 2017-05-11oracle的rownum深入解析

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • Oracle SQL性能优化系列学习三
    • Oracle数据库中SQL语句的优化技巧
    • 向Oracle数据库的CLOB属性插入数据报字符串过长错误
    • oracle删除已存在的表的实例
    • oracle中110个常用函数介绍
    • 将Oracle数据库中的数据写入Excel
    • oracle定时备份压缩的实现步骤
    • Oracle Listener 动态注册 与 静态注册
    • Oracle 错误代码整理总结
    • oracle使用instr或like方法判断是否包含字符串

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有