amushen

The objective of this function is to transpose rows to columns.

This RowToCol function is built with invoker-rights AUTHID CURRENT_USER. The function works on tables/views of the user who invokes the function, not on the owner of this function.

RowToCol takes two parameters:

1. SQL Statement: You can pass any valid SQL statement to this function.
2. Delimiter: You can pass any character as a delimiter. Default value is `,?

CREATE OR REPLACE FUNCTION ROWTOCOL(P_SLCT IN VARCHAR2,

                  P_DLMTR IN VARCHAR2 DEFAULT \',\') RETURN VARCHAR2

AUTHID CURRENT_USER AS

  TYPE C_REFCUR IS REF CURSOR;

  LC_STR VARCHAR2(4000);

  LC_COLVAL VARCHAR2(4000);

  C_DUMMY C_REFCUR;

  L NUMBER;

BEGIN

  OPEN C_DUMMY FOR P_SLCT;

  LOOP

    FETCH C_DUMMY

      INTO LC_COLVAL;

    EXIT WHEN C_DUMMY%NOTFOUND;

    LC_STR := LC_STR || P_DLMTR || LC_COLVAL;

  END LOOP;

  CLOSE C_DUMMY;

  RETURN SUBSTR(LC_STR, 2);

EXCEPTION

  WHEN OTHERS THEN

    LC_STR := SQLERRM;

    IF C_DUMMY%ISOPEN THEN

      CLOSE C_DUMMY;

    END IF;

    RETURN LC_STR;

END;

具体使用 方法

(1)

SELECT A.DEPTNO,

       A.DNAME,

       A.LOC,

       ROWTOCOL(\'SELECT DISTINCT job FROM emp WHERE deptno = \' || A.DEPTNO) AS JOBS

  FROM DEPT A;

(2)

SELECT DISTINCT A.JOB,

                ROWTOCOL(\'SELECT ename FROM emp WHERE job = \' || \'\'\'\' ||

                         A.JOB || \'\'\'\' || \' ORDER BY ename\') AS EMPLOYEES

  FROM EMP A;

(3)

SELECT DISTINCT customer_id, rowtocol (\'SELECT FEE_TYPE_NO

  FROM CUSTOMER_FEE_MONTH T where CUSTOMER_ID=\'

  ||customer_id)

 FROM CUSTOMER_FEE_MONTH

WHERE CUSTOMER_ID = \'0000011996\'

 AND year_month=\'200702\' ;

(4)

多个条件加入

SELECT DISTINCT A.year_month,A.customer_id, rowtocol (\'SELECT FEE

  FROM CUSTOMER_FEE_MONTH T where  CUSTOMER_ID =\'||\'\'\'0000011996\'\'\'||\'

AND fee_type_no=\'||\'\'\'153\'\'\'||\'and CUSTOMER_ID=\'

  ||A.customer_id || \'and year_month=\'||A.YEAR_MONTH)

 FROM CUSTOMER_FEE_MONTH A

WHERE CUSTOMER_ID = \'0000011996\'


分类:

技术点:

相关文章: