Добро пожаловать на ТАК!
Во-первых, у вашей схемы / синтаксиса есть несколько проблем:
1. Teacher.lastName объявлен как INTEGER - должен быть вместо этого varchar?
2. Class.acronym определен как первичный ключ, но имеет дубликаты, основанные на ваших данных - должен ли groupNum быть первичным ключом вместо этого?
3. F_Key отсутствует ссылка на столбец
4. teacherCode не определен как первичный ключ в таблице Teacher
. Я создал приведенную ниже примерную схему после устранения этих проблем. Проверьте, действительно ли это то, что вы намеревались
create table teacher
(
name varchar2 (10) not null,
lastname varchar2 (10) not null,
teachercode varchar2 (10) not null,
constraint primarykey primary key (teachercode)
);
create table class
(
acronym varchar2 (10) not null,
groupnum integer not null,
sessioncode integer not null,
teachercode varchar2 (10) not null,
constraint p_key primary key (groupnum),
constraint f_key foreign key (teachercode) references teacher (teachercode)
);
insert into teacher select 'John', 'Jonas', 'JJ000' from dual;
commit;
insert into class
select 'XXX1000' acronym, 10 groupnum, 1000 sessioncode, 'JJ000' teachercode from dual union all
select 'XXX3333', 16, 2000, 'JJ000' from dual union all
select 'XXX2222', 12, 1000, 'JJ000' from dual union all
select 'XXX1000', 13, 2000, 'JJ000' from dual union all
select 'XXX9999', 17, 2000, 'JJ000' from dual;
commit;
select * from teacher;
| NAME |LASTNAME |TEACHERCODE |
| John |Jonas |JJ000 |
select * from class;
|ACRONYM |GROUPNUM |SESSIONCODE |TEACHERCODE |
|XXX1000 |10 |1000 |JJ000 |
|XXX3333 |16 |2000 |JJ000 |
|XXX2222 |12 |1000 |JJ000 |
|XXX1000 |13 |2000 |JJ000 |
|XXX9999 |17 |2000 |JJ000 |
Вы можете распечатать количество классов за сеанс, используя курсор для l oop внутри профи c. Вы можете изменить курсор в зависимости от ваших требований.
Образец выглядит следующим образом ..
CREATE OR REPLACE PROCEDURE numberOfGiverClasses
(codeOfTeacher Teacher.teacherCode%TYPE) IS
v_teacherCode Teacher.teacherCode%TYPE;
v_name Teacher.name%TYPE;
v_lastName Teacher.lastName%TYPE;
BEGIN
SELECT teacherCode, name, lastName
INTO v_teacherCode, v_name, v_lastName
FROM Teacher
WHERE teacherCode = codeOfTeacher ;
DBMS_OUTPUT.PUT_LINE(rpad('Code of the teacher: ',25) || v_teacherCode);
DBMS_OUTPUT.PUT_LINE(rpad('Name: ',25) || v_name);
DBMS_OUTPUT.PUT_LINE(rpad('Last name: ',25) || v_lastName);
for o in (
select sessioncode, count(groupnum) cnt from class
where teachercode = v_teacherCode
group by sessioncode
) loop
DBMS_OUTPUT.PUT_LINE('Number of classes given in the session ' || o.sessionCode ||': ' ||o.cnt );
end loop;
exception when others then
dbms_output.put_line(sqlerrm);
END numberOfGiverClasses;
Образец исполнения
set serveroutput on size unlimited
begin
numberOfGiverClasses('JJ000');
end;
Выход:
Code of the teacher: JJ000
Name: John
Last name: Jonas
Number of classes given in the session 1000: 2
Number of classes given in the session 2000: 3
Если это не сработает, пожалуйста, уточните свой вопрос с дополнительной информацией
Если это соответствует вашим требованиям, не стесняйтесь принять и голос