ошибки компиляции для процедур в sqlplus - PullRequest
0 голосов
/ 02 мая 2018

Теперь вот правка ... это полная база данных с актуальным кодом.

PROMPT Creation des tables
DROP TABLE GroupeCours
/
DROP TABLE SessionUQAM
/
DROP TABLE Professeur
/

ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY'
/

CREATE TABLE SessionUQAM
(codeSession    INTEGER     NOT NULL,
 dateDebut  DATE        NOT NULL,
 dateFin    DATE        NOT NULL
)
/

CREATE TABLE Professeur
(codeProfesseur     CHAR(5) NOT NULL,
 nom            VARCHAR(10) NOT NULL,
 prenom     VARCHAR(10) NOT NULL
 )
/

CREATE TABLE GroupeCours
(sigle      CHAR(7)     NOT NULL,
 noGroupe   INTEGER     NOT NULL,
 codeSession    INTEGER     NOT NULL,
 maxInscriptions    INTEGER     NOT NULL,
 codeProfesseur     CHAR(5) NOT NULL
)
/

INSERT INTO SessionUQAM
VALUES(32003,'3/09/2003','17/12/2003')
/
INSERT INTO SessionUQAM
VALUES(12004,'8/01/2004','2/05/2004')
/

INSERT INTO Professeur
VALUES('TREJ4','Tremblay','Jean')
/
INSERT INTO Professeur
VALUES('DEVL2','De Vinci','Leonard')
/
INSERT INTO Professeur
VALUES('PASB1','Pascal','Blaise')
/
INSERT INTO Professeur
VALUES('GOLA1','Goldberg','Adele')
/
INSERT INTO Professeur
VALUES('KNUD1','Knuth','Donald')
/
INSERT INTO Professeur
VALUES('GALE9','Galois','Evariste')
/
INSERT INTO Professeur
VALUES('CASI0','Casse','Illa')
/
INSERT INTO Professeur
VALUES('SAUV5','Sauve','Andre')
/

INSERT INTO Professeur
VALUES('loool','Sauve','Andre')
 /


INSERT INTO GroupeCours
VALUES('INF1110',20,32003,100,'loool')
/
INSERT INTO GroupeCours
VALUES('INF1110',30,32003,100,'PASB1')
/
INSERT INTO GroupeCours
VALUES('INF1130',10,32003,100,'PASB1')
/
INSERT INTO GroupeCours
VALUES('INF1130',30,32003,100,'GALE9')
/
INSERT INTO GroupeCours
VALUES('INF2110',10,32003,100,'TREJ4')
/
INSERT INTO GroupeCours
VALUES('INF3123',20,32003,50,'GOLA1')
/
INSERT INTO GroupeCours
VALUES('INF3123',30,32003,50,'GOLA1')
/
INSERT INTO GroupeCours
VALUES('INF3180',30,32003,50,'DEVL2')
/
INSERT INTO GroupeCours
VALUES('INF3180',40,32003,50,'DEVL2')
/
INSERT INTO GroupeCours
VALUES('INF5180',10,32003,50,'KNUD1')
/
INSERT INTO GroupeCours
VALUES('INF5180',40,32003,50,'KNUD1')
 /
INSERT INTO GroupeCours
VALUES('INF1110',20,12004,100,'TREJ4')
/
INSERT INTO GroupeCours
VALUES('INF1110',30,12004,100,'TREJ4')
/
INSERT INTO GroupeCours
VALUES('INF2110',10,12004,100,'PASB1')
/
INSERT INTO GroupeCours
VALUES('INF2110',40,12004,100,'PASB1')
/
INSERT INTO GroupeCours
VALUES('INF3123',20,12004,50,'GOLA1')
/
INSERT INTO GroupeCours
VALUES('INF3123',30,12004,50,'GOLA1')
/
INSERT INTO GroupeCours
VALUES('INF3180',10,12004,50,'DEVL2')
/
INSERT INTO GroupeCours
VALUES('INF3180',30,12004,50,'DEVL2')
/
INSERT INTO GroupeCours
VALUES('INF5180',10,12004,50,'DEVL2')
/
INSERT INTO GroupeCours
VALUES('INF5180',40,12004,50,'GALE9')
/

COMMIT
/

Теперь вот мой код

CREATE OR REPLACE PROCEDURE TacheEnseignement(codeProfesseur VARCHAR2) 
AS
    sig VARCHAR2(7);
    noGr INTEGER;
    codeS INTEGER;
    nomP VARCHAR2(10);
    prenomP VARCHAR2(10);
    dateD DATE;
    dateF DATE;
    CURSOR ligneGroupe(unCodeProf VARCHAR2) IS
        SELECT sigle, noGroupe, codeSession
        FROM GroupeCours
        WHERE codeProfesseur = unCodeProf ;
