2014-07-17 2 views
1

oracle의 새로운 기능. TSQL에 대한 함수가 있고 pl/sql로 변환해야합니다. 함수가 일부 규칙을 사용하여 들어오는 문자열을 분리합니다. 그래서 이것을 시도 :함수에서 테이블을 반환합니다. 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

'POPSTBL'의 정의는 무엇입니까? ('create type ... '문 게시) –

+1

@a_horse_with_no_name : 저는 교육 된 추측을하고 다음과 같이 말 할 것입니다 :'PROPETBL을 PROP의 테이블로 만드십시오': –

답변

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')) 

솔루션은 당신이 당신이 반복 할 때마다 (대신에 추가의) 테이블 유형을 덮어 유지하기 때문에없는 일이었다 한 이유를 당신의 루프.

+0

고맙습니다. 괜찮습니다. – Gleb

관련 문제