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およびsqldeveloper / 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. バーコードの生成と読み取り

    2. mysql_fetch_assoc()の問題を解決する方法

    3. mysql経由でphpを実行しますか?

    4. PostgreSQL:左外部結合構文