Как можно устранить ошибку пакета PL- SQL PLS-00103: обнаружен символ "(" при ожидании одного из следующих событий:: =) - PullRequest
1 голос
/ 27 апреля 2020

Существует аналогичный ответ для моей проблемы, но, похоже, этот ответ относится к проблеме процедуры. Я должен был сделать пакет pl sql, который имеет 3 процедуры внутри. Это будет примерно так:

CREATE OR REPLACE PACKAGE Count_num AS
    PROCEDURE count_emps(dno IN number);
    PROCEDURE count_deps(empssn IN char(9));
    PROCEDURE delete_deps(empssn IN char(9), dname IN varchar2(15));
END;
/
show errors

CREATE OR REPLACE PACKAGE BODY Count_num AS

    PROCEDURE count_emps(dno IN number)
    AS
        cnt number;
    BEGIN
        SELECT COUNT(*) INTO cnt
        WHERE Department.dnumber = Employee.dno
        AND Department.dnumber = dno;

        dbms_output.put_line('Number of Employee is ' || cnt);
    END;

    PROCEDURE count_deps(empssn IN char(9))
    AS
        cnt2 number;
    BEGIN
        SELECT COUNT(*) INTO cnt2
        WHERE Dependent.essn = Employee.ssn
        AND Department.essn = empssn;

        dbms_output.put_line('Number of dependent is ' || cnt2);
    END;

    PROCEDURE delete_deps(empssn IN char(9), dname IN varchar2(15))
    AS
    BEGIN
        DELETE *
        FROM Dependent
        WHERE Dependent.essn = Employee.ssn
        AND Dependent.essn = empssn
        AND Dependent.dependent_name = dname;

        SELECT *
        FROM Dependent
        WHERE Dependent.essn = Employee.ssn
        AND Dependent.essn = empssn
        AND Dependent.dependent_name = dname;
        END;
END;
/
show errors

EXEC Count_num.count_emps(5);
EXEC Count_num.count_deps('333445555');
EXEC Count_num.delete_deps('333445555', 'Alice')
show errors

count_emps подсчитывает количество сотрудников для отдела, count_deps подсчитывает количество иждивенцев для действующего работника, delete_deps удаляет указанный c depdendent. Это запрос на создание, как показано ниже:

drop table Employee cascade constraints;
commit;

create table Employee 
(
    fname varchar2(15),
    minit varchar2(1), -- can be char
    lname varchar2(15),
    ssn char(9),
    bdate date,
    address varchar2(50),
    sex varchar2(1)     CHECK(Sex = 'M' or Sex = 'F'),
    salary number, -- need to put check on salary 
    superssn char(9),
    dno number  DEFAULT 0,
    constraint EMPPK
        primary key(ssn),
    constraint EMPSUPERVRFK
        foreign key(superssn) references Employee(ssn)
            ON DELETE SET NULL
);

drop table Department cascade constraints;
commit;
create table Department 
(
    dname varchar2(15)  NOT NULL,
    dnumber number,
    mgr_ssn char(9)     DEFAULT '000000000',
    mgr_start_date date,
    constraint DEPTPK
        primary key(dnumber),
    constraint DEPTMGRFK
        foreign key(mgr_ssn) references Employee(ssn)
            ON DELETE SET NULL
);

drop table Dependent cascade constraints;
commit;
create table Dependent
(
    Essn char(9), 
    Dependent_name varchar2(15),
    Sex varchar2(15),
    Bdate date,
    Relationship varchar2(15),
    constraint DEPENDPK
        primary key (Essn, Dependent_name),
    constraint DEPENDFK
        foreign key(Essn) references Employee(Ssn)
);

Когда я выполняю пакетные запросы, он выдает мне ошибку, как показано ниже:

SQL> CREATE OR REPLACE PACKAGE Count_num AS
  2          PROCEDURE count_emps(dno IN number);
  3          PROCEDURE count_deps(empssn IN char(9));
  4          PROCEDURE delete_deps(empssn IN char(9), dname IN varchar2(15));
  5  END;
  6  /

Warning: Package created with compilation errors.

Elapsed: 00:00:00.02
SQL> show errors
Errors for PACKAGE COUNT_NUM:

LINE/COL ERROR                                                                                                          
-------- -----------------------------------------------------------------                                              
3/37     PLS-00103: Encountered the symbol "(" when expecting one of the                                                
         following:                                                                                                     
         := ) , default varying character large                                                                         
         The symbol ":=" was substituted for "(" to continue.                                                           

4/38     PLS-00103: Encountered the symbol "(" when expecting one of the                                                
         following:                                                                                                     
         := ) , default varying character large                                                                         
         The symbol ":=" was substituted for "(" to continue.                                                           

4/60     PLS-00103: Encountered the symbol "(" when expecting one of the                                                

LINE/COL ERROR                                                                                                          
-------- -----------------------------------------------------------------                                              
         following:                                                                                                     
         := . ) , @ % default character                                                                                 
         The symbol ":=" was substituted for "(" to continue. 

Я не могу распознать, что это за ошибка, поэтому Кто-нибудь может объяснить, что это за ошибка, и как я могу решить эту проблему?

1 Ответ

0 голосов
/ 27 апреля 2020

Удалить длину, указанную для типов данных в аргументах. Кроме того, лучше указать тип данных столбца, чем жестко его кодировать.

CREATE OR REPLACE PACKAGE Count_num AS
          PROCEDURE count_emps(i_dno IN employee.dno%TYPE);
          PROCEDURE count_deps(i_empssn IN employee.ssn%TYPE);
          PROCEDURE delete_deps(i_empssn IN employee.ssn%TYPE, 
                                i_dname IN department.dname%TYPE
                               );
END;
/
...