불행히도 대부분의 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을 사용하지 않는 것이 좋습니다.
감사합니다! 입력 매개 변수를 변경하면 완벽하게 작동합니다. –
좋은 캐치. 못 봤어. – dacracot