Вам не нужен динамический SQL или даже PL/SQL. Вы можете сделать это в SQL-запросе, используя UNPIVOT
:
Настройка Oracle:
CREATE TABLE test_data ( Student_Id, Student_Name, Maths, English, History, Physics ) AS
SELECT 1, 'ABC', 93, 89, 90, 70 FROM DUAL UNION ALL
SELECT 2, 'XYZ', 88, 98, 88, 80 FROM DUAL UNION ALL
SELECT 3, 'DEF', 79, 78, 87, 90 FROM DUAL;
Запрос:
SELECT score
FROM test_data
UNPIVOT ( score FOR subject IN ( Maths, English, History, Physics ) )
WHERE subject = 'MATHS'
AND student_name = 'ABC'
Вывод:
| SCORE |
| ----: |
| 93 |
db‹>скрипка здесь
Если вы хотите использовать функцию PL/SQL, вам все равно не нужен динамический SQL, и вы можете просто обернуть приведенный выше запрос или использовать оператор CASE
, как показано ниже:
Функция PL/SQL:
CREATE FUNCTION getScore(
i_student_name IN TEST_DATA.STUDENT_NAME%TYPE,
i_subject IN VARCHAR2
) RETURN NUMBER
IS
p_score NUMBER(3,0);
BEGIN
SELECT CASE i_subject
WHEN 'MATHS' THEN Maths
WHEN 'ENGLISH' THEN English
WHEN 'HISTORY' THEN History
WHEN 'PHYSICS' THEN Physics
END
INTO p_score
FROM test_data
WHERE student_name = i_student_name;
RETURN p_score;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL;
END;
/
Затем:
SELECT getScore( 'ABC', 'MATHS' ) FROM DUAL;
Выходы:
| GETSCORE('ABC','MATHS') |
| ----------------------: |
| 93 |
db‹>скрипка здесь
person
MT0
schedule
22.11.2019