例子1:
--需要预先定义str_split类型
CREATE OR REPLACE TYPE str_split IS TABLE OF VARCHAR2 (4000)
--管道化表函数
CREATE OR REPLACE FUNCTION fn_split(p_str IN VARCHAR2,
p_delimiter IN VARCHAR2)
RETURN str_split
PIPELINED IS
/*
测试:SELECT * FROM TABLE (fn_split('aa,abb,123abc,12345678', ','));
结果:
aa
abb
123abc
12345678
*/
pvar_j INT := 0;
pvar_i INT := 1;
pvar_i_lenstr INT := 0; --字符串长度
pvar_i_lensmark INT := 0; --分隔符的长度
str VARCHAR2(4000);
BEGIN
pvar_i_lenstr := LENGTH(p_str);
pvar_i_lensmark := LENGTH(p_delimiter);
WHILE pvar_j < pvar_i_lenstr LOOP
pvar_j := INSTR(p_str, p_delimiter, pvar_i);
IF pvar_j = 0 THEN
pvar_j := pvar_i_lenstr;
str := SUBSTR(p_str, pvar_i);
PIPE ROW(str);
IF pvar_i >= pvar_i_lenstr THEN
EXIT;
END IF;
ELSE
str := SUBSTR(p_str, pvar_i, pvar_j - pvar_i);
pvar_i := pvar_j + pvar_i_lensmark;
PIPE ROW(str);
END IF;
END LOOP;
RETURN;
END fn_split;
例子2:
Declare
tm_i Integer;
Begin
Select Count(*) into tm_i From User_Objects t Where Lower(t.OBJECT_NAME) = Lower('mytype ') And Lower(t.OBJECT_TYPE) = Lower('Type');
If tm_i = 0 Then
Execute Immediate
'CREATE OR REPLACE TYPE mytype AS OBJECT
(
field1 NUMBER,
field2 VARCHAR2(50)
)';
else
Execute Immediate'
drop type mytype force ';
Execute Immediate
'CREATE OR REPLACE TYPE mytype AS OBJECT
(
field1 NUMBER,
field2 VARCHAR2(50)
)';
End If;
End;
/
CREATE OR REPLACE TYPE mytypelist AS TABLE OF mytype;
CREATE OR REPLACE FUNCTION pipelineme
RETURN mytypelist
PIPELINED IS
v_mytype mytype;
BEGIN
FOR v_count IN 1 .. 10 LOOP
v_mytype := mytype(v_count, 'Row ' || v_count);
PIPE ROW(v_mytype);
END LOOP;
RETURN;
END pipelineme;
测试:SELECT * FROM TABLE (pipelineme);
结果:
例子3:(完整脚本)
Declare
tm_i Integer;
Begin
Select Count(*) into tm_i From User_Objects t Where Lower(t.OBJECT_NAME) = Lower('T_printoperationlog') And Lower(t.OBJECT_TYPE) = Lower('Type');
If tm_i = 0 Then
Execute Immediate
'CREATE TYPE T_PrintOperationLog AS OBJECT
(
i_batch_no NUMBER(22),
i_instruction_no NUMBER(22),
vc_group_caption varchar2(50),
vc_opinion varchar2(600),
dt_date number(8),
i_time number(9),
vc_date varchar2(20)
)';
else
Execute Immediate'
drop type T_printoperationlog force ';
Execute Immediate
'CREATE TYPE T_PrintOperationLog AS OBJECT
(
i_batch_no NUMBER(22),
i_instruction_no NUMBER(22),
vc_group_caption varchar2(50),
vc_opinion varchar2(600),
dt_date number(8),
i_time number(9),
vc_date varchar2(20)
)';
End If;
End;
/
CREATE OR REPLACE TYPE T_PrintOperationLog_List AS TABLE OF T_PrintOperationLog;
CREATE OR REPLACE FUNCTION Fn_OperationLog_PIPE
RETURN T_PrintOperationLog_List
PIPELINED IS
v_mytype T_PrintOperationLog;
BEGIN
for cur in (
select *
from (select t.i_batch_no,
t.i_instruction_no,
g.vc_group_caption,
u.vc_user_name || ':' || '同意下达' as caption,
t.i_direct_date as dt_date,
t.i_direct_time as i_time
from instructions t
join investflowgroup g on g.vc_group_code = t.vc_direct_group
join users u on u.vc_user = t.vc_directer_code
union
select s.i_batch_no,
l.i_instruction_no,
g.vc_group_caption,
u.vc_user_name || ':' || case
when l.c_status = '1' and l.c_status_after <> '3' then
'审批通过'
else
'审批拒绝'
end caption,
l.dt_date,
l.i_time
from instrustatuslogs l
join instructions s on s.i_instruction_no = l.i_instruction_no
join investflowgroup g on g.vc_group_code = l.vc_recent_group
join users u on u.vc_user = l.vc_user
where l.c_status = '1') a
order by a.dt_date, a.i_time) loop
v_mytype := T_PrintOperationLog(cur.i_batch_no, cur.i_instruction_no,cur.vc_group_caption,cur.caption,cur.dt_date,cur.i_time,fn_getChineseDate(cur.dt_date));
PIPE ROW(v_mytype);
end loop;
RETURN;
END Fn_OperationLog_PIPE;
oracle管道
最新推荐文章于 2023-08-09 19:45:49 发布