利用函数返回oracle对象表的三种方法
2016-07-18 00:00
489 查看
因为要返回表对象,无论后续用什么方法返回,都先要声明全局type;并且,字段变量类型要为object,不能为record:
至于返回表对象的方法,目前发现三种:
1、用数组
2、用pipe
这两种都需要用游标遍历,得到表对象,性能上估计第2种较高。
3、用collect(不需要游标,代码相对简单)
需要注意的是,select into之前要先把输出结果对象化:
t_test(empno, ename, job, sal)
否则会报错:
ORA-00947: 没有足够的值(object多字段)
ORA-00932: 数据类型不一致(object单一字段)
而如果直接在plsql块中declare类型的话,是不需要先对象化输出结果的。
三种函数定义方式可以测试输出一样的结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
解析Oracle数据库中的对象集合schema
oracle查看会话锁定的所有对象代码分享
ORACLE 常用的SQL语法和数据对象
Oracle使用PL/SQL操作COM对象
基于Oracle的面向对象技术入门基础简析开发者网络Oracle
PHP 5 数据对象 (PDO) 抽象层与 Oracle
MS-sql 2005拒绝了对对象 ''xxx'' (数据库 ''xxx'',架构 ''dbo'')的 SELECT 权限的解决方法
重新编译PLSQL中的无效对象或者指定的对象 的方法
asp sqlserver 执行存储过程返回记录集报对象关闭时不允许操作
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;
至于返回表对象的方法,目前发现三种:
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;
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;
这两种都需要用游标遍历,得到表对象,性能上估计第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;
需要注意的是,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));
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
ORACLE 查询被锁住的对象,并结束其会话的方法解析Oracle数据库中的对象集合schema
oracle查看会话锁定的所有对象代码分享
ORACLE 常用的SQL语法和数据对象
Oracle使用PL/SQL操作COM对象
基于Oracle的面向对象技术入门基础简析开发者网络Oracle
PHP 5 数据对象 (PDO) 抽象层与 Oracle
MS-sql 2005拒绝了对对象 ''xxx'' (数据库 ''xxx'',架构 ''dbo'')的 SELECT 权限的解决方法
重新编译PLSQL中的无效对象或者指定的对象 的方法
asp sqlserver 执行存储过程返回记录集报对象关闭时不允许操作
相关文章推荐
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- PreparedStatement中in子句的处理
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法
- oracle中创建数据库和表空间的几点总结
- 数据库自动备份脚本
- oracle的nvl函数的使用介绍
- 解决oracle用户连接失败的解决方法
- oracle的一些tips技巧
- Oracle 下的开发日积月累
- Oracle存储过程之数据库中获取数据实例
- Windows下ORACLE 10g完全卸载的方法分析
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ORACLE LATERAL-SQL-INJECTION 个人见解