Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL将多个varchar2选择为一个varchar2_Oracle_Plsql_Varchar2 - Fatal编程技术网

Oracle PL/SQL将多个varchar2选择为一个varchar2

Oracle PL/SQL将多个varchar2选择为一个varchar2,oracle,plsql,varchar2,Oracle,Plsql,Varchar2,我是pl sql的初学者,我正在尝试编写一个函数的代码,以便在coursename中读取并显示讲师姓名、coursename以及与coursename匹配的标题 然而,我无法得到一个像样的输出,不管我尝试过的不同方法,我得到了很多不同的错误,下面是能够编译但没有给出任何结果的代码 有谁能帮我完成这个功能并告诉我哪里出错了吗 Set echo on set serveroutput on CREATE OR REPLACE FUNCTION Courses(coursename IN VARC

我是pl sql的初学者,我正在尝试编写一个函数的代码,以便在coursename中读取并显示讲师姓名、coursename以及与coursename匹配的标题

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

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

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')
一定是这个

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';

如果希望函数根据课程名称返回所有匹配项,则结果将类似于表。我猜你不想返回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;
对于输入表:

course1 | title2 | lecturer3 course1 | title1 | lecturer1 course2 | title2 | lecturer2 生成输出:

lecturer1, course1, title1 lecturer3, course1, title2 讲师1,课程1,标题1 讲师3,课程1,标题2
从PL/SQL调用SQL时,您混合了两种不同的方法:要么将
用于
,要么将
用于c IN(SQL)循环…
,而不是两者都使用。您的代码有一个主要错误
,其中Coursename=Coursename
对于任何记录都是真的,即,无论您的输入是什么,都将始终选择完整的表。对列和变量使用不同的名称。 lecturer1, course1, title1 lecturer3, course1, title2