Sql动态列转行,该怎么解决

Sql动态列转行数据表A,表示每个学生的课程表student_idCourse1语文1数学2英语3语文3英语现在要查询显示成

Sql动态列转行
数据表A,表示每个学生的课程表

student_id      Course
1                语文
1                数学
2                英语
3                语文
3                英语


现在要查询显示成这样(学生有该课程的就为Y,否则为N)

student_id    语文     数学    英语
1              Y         Y       N
2              N         N       Y
3              Y         N       Y

上面的课程只有3个,事实上课程是不固定的,会增加的.
[解决办法]
a  11g以上版本用pivot
b  动态拼接sql
c  自己写自定义函数
[解决办法]
只能用存储过程处理了

----------------新建测试表
CREATE TABLE tmp_user_2(student_id NUMBER,Course VARCHAR2(100));

----------------第一部分测试数据
INSERT INTO tmp_user_2 VALUES(1, '语文'); 
INSERT INTO tmp_user_2 VALUES(1, '数学');
INSERT INTO tmp_user_2 VALUES(2, '英语');
INSERT INTO tmp_user_2 VALUES(3, '语文');
INSERT INTO tmp_user_2 VALUES(3, '英语');
COMMIT;

----------------行转动态列存储过程
CREATE OR REPLACE PROCEDURE P_tmp_user_2 IS
  V_SQL VARCHAR2(2000);
  CURSOR CURSOR_1 IS
    SELECT DISTINCT T.Course FROM tmp_user_2 T ORDER BY Course;

BEGIN
  V_SQL := 'SELECT student_id';
  FOR V_XCLCK IN CURSOR_1 LOOP


    V_SQL := V_SQL 
[解决办法]
 ',' 
[解决办法]
 'MAX(DECODE(Course,''' 
[解决办法]
 V_XCLCK.Course 
[解决办法]

             ''',''Y'',''N'')) AS ' 
[解决办法]
 V_XCLCK.Course;
  END LOOP;

  V_SQL := V_SQL 
[解决办法]
 ' FROM tmp_user_2 GROUP BY student_id';
  --DBMS_OUTPUT.PUT_LINE(V_SQL);
  V_SQL := 'CREATE OR REPLACE VIEW tmp_user_3  AS ' 
[解决办法]
 V_SQL;
  --DBMS_OUTPUT.PUT_LINE(V_SQL);
  EXECUTE IMMEDIATE V_SQL;
END;

----------------执行存储过程
BEGIN
  P_tmp_user_2;               
END;

----------------查看结果
SELECT * FROM tmp_user_3;

----------------第二部分测试数据
INSERT INTO tmp_user_2 VALUES(3, '物理'); 
INSERT INTO tmp_user_2 VALUES(2, '语文'); 
COMMIT;

----------------执行存储过程
BEGIN
  P_tmp_user_2;               
END;
----------------查看结果
SELECT * FROM tmp_user_3;