Oracle
 sql >> база данни >  >> RDS >> Oracle

Използване на Oracle:Мога ли да използвам „динамично“ създадена променлива в клаузата за завъртане?

За 12c и по-нови можете да използвате DBMS_SQL.RETURN_RESULT като отворите REFCURSOR за динамичния PIVOT заявка.

Премахнах прословутия (+) синтаксис за left join , винаги използвайте ANSI join синтаксис.

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;
/

За 11g можете да използвате променлива за свързване и print команда ( работи в sqlplus и в sql developer/Toad, когато се изпълнява като скрипт (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. Ред за изпълнение на ORACLE SQL ROWNUM

  2. Как да видите действителния SQL оператор на Oracle, който се изпълнява

  3. Oracle, еквивалент на SQL Server, включва колони за индексиране

  4. PL/SQL - изпълнение незабавно в конвейерна функция

  5. Формат на датата на Oracle