Oracle 函数,该函数返回表的两个不同列
我试图创建一个函数,在一个表中返回两个不同的列,有人能帮我吗 我已经试过这样做:Oracle 函数,该函数返回表的两个不同列,oracle,plsql,oracle11g,stored-functions,Oracle,Plsql,Oracle11g,Stored Functions,我试图创建一个函数,在一个表中返回两个不同的列,有人能帮我吗 我已经试过这样做: 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
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'n年级和学生Id,但实际的可以只输出参数字段上收到的选项。没有尝试编译它,但类似的东西应该很接近
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参数的存储过程,然后在过程中返回该参数。您可以直接尝试在查询中使用选项,如下所示:
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;
干杯 a.您不能使用Select COLUMN1 INTO variable1,COLUMN2 INTO variable2。它必须是这样的: 将column1、column2选择为variable1、variable2 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呼叫后完成
如果选项=1
然后
值:=p_idgrade.conatct
其他的
值:=p_idgrade.grade
如果结束
希望能有所帮助。快速阅读:你失踪了;在SELECTINTO语句之后。然后,带有RETURN语句的CASE表达式应该是相反的:option=1时返回CASE,option=2时返回student_id,然后是年级结束;你是对的,我错过了…谢谢你…还有,你有两个是关键词。这是一个非常好的缩进大小。通常人们使用2或4个空格。非常好!!但是,除了使用变量选项之外,还有其他选项吗?我可以在示例中输出结果:StudentId和StudentGrade,29,5. 为anwser干杯!谢谢你的邀请!!但是有没有一种方法可以在示例中输出结果:StudentId和StudentGrade,29,5. 不使用变量选项?不确定我是否理解不使用变量?如果你不把结果存储在某个地方,你希望如何引用它们呢?事实上,我在考虑同时获得StudentId和他的成绩,而不是用变量选项选择其中一个。完全理解!!谢谢你的回答。。我想知道我不使用option变量的其他方法,以及是否有其他方法在示例中输出以下结果:StudentId和StudentGrade,29,5.