2010-03-24 2 views
7

불행히도 대부분의 DB 경험은 오라클보다 훨씬 손을 많이 사용하는 MSSQL과 관련되어 있습니다. 내가 뭘 하려는지 tSQL에서 상당히 사소한입니다, 그러나, pl/sql 날 두통을주고있다. 실행되면XML 오라클 저장 프로 시저에서 돌아 가기

CREATE OR REPLACE PROCEDURE USPX_GetUserbyID (USERID USERS.USERID%TYPE, USERRECORD OUT XMLTYPE) AS 
BEGIN 

    SELECT XMLELEMENT("user" 
     , XMLATTRIBUTES(u.USERID AS "userid", u.companyid as "companyid", u.usertype as "usertype", u.status as "status", u.personid as "personid") 
     , XMLFOREST( p.FIRSTNAME AS "firstname" 
        , p.LASTNAME AS "lastname" 
        , p.EMAIL AS "email" 
        , p.PHONE AS "phone" 
        , p.PHONEEXTENSION AS "extension") 
     , XMLELEMENT("roles", 
       (SELECT XMLAGG(XMLELEMENT("role", r.ROLETYPE)) 
        FROM USER_ROLES r 
        WHERE r.USERID = USERID 
         AND r.ISACTIVE = 1 
       ) 
      ) 
     , XMLELEMENT("watches", 
       (SELECT XMLAGG(
        XMLELEMENT("watch", 
         XMLATTRIBUTES(w.WATCHID AS "id", w.TICKETID AS "ticket") 
        ) 
       ) 
       FROM USER_WATCHES w 
       WHERE w.USERID = USERID 
       AND w.ISACTIVE = 1 
       ) 
      ) 
     ) AS "RESULT" 
    INTO USERRECORD 
    FROM USERS u 
    LEFT JOIN PEOPLE p ON p.PERSONID = u.PERSONID 
    WHERE u.USERID = USERID; 
    END USPX_GetUserbyID; 

, 그것은 다음과 같은 구조로 XML 문서를 반환해야합니다 :

나는 다음과 같은 절차를

<user userid="" companyid="" usertype="" status="" personid=""> 
    <firstname /> 
    <lastname /> 
    <email /> 
    <phone /> 
    <extension /> 
    <roles> 
     <role /> 
    </roles> 
    <watches> 
     <watch id="" ticket="" /> 
    </watches> 
</user> 

나는 USERID 매개 변수를 대체 쿼리 자체를 실행

문자열을 삭제하고 "into"절을 제거하면 쿼리가 제대로 실행되고 예상되는 구조가 반환됩니다. 절차가 USERRECORD 출력 매개 변수로 XMLELEMENT 함수의 결과를 전달하는 쿼리를 실행하려고 시도

그러나

, 나는 다음과 같은 예외가 얻을 :

Error report: ORA-01422: exact fetch returns more than requested number of rows ORA-06512: at "USPX_GETUSERBYID", line 4 ORA-06512: at line 3 
01422. 00000 - "exact fetch returns more than requested number of rows" 
*Cause: The number specified in exact fetch is less than the rows returned. 
*Action: Rewrite the query or change number of rows requested 

나는이 아래로 못을 시도 당황 해요을 , 불행히도 내 google-fu는 도움이되지 못했습니다. 많은 오라클 SQL | XML 예제를 발견했지만 XML을 다루는 사람은 프로 시저에서 반환하지 않습니다.

참고 : DBMS 메소드를 사용하여 XML을 검색하는 대체 방법이 있지만,이 기능은 SQL | XML을 사용하지 않는 것이 좋습니다.

답변

10

코드는 다음이 포함되어 있습니다. 실제로 당신은

u.USERID = USPX_GetUserbyID.USERID; 

을 사용할 수 있습니다

u.USERID = u.USERID; 

으로 그것을 해석하지만 혼동을 피하기 위해 PL/SQL 변수의 접두사를 사용하는 것이 좋습니다. 나는 입력, 출력 및 입/출력 매개 변수에 대해 변수 및 변수에 대해 v_을 사용합니다.

+0

감사합니다! 입력 매개 변수를 변경하면 완벽하게 작동합니다. –

+0

좋은 캐치. 못 봤어. – dacracot

2

오류는 XML과 관련이 없습니다. 여러 행을 반환하는 쿼리가있는 경우 PL/SQL에서 커서를 사용하여 행을 반복해야합니다. 단일 행 (또는 귀하의 경우에는 XML) 결과 만 처리 할 수있는 INTO 키워드를 사용했습니다. 프로 시저의 매개 변수로 베어 USERID 의도하는 동안

u.USERID = USERID; 

오라클은 실제로 테이블의 열입니다 USERID에 우선 순위를 제공합니다

+0

이것은 내가 이해할 수없는 것입니다. 쿼리와 일치하는 단일 사용자 레코드 만 있습니다. 쿼리 자체를 실행하면 Oracle SQL Developer에 하나의 XML 행만 반환됩니다. 실제로 어떤 현상이 발생했는지는 알 수 없습니다. –

0

쿼리가 두 개 이상의 행을 반환하는 것 같습니다. 프로 시저를 구조화 한 방식으로 모든 XML을 포함하는 단일 행을 반환하는 방식으로 쿼리를 작성해야합니다. 그러면 오류가 발생하지 않아야합니다.

관련 문제