我是oracle的新手。我在TSQL上有一个函数,我需要将它转换为pl / sql。 函数将传入的字符串与一些规则分开。所以我试试这个:
create or replace
FUNCTION FN_PROPSTOTABLE(stValues in varchar2) RETURN POPSTBL AS
tbl PROPSTBL;
s varchar2(8000);
ind varchar2(100);
val varchar2(100);
p int;
tmp varchar2(8000);
BEGIN
tmp:=stValues;
while LENGTH(tmp)>0
loop
p:=instr(tmp, ':');
IF p=0 THEN
p:=LENGTH(tmp);
END IF;
s:=SUBSTR(tmp, 0, p);
tmp:=SUBSTR(tmp, LENGTH(s)+1);
s:=REPLACE(s, ':', '');
ind:=substr(s,0, instr(s, '|')-1);
val:=substr(s,instr(s, '|')+1);
select b bulk collect into tbl
from (select props(ind, val) b from dual);
end loop;
RETURN tbl;
END FN_PROPSTOTABLE;
这样可以正常工作,但它只返回最后一个子字符串。请帮帮我。
答案 0 :(得分:4)
如何制作PIPELINED
功能(我认为其中最缺乏使用的功能之一)?
CREATE OR REPLACE
FUNCTION FN_PROPSTOTABLE(stValues in varchar2) RETURN PROPSTBL
-- Add the "PIPELINED" modifier here
PIPELINED AS
tbl PROPSTBL;
s varchar2(8000);
ind varchar2(100);
val varchar2(100);
p int;
tmp varchar2(8000);
BEGIN
tmp := stValues;
WHILE LENGTH(tmp) > 0
LOOP
p := INSTR(tmp, ':');
IF p=0 THEN
p := LENGTH(tmp);
END IF;
s := SUBSTR(tmp, 0, p);
tmp := SUBSTR(tmp, LENGTH(s)+1);
s := REPLACE(s, ':', '');
ind := SUBSTR(s,0, instr(s, '|')-1);
val := SUBSTR(s,instr(s, '|')+1);
-- Emit resulting rows using "PIPE"
PIPE ROW(props(ind, val));
END LOOP;
RETURN;
END FN_PROPSTOTABLE;
然后像这样称呼它:
SELECT * FROM TABLE(fn_propstotable('1|a:2|b'))
您的解决方案不起作用的原因是因为每次循环迭代时都会覆盖表格类型(而不是附加到它)。