0

以下は、PL/SQL クエリのコードです。特定のコースを教える資格のあるインストラクターの名前が、このコースを教えた回数と最後に教えた回数 (年と学期) とともに指定されたときに取得する必要があります。 ) 彼らがこのコースを教えたとき。

質問の大部分は完了しましたが、対応する max(o.co_year) の詳細を取得する方法がわかりませんでした。

declare
gname varchar2(20);
count_id number(2);
id varchar(20);
year1 number(4);

cursor abc   // cursor 1
     is
        SELECT  i.i_gname
          into gname
        FROM INSTRUCTOR I 
        WHERE i.i_id in (
        SELECT t.i_id  FROM TeachingQualification T
        WHERE t.c_id in (SELECT c.c_id  FROM  COURSE C
        WHERE c.c_title = 'Advanced Database App')) ;


cursor bcd // cursor two
    is
        select o.i_id, count(o.i_id), max(o.co_year)
          into id, count_id, year1
        from courseoffering o
        where (o.i_id = i_id and o.c_id = 1234567)
        group by o.i_id;


Begin
open abc;
open bcd; 

loop

FETCH abc into gname;
exit when abc%NOTFOUND;

FETCH bcd into id, count_id, year1;
exit when bcd%NOTFOUND;

DBMS_OUTPUT.PUT_LINE ('NAME: ' || gname || '  Number of times taught ' || count_id || ' Year ' || year1 || );  // want to output corresponding column details for the year1 attribute.

end loop;
close bcd;
close abc;
end;

PL/SQL MAX(O.CO_YEAR)の対応する列が欲しいです。どうやってするの?

4

2 に答える 2

2

ええ、私は知っていますが、それは私がPL/SQLで実装されると思われる大学のタスクです。

ブラ!むしろ、あなたの大学がPLSQLとSQLの適切な使用法について教えてくれ、意味のある仕事をしてくれたらと思います。SQLで何かできる場合は、SQLで実行してください。
また:カーソルにINTOキーワードが含まれているのはなぜですか?なぜループが必要なのですか?戻り値が1つしかないようです。

私はあなたのコードを少し分析しました:

--instructors who are qualified to teach a course
SELECT i.i_gname --instructor name
  FROM INSTRUCTOR I 
 WHERE i.i_id IN ( SELECT t.i_id --instructor_id
                     FROM TeachingQualification T
                    WHERE t.c_id in (SELECT c.c_id --course_id
                                       FROM  COURSE C
                                      WHERE c.c_title = 'Advanced Database App'));


--instructors who taught a course, with amount and last time
SELECT o.i_id instructor_id, count(o.i_id) times_taught, max(o.co_year) last_time_taught
  FROM courseoffering o
 WHERE o.c_id = 1234567 --course_id
 GROUP BY o.i_id;

--all instructors (ID) who taught advanced database app, how many times, and last time
--consider that this may produce NO_DATA_FOUND
SELECT o.i_id instructor_id, count(o.i_id) times_taught, max(o.co_year) last_time_taught
  FROM course c
  JOIN courseoffering o 
    ON c.c_id = o.c_id
 WHERE c.c_title = 'Advanced Database App'
 GROUP BY o.i_id; 

-- i don't think teachingqualification is required. The last select providers instructor IDs.
-- There is no need to go through that table, unless it would contain extra data you'd want to
-- filter by. Since courseoffering is being queried, and it has instructors, it stands to reason
-- that those instructor are qualified to teach the course.
SELECT  (SELECT i_gname FROM instructor WHERE i_id = o.i_id) instructor
       ,count(o.i_id) times_taught
       , max(o.co_year) last_time_taught
  FROM course c
  JOIN courseoffering o 
    ON c.c_id = o.c_id
 WHERE c.c_title = 'Advanced Database App'
 GROUP BY o.i_id;

-- Look, if you do want a PLSQL block for this, go ahead.
BEGIN
   FOR r IN (SELECT  (SELECT i_gname FROM instructor WHERE i_id = o.i_id) instructor
                    ,count(o.i_id) times_taught
                    , max(o.co_year) last_time_taught
               FROM course c
               JOIN courseoffering o 
                 ON c.c_id = o.c_id
              WHERE c.c_title = 'Advanced Database App'
              GROUP BY o.i_id)
   LOOP
      DBMS_OUTPUT.PUT_LINE ('NAME: ' || r.instructor || '  Number of times taught ' || r.times_taught || ' Year ' || r.last_time_taught);
   END LOOP;
END;

ああ、そしてあなたの列に意味のある名前を付けてください。たとえば、instructor_id代わりにそれを呼び出します。i_id

いくつかのサンプルデータを設定しました。

create table course (id number(5,0), cname varchar2(50), constraint course_pk primary key (id))
/
create table courseoffering(id number(5,0), course_id number(5,0), instructor_id number(5,0), course_year number(5,0), constraint offering_pk primary key (id), constraint course_fk foreign key (course_id) references course (id))
/
insert into course values (1, 'Tech I');
insert into course values (2, 'Basic SQL');
insert into course values (3, 'Advanced SQL');
--Instructor 1
insert into courseoffering values (1, 1, 1, 2009); --Tech I
insert into courseoffering values (2, 1, 1, 2010); --Tech I
insert into courseoffering values (3, 1, 1, 2011); --Tech I
insert into courseoffering values (4, 2, 1, 2011); --Basic SQL
insert into courseoffering values (5, 2, 1, 2012); --Basic SQL
--Instructor 2
insert into courseoffering values (6, 2, 2, 2008); --Basic SQL
insert into courseoffering values (7, 2, 2, 2009); --Basic SQL
insert into courseoffering values (8, 2, 2, 2010); --Basic SQL
insert into courseoffering values (9, 3, 2, 2010); --Advanced SQL
insert into courseoffering values (10, 3, 2, 2011); --Advanced SQL
insert into courseoffering values (11, 3, 2, 2012); --Advanced SQL
insert into courseoffering values (12, 1, 2, 2009); --Tech I
insert into courseoffering values (13, 1, 2, 2010); --Tech I
commit;

これを実行する:

SELECT c.cname, o.instructor_id, count(o.instructor_id) times_taught, max(o.course_year) last_time_taught
  FROM course c
  JOIN courseoffering o 
    ON c.id = o.course_id
 GROUP BY c.cname, o.instructor_id
 ORDER BY c.cname, o.instructor_id; 

生産:

CNAME          INSTRUCTOR_ID  TIMES_TAUGHT   LAST_TIME_TAUGHT
Advanced SQL   2              3              2012
Basic SQL      1              2              2012
Basic SQL      2              3              2010
Tech I         1              3              2011
Tech I         2              2              2010

必要なデータをビューに簡単に変換することもできます。PLSQLは必要ありません。SQLでは数行だけです。また、PLSQLで必要な場合は、ループを使用してコースごとに複数のインストラクターをカバーできます。または、1つのコースと1つのインストラクター、いくつかの変数に絞り込むことができます。SQLコンテキストとPLSQLコンテキスト間の切り替えは常に最小限に抑えてください。

于 2012-10-29T14:25:21.590 に答える
0

Oracle のカーソルは、パラメーターを持つことができます。詳細については、 http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/sqloperations.htm#BABHICAFを参照してください。

コードでどのように機能するか:

cursor bcd(p_c_id courseoffering.c_id%type) // cursor two
is
    select o.i_id, count(o.i_id), max(o.co_year)
      into id, count_id, year1
    from courseoffering o
    where (o.i_id = i_id and o.c_id = p_c_id)
    group by o.i_id;
于 2012-10-29T08:06:11.103 に答える