Show your two ways to do same thing in PL/SQL function base on Oracle 9i.

Way 1:  Loop

 
  
  1.   /**  
  2.   * 根据工程获取相应的供应商,即设计、监理、施工单位  
  3.   *  
  4.   * Zhou Danyong 2011-01-13  
  5.   * 参数:P_TASKID 根据工程id从BO_PHASE_TASK_IS获取的TASKID  
  6.   *       P_TYPE  类型  
  7.   */  
  8.   CREATE OR REPLACE FUNCTION F_GETSUPPLIERBYTYPE(P_TASKID IN VARCHAR2,  
  9.                                                  P_TYPE   IN VARCHAR2)  
  10.   RETURN VARCHAR2 IS 
  11.   V_SUPPLIER VARCHAR2(100) default null;  
  12.   V_S        VARCHAR2(1000) default null;  
  13.   STR        varchar2(20) default null;  
  14.  
  15.   CURSOR C_CURSOR IS 
  16.     SELECT DISTINCT T.SUPPLIERNAME  
  17.       FROM BO_TASK_SUPPLIER T  
  18.      WHERE T.APPID = P_TASKID  
  19.        AND APP_SUPPLIER_TYPE LIKE '%' || P_TYPE || '%';  
  20.  
  21. BEGIN 
  22.   OPEN C_CURSOR;  
  23.  
  24.   LOOP  
  25.     FETCH C_CURSOR  
  26.       INTO V_SUPPLIER;  
  27.     EXIT WHEN C_CURSOR%NOTFOUND;  
  28.     V_S := V_S || STR || V_SUPPLIER;  
  29.     STR := ',';  
  30.   END LOOP;  
  31.  
  32.   CLOSE C_CURSOR;  
  33.  
  34.   RETURN(V_S);  
  35.  
  36. END F_GETSUPPLIERBYTYPE;  

 

Way 2:  By DBMS_UTILITY

 
  
  1.   /**  
  2.   * 根据工程获取相应的供应商,即设计、监理、施工单位  
  3.   *  
  4.   * Zhou Danyong 2011-01-13  
  5.   * 参数:P_TASKID 根据工程id从BO_PHASE_TASK_IS获取的TASKID  
  6.   *       P_TYPE  类型  
  7.   */  
  8.   CREATE OR REPLACE FUNCTION F_GETSUPPLIERBYTYPE_WAY2(P_TASKID IN VARCHAR2,  
  9.                                                       P_TYPE   IN VARCHAR2)  
  10.   RETURN VARCHAR2 IS 
  11.   C_ARR    DBMS_UTILITY.UNCL_ARRAY;  
  12.   RESULT   VARCHAR2(1000);  
  13.   V_NUM NUMBER;  
  14.   V_S    VARCHAR2(1000);  
  15.  
  16. BEGIN 
  17.  
  18.   SELECT DISTINCT T.SUPPLIERNAME BULK COLLECT  
  19.     INTO C_ARR  
  20.     FROM BO_TASK_SUPPLIER T  
  21.    WHERE T.APPID = P_TASKID  
  22.      AND APP_SUPPLIER_TYPE LIKE '%' || P_TYPE || '%';  
  23.  
  24.   DBMS_UTILITY.TABLE_TO_COMMA(C_ARR, V_NUM, V_S);  
  25.  
  26.   RETURN(V_S);  
  27.  
  28. END F_GETSUPPLIERBYTYPE_WAY2;