0

我是 pl-sql 的初学者,我正在尝试编写一个函数代码来读取课程名称并显示讲师名称、课程名称和与课程名称匹配的标题。

但是,不管我尝试过的不同方法,我都无法得到一个像样的输出,而且我得到了很多不同的错误,目前下面是能够编译但没有给出任何结果的代码。

谁能帮我完成这个功能并告诉我哪里出错了?

Set echo on

set serveroutput on

CREATE OR REPLACE FUNCTION Courses(coursename IN VARCHAR2) RETURN VARCHAR2

IS
    results VARCHAR2(100);
    l VARCHAR2(30);
    c VARCHAR2(30);
    t VARCHAR2(30);

BEGIN

    FOR course IN(select lecturerName, coursename, title into l,c,t  from course where Coursename = coursename)

LOOP
    results := results || l || c || t;
END LOOP;


RETURN results;

END Courses;
/

SELECT Courses('SQL') from dual;


Courses('SQL')
4

2 回答 2

1

如果您希望函数根据课程名称返回所有匹配项,则结果将类似于表格。我猜你不想返回 1 场比赛,你的桌子上可能还有更多。此外,您可能不希望将所有匹配项都视为一行,即所有匹配项都合并在一起。

为此,您需要一个返回数据集的流水线函数,该数据集由自定义类型表示。

首先,创建类型:

CREATE OR REPLACE TYPE COURSEINFO as Table of VARCHAR2(512); --size can vary based on your needs

函数变为:

CREATE OR REPLACE FUNCTION COURSES (
   p_coursename   IN VARCHAR2)
   RETURN COURSEINFO
   PIPELINED
IS
   text      VARCHAR2 (512);
BEGIN
   FOR course IN (SELECT lecturerName, coursename, title
                    FROM course
                   WHERE Coursename = p_coursename)
   LOOP
      text := course.lecturerName || ', ' || course.coursename || ', ' || course.title;

    PIPE ROW(text);
   END LOOP;

   RETURN;
END COURSES;

对于输入表:

课程1 | 标题2 | 讲师3
课程1 | 标题1 | 讲师1
课程2 | 标题2 | 讲师2

和查询:

select COLUMN_VALUE as COURSE_INFO from table(COURSES('course1')); 

产生输出:

讲师1,课程1,标题1
讲师3,课程1,标题2
于 2014-11-13T10:00:11.217 回答
0

应该是这个

FOR course IN (select lecturerName, coursename, title from course where Coursename = coursename) 

LOOP
    results := results || course.lecturerName || course.coursename || course.title;
END LOOP;

或者更简单

select lecturerName||coursename||title||
from course 
where Coursename = 'SQL';
于 2014-11-13T09:11:54.887 回答