/*
PL/SQL表---table()函数用法:
利用table()函数,我们可以将PL/SQL返回的结果集代替table。
oracle内存表在查询和报表的时候用的比较多,它的速度相对物理表要快几十倍。
Oracle table()语句
2. 一个返回指定范围内日期表的函数
源代码:
1. table() 语句例子
and :
1、table()结合数组:
*/
create or replace type t_test as object(
id integer,
rq date,
mc varchar2(60)
);
create or replace type t_test_table as table of t_test;
create or replace function f_test_array(n in number default null) return t_test_table
as
v_test t_test_table := t_test_table();
begin
for i in 1 .. nvl(n,100) loop
v_test.extend();
v_test(v_test.count) := t_test(i,sysdate,'mc'||i);
end loop;
return v_test;
end f_test_array;
/
select * from table(f_test_array(10));
select * from the(select f_test_array(10) from dual);
/*
2、table()结合PIPELINED函数:
*/
create or replace function f_test_pipe(n in number default null) return t_test_table PIPELINED
as
v_test t_test_table := t_test_table();
begin
for i in 1 .. nvl(n,100) loop
pipe row(t_test(i,sysdate,'mc'||i));
end loop;
return;
end f_test_pipe;
/
select * from table(f_test_pipe(20));
select * from the(select f_test_pipe(20) from dual);
/*
3、table()结合系统包:
*/
create table test (id varchar2(20));
insert into test values('1');
commit;
explain plan for select * from test;
select * from table(dbms_xplan.display);
i INTEGER,
d DATE,
v VARCHAR2 (99)
)
/
CREATE OR REPLACE TYPE table_int_date_varchar2 AS TABLE OF type_int_date_varchar2
/
CREATE OR REPLACE FUNCTION f_int_date_varchar2
RETURN table_int_date_varchar2
AS
a_type_int_date_varchar2 table_int_date_varchar2 := table_int_date_varchar2();
BEGIN
a_type_int_date_varchar2.EXTEND;
a_type_int_date_varchar2 (a_type_int_date_varchar2.COUNT) :=
type_int_date_varchar2 (1,
TO_DATE ("1947-01-08", "yyyy-mm-dd"),
"David Bowie"
);
a_type_int_date_varchar2.EXTEND;
a_type_int_date_varchar2 (a_type_int_date_varchar2.COUNT) :=
type_int_date_varchar2 (2,
TO_DATE ("1956-01-27", "yyyy-mm-dd"),
"Mozart"
);
RETURN a_type_int_date_varchar2;
END;
/
SELECT * FROM TABLE (CAST (f_int_date_varchar2 () AS table_int_date_varchar2));
DROP FUNCTION f_int_date_varchar2;
DROP TYPE table_int_date_varchar2;
DROP TYPE type_int_date_varchar2;
2. 一个返回指定范围内日期表的函数 CREATE OR REPLACE TYPE date_obj AS OBJECT (
dt DATE
)
/
CREATE OR REPLACE TYPE date_table AS TABLE OF date_obj
/
CREATE OR REPLACE FUNCTION date_range (from_dt IN DATE, to_dt IN DATE)
RETURN date_table
AS
a_date_table date_table := date_table ();
cur_dt DATE := from_dt;
BEGIN
WHILE cur_dt <= to_dt
LOOP
a_date_table.EXTEND;
a_date_table (a_date_table.COUNT) := date_obj (cur_dt);
cur_dt := cur_dt + 1;
END LOOP;
RETURN a_date_table;
END date_range;
/
SELECT *
FROM TABLE (CAST (date_range (TO_DATE ("2002-01-01", "yyyy-mm-dd"),
TO_DATE ("2002-01-31", "yyyy-mm-dd")
) AS date_table
)
);
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/77580/viewspace-212776/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/77580/viewspace-212776/