Hi,
when i am executing the below SQL its taking long time for execution so please provide me the solution.
In this SQL one function is being used GETROLESFORUSER and also i am executing above SQL I got the error function return without value..
so please check the code and provide me the best solution for good performance for fetching the records from above SQL.
Thanks
Kiran
when i am executing the below SQL its taking long time for execution so please provide me the solution.
Code:
SELECT A.ID,
A.IDTYPE,
A.USERNAME,
A.FIRSTNAME,
A.LASTNAME,
A.STATUS,
A.LANGUAGEID,
A.LANGUAGENAME,
GETROLESFORUSER(A.USERNAME) ROLES,
0 CLUBID,
A.ISDISABLED,
0 REGION
FROM (SELECT W.ID,
W.IDTYPE,
W.USERNAME,
P.FIRSTNAME,
P.LASTNAME,
W.ACCT_STATCD STATUS,
W.PREFERREDLANGUAGE LANGUAGEID,
LT.LANGNAME LANGUAGENAME,
P.SORTFIRSTNAME,
P.SORTLASTNAME,
W.ISDISABLED,
TRUNC(W.CREATEDT) CREATEDT,
REGISTRATION_TYPE
FROM WEBUSER W
JOIN PERSON P ON W.ID = P.ID
AND W.IDTYPE = P.IDTYPE
LEFT JOIN LANGTYPE LT ON W.PREFERREDLANGUAGE = LT.LANGTY) A
WHERE 1 = 1
AND TRUNC(A.CREATEDT) BETWEEN '01-JUN-2009' AND '30-Oct-2009';
Code:
CREATE OR REPLACE FUNCTION GETROLESFORUSER(PUSERNAME IN WEBUSER.USERNAME%TYPE)
RETURN VARCHAR2 IS
VROLES VARCHAR2(32767);
TYPE MY_ROLES IS TABLE OF VARCHAR2(100);
MYROLE MY_ROLES;
CURSOR CURSOROUT(PUSERNAME VARCHAR2) IS
SELECT NVL2(C.COMMDESC, PN.POSDESC || '-' || C.COMMDESC, PN.POSDESC) ROLENAME
FROM POSITIONHOLDER PH,
WEBUSER WU,
POSITIONNAME PN,
(SELECT CD.COMMID, CN.COMMDESC
FROM COMMITTEE CD, COMMNAME CN
WHERE CN.COMMID = CD.COMMID
AND CD.EFFDT <= SYSDATE
AND (CD.ENDDT >= SYSDATE OR CD.ENDDT IS NULL)
AND CN.LANGTY = 0) C
WHERE PH.ID = WU.ID
AND PH.IDTYPE = WU.IDTYPE
AND PH.POSITIONID = PN.POSITIONID
AND PH.COMMID = C.COMMID(+)
AND PH.EFFDT <= SYSDATE
AND (PH.ENDDT >= SYSDATE OR PH.ENDDT IS NULL)
AND UPPER(WU.USERNAME) = UPPER(PUSERNAME)
AND PN.LANGTY = 0
AND PN.GENDER = 'M'
UNION
SELECT PN.POSDESC
FROM POSITIONNAME PN
WHERE PN.POSDESC = 'All Constituents';
BEGIN
OPEN CURSOROUT(PUSERNAME);
FETCH CURSOROUT BULK COLLECT INTO MYROLE;
FOR REC_CUR IN MYROLE.FIRST .. MYROLE.LAST LOOP
IF MYROLE(REC_CUR) IS NOT NULL THEN
VROLES := VROLES || ', ' || MYROLE(REC_CUR);
END IF;
END LOOP;
VROLES := SUBSTR(VROLES, 3);
RETURN VROLES;
EXCEPTION
WHEN OTHERS THEN
BEGIN
DBMS_OUTPUT.PUT('error');
END;
END GETROLESFORUSER;
Thanks
Kiran
Comment