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 つの一致を返したくないのではないかと思います。テーブルにはさらに多くの一致がある可能性があります。また、すべての一致を 1 つの行として扱いたくない場合もあります。つまり、すべての一致を 1 つにマージすることです。

このためには、カスタム タイプで表されるデータセットを返すパイプライン関数が必要です。

まず、TYPE を作成します。

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 に答える