简体   繁体   中英

Return an array in oracle stored procedure

I have a Stored procedure which takes 2 input parameter and 6 out. One of the out parameter returns more than one record. Is there any way to declare it as an array hence I don't have to declare a cursor. Here is the code,

CREATE OR REPLACE PROCEDURE SP_GET_USER_DETAILS 
(
  P_ID IN OUT VARCHAR2 
, P_USER_NAME IN OUT VARCHAR2 
, P_USER_TYPE OUT VARCHAR2 
, P_EMPLOYEE_ID OUT VARCHAR2 
, P_LICENSE_NO OUT VARCHAR2 
, P_PHONE_NO OUT VARCHAR2 
) IS 

BEGIN

  SELECT ACCT.ID, ACCT.USERNAME, ACCT.EMPLOYEE_ID, ACCT.LICENSE_NO, 
  ADDRESS.PHONE_NO INTO P_ID, P_USER_NAME, P_EMPLOYEE_ID, P_LICENSE_NO, P_PHONE_NO
  FROM PROVIDER_ACCT ACCT 
  LEFT OUTER JOIN EMP_ADDRESS ADDRESS ON ACCT.ID=ACCT.ID

END SP_GET_PRISON_USER_DETAILS;

The problem is ADDRESS.PHONE_NO alone returns multiple rows. Is there any way to declare it as an array and get this working ? Thanks in advance.

If its not possible, could you please explain how to do it using a ref cursor ?

Use a collection:

CREATE OR REPLACE PROCEDURE SP_GET_USER_DETAILS 
(
  P_ID          IN OUT VARCHAR2 
, P_USER_NAME   IN OUT VARCHAR2 
, P_USER_TYPE   OUT VARCHAR2 
, P_EMPLOYEE_ID OUT VARCHAR2 
, P_LICENSE_NO  OUT VARCHAR2 
, P_PHONE_NO    OUT SYS.ODCIVARCHAR2LIST
)
IS 
BEGIN
  SELECT ID,
         USERNAME,
         EMPLOYEE_ID,
         LICENSE_NO
  INTO   P_ID,
         P_USER_NAME,
         P_EMPLOYEE_ID,
         P_LICENSE_NO
  FROM   PROVIDER_ACCT;

  SELECT ADDRESS.PHONE_NO
  BULK COLLECT INTO P_PHONE_NO
  FROM   PROVIDER_ACCT ACCT 
         LEFT OUTER JOIN EMP_ADDRESS ADDRESS
         ON ACCT.ID = ADDRESS.ID;

END SP_GET_PRISON_USER_DETAILS;
/

Note: you haven't specified a where clause in your question - you probably want to add one in.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM