Utilizando Oracle combine tres tablas en una con PIVOT

Tengo tres consultas de selección Oracle SQL que devuelve los siguientes resultados. La primera consulta de selección devuelve el resultado:

 user_id | user_name |
---------|-----------|
     1   |   user_1  |
     2   |   user_2  |
     3   |   user_3  |
     4   |   user_4  |

a segunda consulta de selección devuelve el resultado:

 exam_id | exam_name |
---------|-----------|
    1    |   exam_1  |
    2    |   exam_2  |
    3    |   exam_3  |

y la tercera consulta de selección devuelve el resultado:

 exam_id | user_id | exam_date |
---------|---------|-----------|
    1    |    1    |    2017   |
    1    |    2    |    2018   |
    1    |    3    |    2017   |
    2    |    3    |    2018   |

Me gustaría combinar estas consultas para obtener el resultado:

 user_id | user_name | exam_1 | exam_2 | exam_3 |
---------|-----------|--------|--------|--------|
     1   |   user_1  |  2017  |        |        |
     2   |   user_2  |  2018  |        |        |
     3   |   user_3  |  2017  |  2018  |        |
     4   |   user_4  |        |        |        |

¿Estaría agradecido por cualquier ayuda

Gracias @shrek por ayudarme aquí. Logré crear la variable para los valores de pivote pero no pude poner la variable en el pivote. Entonces obtuve ayuda para esoaqu y la versión final (para 11g) se ve así:

variable x REFCURSOR
DECLARE
    exam_ids   VARCHAR2(255);
BEGIN
    SELECT
        LISTAGG(''''
                  || exam_id
                  || ''' AS "'
                  || exam_name
                  || '"',',') WITHIN GROUP(
            ORDER BY
                exam_id ASC
        )
    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';
END;
/

print x

Así que funciona en SQL Developer y SQL * Plus. Pero no cuando se trata de usar una base de datos con un archivo PHP. Para eso necesitaba crear un procedimiento que luego se pudiera llamar desde un archivo PHP. @Aqu es un problema al intentar usar el código anterior del archivo PHP y la resolución.

Respuestas a la pregunta(1)

Su respuesta a la pregunta