因為要返回表物件,無論後續用什麼方法返回,都先要宣告全域性type;並且,字段變數型別要為object,不能為record:
create or replace type t_test as object(
empno number(4),
ename varchar2(10),
job varchar2(9),
sal number
);create or replace type t_test_table as table of t_test;
至於返回表物件的方法,目前發現三種:
1、用陣列
cr程式設計客棧eate 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
isv_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.emp c.ename, c.jslqcpzyxdtob, 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函式返回表型別 結果集
一.用自定義型別實現 1 建立表物件型別。在oracle中想要返回表物件,必須自定義乙個表型別,如下所示 create or replace type type table is table of number 上面的型別定義好後,在function使用可用返回一列的表,稍後介紹返回多列的 2 建立...
Oracle函式返回陣列
create or replace type defect number3 as object id varchar2 100 urgent number 10,2 major number 10,2 norm number 10,2 total number 10,2 create or repl...
oracle利用現有表建立新錶
create table as select from where exp sql create table yonghu bak as select from yonghul sql create table yonghu bak as select id,name,from yonghu sql...