Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Korzystanie z Oracle:Czy mogę użyć „dynamicznie” tworzonej zmiennej w klauzuli pivot?

Dla 12c i nowszych możesz użyć DBMS_SQL.RETURN_RESULT otwierając REFCURSOR dla dynamicznego PIVOT zapytanie.

Usunąłem osławiony (+) składnia left join , zawsze używaj ANSI join składnia.

DECLARE
    exam_ids   VARCHAR2(255);
    x          SYS_REFCURSOR;
BEGIN
    SELECT
        LISTAGG(''''
                  || exam_id
                  || ''' AS "'
                  || exam_name
                  || '"',',') WITHIN GROUP(
            ORDER BY
                exam_id DESC
        )
    INTO exam_ids
    FROM
        exam;

    OPEN x FOR 'SELECT
        *
               FROM
        (
            SELECT
                u.user_id,
                u.user_name,
                e.exam_id,
                eu.exam_date
            FROM
                users u
                LEFT JOIN exam_user eu ON u.user_id = eu.user_id
                LEFT JOIN exam e ON e.exam_id = eu.exam_id
            ORDER BY
                u.user_id
        )
            PIVOT ( MAX ( exam_date )
                FOR exam_id
                IN ( ' || EXAM_IDS || ' )
            )
    ORDER BY
        1';

    dbms_sql.return_result(x);
END;
/

Dla 11g możesz użyć zmiennej bind i print polecenie ( działa w sqlplus i sql developer/Toad, gdy jest uruchamiane jako skrypt (F5))

variable x REFCURSOR  -- bind variable declared.
DECLARE
    ..   -- no need to declare sys_refcursor
BEGIN
     ..

    OPEN :x FOR 'SELECT . --note the change with colon
        *
               FROM
        (
            SELECT
            ..

END;
/


print x




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyciek pamięci OracleBulkCopy (wyjątek OutOfMemory)

  2. Zwracanie kursora ref z funkcji Oracle

  3. Wprowadzenie do kursorów referencyjnych PL/SQL w bazie danych Oracle

  4. WYBIERZ dane Z KURSORA PAKIETU, wydrukuj

  5. Oracle ojdbc8 12.2.0.1 Zabronione przez Maven