BEGIN
    OPEN ligneGroupe(codeProfesseur);
    LOOP
        FETCH ligneGroupe INTO sig, noGr, codeS;
        EXIT WHEN ligneGroupe%NOTFOUND;
        SELECT nom, prenom INTO nomP, prenomP FROM Professeur WHERE codeProfesseur=codeProfesseur;
        SELECT dateDebut, dateFin INTO dateD, dateF FROM SessionUQAM WHERE codeSession=codeS;
        IF ( nomP IS NULL OR prenomP IS NULL OR dateD IS NULL OR dateF IS NULL ) THEN
            DBMS_OUTPUT.PUT_LINE('The teacher that has ' + codeProfesseur + ' as code is not in the database');
        ELSE
            DBMS_OUTPUT.PUT_LINE('Code professeur :' || codeProfesseur);
            DBMS_OUTPUT.PUT_LINE('Nom :' || nomP);
            DBMS_OUTPUT.PUT_LINE('Prenom :' || prenomP);
            DBMS_OUTPUT.PUT_LINE('Sigle :' || sig);
        END IF;
    END LOOP;
    CLOSE ligneGroupe;


END TacheEnseignement;

Я все еще пытаюсь выполнить это:

EXECUTE TacheEnseignement('GOLA1');

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Мое мнение при этом будет (на основании первоначального ответа от Барбарос и вопроса отредактировано):

CREATE OR REPLACE PROCEDURE TacheEnseignement(codeProfesseur IN Professeur.codeProfesseur%TYPE) AS
    profNom Professeur.nom%TYPE;
    profPrenom Professeur.prenom%TYPE;
BEGIN
    DBMS_OUTPUT.PUT_LINE('Code professeur: ' || codeProfesseur);
    BEGIN
        SELECT p.nom, p.prenom
          INTO profNom, profPrenom
          FROM Professeur p
         WHERE p.codeProfesseur = TacheEnseignement.codeProfesseur;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            DBMS_OUTPUT.PUT_LINE('The teacher that has ' || codeProfesseur || ' as code is not in the database');
            RETURN;
    END;
    DBMS_OUTPUT.PUT_LINE('Nom: ' || profNom);
    DBMS_OUTPUT.PUT_LINE('Prenom: ' || profPrenom);
    DBMS_OUTPUT.PUT_LINE('Cours:');
    FOR foundGroup IN (
        SELECT DISTINCT c.sigle, c.noGroupe, s.dateDebut, s.dateFin, c.codeSession
          FROM GroupeCours c
          LEFT OUTER JOIN SessionUQAM s
            ON s.codeSession = c.codeSession
         WHERE c.codeProfesseur = TacheEnseignement.codeProfesseur
        ORDER BY 1, 2, 3, 4, 5
    ) LOOP
        DBMS_OUTPUT.PUT_LINE('- Sigle: ' || foundGroup.sigle);
        DBMS_OUTPUT.PUT_LINE('  No groupe: ' || foundGroup.noGroupe);
        DBMS_OUTPUT.PUT('  Code session: ' || foundGroup.codeSession);
        IF foundGroup.dateDebut IS NOT NULL THEN
            DBMS_OUTPUT.PUT(' (');
            DBMS_OUTPUT.PUT(TO_CHAR(foundGroup.dateDebut, 'YYYY"-"MM"-"DD'));
            DBMS_OUTPUT.PUT(' - ');
            DBMS_OUTPUT.PUT(TO_CHAR(foundGroup.dateFin, 'YYYY"-"MM"-"DD'));
            DBMS_OUTPUT.PUT(')');
        END IF;
        DBMS_OUTPUT.NEW_LINE;
    END LOOP;
END TacheEnseignement;
/

И ссылка на сценарий Oracle Live SQL для всего этого (поскольку SQL Fiddle не имеет простого способа просмотра DBMS_OUTPUT).

0 голосов
/ 02 мая 2018
  • Прежде всего, такие ключевые слова, как session, нельзя использовать в качестве таблицы. имя.
  • Операция конкатенации не +, а || в Oracle.
  • Параметр для процедуры с точностью длины не может быть определен.
  • Не используйте устаревшие типы данных Char или varchar, но используйте varchar2 вместо.

  • Каждый DDL (* в данном случае create table) или DML (insert into в в этом случае) операторы должны заканчиваться semi-colons после Скобки.

Итак, можно использовать следующую серию команд:

SQL> set serveroutput on;
SQL> CREATE TABLE Professor
 (codeProfessor     varCHAR2(5) NOT NULL,
  Lastname          VARCHAR2(10) NOT NULL,
  Firstname     VARCHAR2(10) NOT NULL
 );

SQL> CREATE TABLE Session_
  (codeSession  INTEGER     NOT NULL,
   dateBegin    DATE        NOT NULL,
   dateEnd  DATE        NOT NULL
  );

