如何在不重复过程中设置值的情况下计算行数

问题描述 投票:0回答:1

使用Oracle SQL +(PL / SQL)*

在类似情况下,如何使用程序计算木质素的数量:

表格示例

CREATE TABLE Teacher
(name         CHAR(7)       NOT NULL,
 lastName     INTEGER       NOT NULL,
 teacherCode  CHAR(5)       NOT NULL,
CONSTRAINT PrimaryKey PRIMARY KEY (name)
);

CREATE TABLE Class
(acronym           CHAR(7)      NOT NULL,
 groupNum          INTEGER      NOT NULL,
 sessionCode       INTEGER      NOT NULL,
 teacherCode        CHAR(5)     NOT NULL,
CONSTRAINT P_Key PRIMARY KEY (acronym)
CONSTRAINT F_Key FOREIGN KEY (teacherCode)
);

[我想计算特定老师给每节课上的课数。

表中的数据示例

Teacher
John Jonas JJ000 
zzzz zzzzz zzzzz
zzzz zzzzz zzzzz
...

Class
XXX1000 10 1000 JJ000
zzzzzzz zz zzzz zzzzz
XXX3333 16 2000 JJ000
zzzzzzz zz zzzz zzzzz
XXX2222 12 1000 JJ000
zzzzzzz zz zzzz zzzzz
XXX1000 13 2000 JJ000
zzzzzzz zz zzzz zzzzz
XXX9999 16 2000 JJ000

我想打印以下内容:

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

到目前为止,我的程序外观如下:

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;
    v_nbGivenClasses    INTEGER;
    v_sessionCode       Class.sessionCode%TYPE;

BEGIN
    SELECT teacherCode, name, lastName
    INTO v_teacherCode, v_name, v_lastName
    FROM Teacher
    WHERE teacherCode = codeOfTeacher ;

    DBMS_OUTPUT.PUT('Code of the teacher: ');
    DBMS_OUTPUT.PUT_LINE(v_teacherCode);
    DBMS_OUTPUT.PUT('Name: ');
    DBMS_OUTPUT.PUT_LINE(v_name);
    DBMS_OUTPUT.PUT('Last name: ');
    DBMS_OUTPUT.PUT_LINE(v_lastName);

    ????

    DBMS_OUTPUT.PUT('Number of classes given in the session ');
    DBMS_OUTPUT.PUT(v_sessionCode);
    DBMS_OUTPUT.PUT(': ');
    DBMS_OUTPUT.PUT(v_nbGivenClasses);

END numberOfGiverClasses;

因此,我需要计算会话1000中的2个类“ XXX1000”和“ XXX2222”。然后计算会话2000中给出的其他3个类。

我不知道如何在v_sessionCode

变量中存储session_Code值以计算其重复次数,然后更改v_sessionCode的值,同时确保我不再次计算其先前的值。

使用Oracle SQL +(PL / SQL)*在类似情况下,如何使用程序计算连接数:表示例CREATE TABLE Teacher(名称CHAR(7)NOT NULL,lastName ...] >

sql database oracle plsql sqlplus
1个回答
0
投票

欢迎您!首先,您的架构/语法似乎存在多个问题:1. Teacher.lastName被声明为INTEGER-应该是varchar吗?2. Class.acronym定义为主键,但是根据您的数据有重复项-groupNum应该是主键吗?3. F_Key缺少引用列解决这些问题后,我创建了以下示例架构。请检查这是否是您想要的

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          |
© www.soinside.com 2019 - 2024. All rights reserved.