Функция в Oracle, которая возвращает 2 разных столбца таблицы - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь создать функцию, которая возвращает 2 разных столбца в одной таблице. Может ли кто-нибудь помочь мне с этим?

Я уже пробовал этот способ:

CREATE FUNCTION return_id_grade(subjectId IN NUMBER, semesterYear IN DATE , n IN INT, option IN INT)
RETURN NUMBER
                IS studentId NUMBER(5),
                IS studentGrade NUMBER(2,1);
   BEGIN
                SELECT DISTINCT student_id INTO studentId,
                       grade INTO studentGrade
                    FROM (SELECT studentId, grade, dense_rank() over (ORDER BY grade desc) rank FROM old_students) 
                        WHERE subject_id = subjectId 
                            AND semester_year = semesterYear
                            AND rank = n
                            AND rownum <= 1
    CASE 
                WHEN option = 1 then RETURN(student_id)
                WHEN option = 2 then RETURN(grade)
    END;

END;

Я ожидал вывести n'NTH класс университетского класса и идентификатор студента, но фактический может просто вывести опцию, полученную в поле параметра.

Ответы [ 3 ]

1 голос
/ 05 июля 2019

a. Вы не можете использовать Выберите colum1 INTO variable1, colum2 INTO variable2.Он должен выглядеть следующим образом: Выберите column1, column2 INTO variable1, variable 2

b. Создайте тип объекта и используйте его в качестве параметра out в процедуре

c. Оставьте условие опции послевызывается процедура.

Пример кода:

      CREATE OR REPLACE TYPE ty_obj_idgrade AS OBJECT
      (studentId    NUMBER(5)
      ,studentGrade    NUMBER(2,1)
       );



      CREATE OR REPLACE PROCEDURE return_id_grade(
                                        subjectId IN NUMBER, 
                                        semesterYear IN DATE , 
                                        n IN INT, 
                                       -- options IN INT
                                        ,p_idgrade OUT ty_obj_idgrade) IS
       BEGIN
            SELECT DISTINCT student_id --INTO studentId,
                            ,grade --INTO studentGrade
                       INTO p_idgrade.studentId
                            ,p_idgrade.grade
                       FROM (SELECT studentId
                                    ,grade
                                    ,dense_rank() over (ORDER BY grade desc) rank 
                                    ,subject_id
                                    ,semester_year
                               FROM old_students )
                WHERE  subject_id = subjectId
                  AND  semester_year = semesterYear
                  AND  rank = n
                  AND  rownum <= 1;

EXCEPTION
WHEN OTHERS THEN
    dbms_output.put_line('we are inside when others -->'||sqlerrm);

END;

Вызовите вашу процедуру.

Поскольку параметры использовались в качестве параметра IN, они должны быть доступны вне prc / fnc.это можно сделать после вызова prc / fnc. Если options = 1 THEN value: = p_idgrade.conatct Значение ELSE: = p_idgrade.grade END IF;

Надеюсь, это поможет.

0 голосов
/ 05 июля 2019

Вы можете напрямую попытаться использовать OPTION в запросе следующим образом:

CREATE FUNCTION RETURN_ID_GRADE (
    SUBJECTID      IN             NUMBER,
    SEMESTERYEAR   IN             DATE,
    N              IN             INT,
    OPTION         IN             INT
) RETURN NUMBER IS
    LV_RETURN_NUMBER   NUMBER(6, 1);
BEGIN
    -- QUERY TO FETCH REQUIRED DATA ONLY
    SELECT -- DISTINCT -- DISTINCT IS NOT NEEDED AS ROWNUM <= 1 IS USED
        CASE
            WHEN OPTION = 1 THEN STUDENT_ID
            ELSE GRADE
        END AS LV_RETURN_NUMBER
    INTO LV_RETURN_NUMBER -- STORE VALUE BASED ON OPTION
    FROM
        (
            SELECT
                STUDENTID,
                GRADE,
                DENSE_RANK() OVER(
                    ORDER BY
                        GRADE DESC
                ) RANK
            FROM
                OLD_STUDENTS
        )
    WHERE
        SUBJECT_ID = SUBJECTID
        AND SEMESTER_YEAR = SEMESTERYEAR
        AND RANK = N
        AND ROWNUM <= 1;

    RETURN LV_RETURN_NUMBER; -- RETURN THE VARIABLE

END;

Cheers !!

0 голосов
/ 05 июля 2019

Не пытался его скомпилировать, но что-то вроде этого должно быть близко.

CREATE FUNCTION return_id_grade(subjectId IN NUMBER, semesterYear IN DATE , n IN INT, option IN INT)
RETURN NUMBER IS
studentId NUMBER(5),
studentGrade NUMBER(2,1);
   BEGIN
                SELECT DISTINCT student_id, grade
                INTO studentId, studentGrade
                    FROM (SELECT studentId, grade, dense_rank() over (ORDER BY grade desc) rank FROM old_students) 
                        WHERE subject_id = subjectId 
                            AND semester_year = semesterYear
                            AND rank = n
                            AND rownum <= 1;
    IF option = 1 then 
         RETURN studentId ;
    ELSE
        RETURN studentGrade ;
    END IF;
    END;

END;

Тем не менее, эта функция действительно не очень хорошая конструкция. Функция должна выполнять одну задачу. Если вы хотите вернуть оба элемента, создайте тип записи PL / SQL и используйте хранимую процедуру с параметром OUT и верните ее в процедуре.

...