【问题标题】:How can I deal with PL-SQL package error PLS-00103: Encountered the symbol "(" when expecting one of the following: := )如何处理 PL-SQL 包错误 PLS-00103:在预期以下情况之一时遇到符号“(”::=)
【发布时间】:2020-08-10 11:19:58
【问题描述】:

对于我遇到的问题,有一个类似的答案,但似乎这个答案是针对程序问题的。 我应该制作一个 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 删除特定的依赖。它的创建查询如下:

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. 

我无法识别这个错误是什么,所以任何人都可以解释这个错误是什么,我该如何处理这个问题?

【问题讨论】:

  • 不能为过程或函数参数的数据类型定义数据长度,例如char(9)varchar2(15),而应与charvarchar2一样。
  • 没有直接关系,但不需要在 ddl 语句之后提交。 Oracle 内部发行它们;实际上是2,一个在执行ddl之前,一个在ddl之后。

标签: oracle plsql package


【解决方案1】:

删除为参数中的数据类型指定的长度。 此外,最好指定列数据类型而不是对其进行硬编码。

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;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2014-09-18
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多