Oracle PL/SQL我想要对应的MAX(O.CO_YEAR)列。怎么做?
下面是PL/SQL查询的代码,我必须为其获取有资格教授特定课程的讲师的姓名(如果提供了姓名),以及他们教授该课程的次数和最后一次教授该课程的时间(年份和学期) 我已经完成了问题的大部分,但不知道如何获得max(o.co_年)即期限的相应细节Oracle PL/SQL我想要对应的MAX(O.CO_YEAR)列。怎么做?,oracle,plsql,Oracle,Plsql,下面是PL/SQL查询的代码,我必须为其获取有资格教授特定课程的讲师的姓名(如果提供了姓名),以及他们教授该课程的次数和最后一次教授该课程的时间(年份和学期) 我已经完成了问题的大部分,但不知道如何获得max(o.co_年)即期限的相应细节 declare gname varchar2(20); count_id number(2); id varchar(20); year1 number(4); cursor abc // cursor 1 is SELECT
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)列。怎么做 Oracle中的游标可以有参数。有关详细信息,请参阅 它在代码中的工作方式:
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;
是的,我知道,但这是一项大学任务,我想用PL/SQL实现 废话!我宁愿你们的大学教你们如何正确使用PLSQL和SQL,并给你们一个有意义的任务。如果您可以在SQL中执行某些操作,请在SQL中执行。
另外:为什么您的游标包含
到关键字中?为什么你需要一个环?似乎您只期望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;
哦,请给你的专栏起个有意义的名字。例如,将其称为i\u id
,而不是i\u 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中使用它,您仍然可以使用一个循环来覆盖每门课程的多个讲师,或者如果您将其缩小为一门课程和一个讲师,则可以使用一些变量。始终尽量减少SQL和PLSQL上下文之间的切换。为什么要在PL/SQL中执行所有这些操作?你可以把这些都写成一条SQL语句。是的,我知道,但这是一项大学任务,我想用PL/SQL来实现。你说“想为year1属性输出相应的列详细信息”是什么意思?我的意思是在COURSEOFFERING表中有5列,即a、B、C、D、e,F…….当我们对D列进行最大值计算时,我想用解析函数输出最大值加上BLook列中相应的值。它们类似于聚合,但可以为每一行返回。请参阅示例。代码运行,但在实现上述更改后没有输出。首先:o.i\u id=i\u id
始终为真,可以删除,但这不会神奇地使代码正常工作。阿门!对不起,我不得不说。非常感谢你,汤姆,这让我大开眼界。您构建查询的方式和解释对我非常有用。再次感谢!!!