SQL> CREATE TABLE GroupClass
 (classId       varCHAR2(7)     NOT NULL,
  noGroup   INTEGER     NOT NULL,
  codeSession   INTEGER     NOT NULL,
  maxInscriptions   INTEGER     NOT NULL,
  codeProfessor     varCHAR2(5) NOT NULL
 );

SQL> INSERT INTO GroupClass
VALUES('INF5180',40,32003,50,'RANDO');

SQL> INSERT INTO Session_
VALUES(32003,date'2003-09-03',date'2003-12-17');

SQL> INSERT INTO Professor
VALUES('RANDO','Random','Random');

SQL> CREATE OR REPLACE PROCEDURE Teaching(i_codeProfessor varchar2)
AS
classid VARCHAR2(7);
noGr INTEGER;
codeS INTEGER;
lName VARCHAR2(10);
fName VARCHAR2(10);
dateB DATE;
dateE DATE;
CURSOR lineGroup(oneCodeProf varchar2) IS
    SELECT classID, noGroup, codeSession
    FROM GroupClass
    WHERE codeProfessor = oneCodeProf ;
BEGIN
    OPEN lineGroup(i_codeProfessor);
    LOOP
        FETCH lineGroup INTO classid, noGr, codeS;
        EXIT WHEN lineGroup%NOTFOUND;
        SELECT Lastname, Firstname INTO lName, fName FROM Professor WHERE codeProfessor=i_codeProfessor;
        SELECT dateBegin, dateEnd INTO dateB, dateE FROM Session_ WHERE codeSession=codeS;
        IF ( lName IS NULL OR fName IS NULL OR dateB IS NULL OR dateE IS NULL ) THEN
            DBMS_OUTPUT.PUT_LINE('The teacher that has ' || i_codeProfessor||' as code is not in the database');
        ELSE
            DBMS_OUTPUT.PUT_LINE('Code professor :' || i_codeProfessor);
            DBMS_OUTPUT.PUT_LINE('Last name :' || lName);
            DBMS_OUTPUT.PUT_LINE('First name :' || fName);
            DBMS_OUTPUT.PUT_LINE('Class ID :' || classid);
        END IF;
    END LOOP;
    CLOSE lineGroup;


END Teaching;
/
SQL> EXECUTE Teaching('RANDO');

Code professor :RANDO
Last name :Random
First name :Random
Class ID :INF5180

PL/SQL procedure successfully completed

РЕДАКТИРОВАТЬ ( относительно вашего последнего редактирования ) :

SQL> SET SERVEROUTPUT ON;
SQL> CREATE OR REPLACE PROCEDURE TacheEnseignement(i_codeProfessor VARCHAR2)
AS
sig VARCHAR2(7);
noGr INTEGER;
codeS INTEGER;
nomP VARCHAR2(10);
prenomP VARCHAR2(10);
dateD DATE;
dateF DATE;
CURSOR ligneGroupe(unCodeProf VARCHAR2) IS
    SELECT sigle, noGroupe, codeSession
    FROM GroupeCours
    WHERE codeProfesseur = unCodeProf ;
BEGIN
    FOR c in ligneGroupe(i_codeProfessor)
    LOOP
         sig := c.sigle;
         noGr:= c.nogroupe;
         codeS:= c.codesession;
    END LOOP;    

    FOR d in ( SELECT nom, prenom FROM Professeur WHERE codeProfesseur=i_codeProfessor)
    LOOP
      nomP := d.nom; 
      prenomP := d.prenom;  
    END LOOP;   

    FOR e in ( SELECT dateDebut, dateFin FROM SessionUQAM WHERE codeSession=codeS )
    LOOP
      dateD := e.datedebut; 
      dateF := e.datefin;  
    END LOOP;


    IF ( nomP IS NULL OR prenomP IS NULL OR dateD IS NULL OR dateF IS NULL ) THEN
        DBMS_OUTPUT.PUT_LINE('The teacher that has '||i_codeProfessor||' as code is not in the database');
    ELSE
        DBMS_OUTPUT.PUT_LINE('Code professeur :' || i_codeProfessor);
        DBMS_OUTPUT.PUT_LINE('Nom :' || nomP);
        DBMS_OUTPUT.PUT_LINE('Prenom :' || prenomP);
        DBMS_OUTPUT.PUT_LINE('Sigle :' || sig);
    END IF;
END TacheEnseignement;
/

SQL> EXECUTE TacheEnseignement('GOLA1');

Code professeur :GOLA1
Nom :Goldberg
Prenom :Adele
Sigle :INF3123

PL/SQL procedure successfully completed

Вы можете получить результат без ORA-01422, используя FOR LOOP .. END LOOP операторы, как в предыдущем. Но не имеет смысла, без какого-либо логического правила, если не дополнено дополнительными ограничениями.

P.S. : Во втором случае не закрывайте курсор, так как он неявный. Мы называем неявные курсоры. Неявные курсоры автоматически создаются и уничтожаются сервером Oracle.

...