Leider war der größte Teil meiner DB Erfahrung mit MSSQL, die dazu neigen, Ihre Hand viel mehr als Oracle zu halten. Was ich versuche zu tun ist in tSQL ziemlich trivial, pl/sql bereitet mir Kopfschmerzen.XML-Rückgabe von einer Oracle Stored Procedure
Ich habe folgendes Verfahren:
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;
Wenn er ausgeführt wird, sollte es ein XML-Dokument mit der folgenden Struktur zurück:
<user userid="" companyid="" usertype="" status="" personid="">
<firstname />
<lastname />
<email />
<phone />
<extension />
<roles>
<role />
</roles>
<watches>
<watch id="" ticket="" />
</watches>
</user>
Wenn ich führen Sie die Abfrage selbst, anstelle der USERID Parameter mit Eine Zeichenfolge und das Entfernen der "in" -Klausel, die Abfrage läuft gut und gibt die erwartete Struktur zurück.
Wenn jedoch die Prozedur versucht, die Abfrage auszuführen, die Ergebnisse der XMLELEMENT Funktion in den Parameter USERRECORD Ausgang vorbei, erhalte ich die folgende Ausnahme:
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
ich diese nach unten nageln verwirrte versuchen und leider hat mein Google-Fu nicht geholfen. Ich habe viele Oracle SQL | XML-Beispiele gefunden, aber keine, die sich mit XML beschäftigen, kommen von einer Prozedur zurück.
Hinweis: Ich weiß, dass eine alternative Methode zum Abrufen von XML mit DBMS-Methoden existiert, aber es ist mein Verständnis, dass diese Funktionalität zugunsten von SQL | XML veraltet ist.
Vielen Dank! Das Ändern der Eingabeparameter funktioniert einwandfrei. –
Netter Fang. Hab das nicht gesehen. – dacracot