PLS-00103:预期以下情况之一时遇到符号“ PROCEDURE”:

时间:2019-08-16 07:51:28

标签: oracle stored-procedures plsql

我是一个学习plsql的人,我正在尝试创建过程并在另一个过程中调用过程,我可以得到所需的输出。但是,当我尝试在另一个过程中创建过程而不是调用另一个过程时,我收到了以下错误

“ 23/1 PLS-00103:预期以下情况之一时遇到符号” PROCEDURE“ :(如果loop mod null pragma提高返回选择更新,而<<继续,则为goto声明结束异常退出,而<<继续关闭当前删除取回锁插入打开回滚保存点集sql执行commit forall合并管道清除将符号“ declare”替换为“ PROCEDURE”以继续。 23/18 PLS-00103:出现符号“。”当期望下列其中一项时:in out ... long double ref char time timestamp interval date date binary national character nchar 错误:检查编译器日志 “

CREATE OR REPLACE PROCEDURE pro (
    empn   NUMBER,
    emp    OUT    emp5%rowtype

) IS
 salar number;
BEGIN
    SELECT
        a.*
    INTO emp
    FROM
        emp5 a
    WHERE
        a.empno = empn;

    dbms_output.put_line('The hire date is'
                         || '    '
                         || emp.hiredate);
    dbms_output.put_line('Name is'
                         || '   '
                         || emp.ename);

procedure p44(emp.hiredate in date,emp.ename varchar,sal out number) IS
    salar   NUMBER;
BEGIN
    SELECT
        e.sal
    INTO salar
    FROM
        emp5 e
    WHERE
        e.hiredate = hire
        AND e.ename = enamee;

    dbms_output.put_line('salary of the employee'
                         || ' '
                         || enamee
                         || 'is  '
                         || salar);

END p43;
/

如果我将empno编号作为程序pro的输入,则需要输出雇员的雇用日期,雇员的姓名和雇员的工资,如下所示

雇用日期为20-FEB-81
名字是ALLEN
雇员ALLEN的工资是1600

2 个答案:

答案 0 :(得分:1)

过程是单个程序单元,其结构为:

create or replace procedure p43 () is
  ...
begin
  …
end;
/

您的代码有两个PROCEDURE实例,而这正是编译器所抱怨的。

如果需要两个单独的过程,则需要两个单独的CREATE语句:

create or replace procedure p43 () is
  ...
begin
  …
end p43;
/
create or replace procedure p44 () is
  ...
begin
  …
end p44;
/

但是,如果您要的是将P44作为私有过程,而该私有过程只能在P43的上下文中访问,则可以通过在任何变量声明之后在声明部分中定义过程来做到这一点:

create or replace procedure p43 () is
  …
   procedure p44 () is
    ...
   begin
     …
   end p44;
begin
  …
  p44(…);
end p43;
/

这也不是我们声明参数的方式。

procedure p44(emp.hiredate in date,emp.ename varchar,sal out number) IS

给它们提供唯一的名称,例如在它们前面加上p_,如果愿意,可以使用表列数据类型。像这样:

procedure p44(p_hiredate in emp.hiredate%type
              ,p_ename   in emp.ename%type
              ,p_sal     out emp.sal%type) IS

为参数赋予唯一的名称可防止在SQL语句中使用参数时引起范围混淆:

答案 1 :(得分:0)

您无法在过程中创建过程。

过程是单个对象,必须单独创建。您可以从另一个调用一个过程。

您可以使用包在单个包中创建多个过程,但在这种情况下,也必须独立创建过程。

-- procedure must be created standalone
Create or replace procedure p44
As
Begin
-- code
End p44;
/

Create or replace procedure pro
As
Begin
P44; -- call to existing procedure
-- code
End pro;
/

所以您的案子会这样:

procedure p44(hiredate in date,ename varchar,sal out number) IS
    salar   NUMBER;
BEGIN
    SELECT
        e.sal
    INTO salar
    FROM
        emp5 e
    WHERE
        e.hiredate = hire
        AND e.ename = ename;

    dbms_output.put_line('salary of the employee'
                         || ' '
                         || ename
                         || 'is  '
                         || salar);
END p44;
/

CREATE OR REPLACE PROCEDURE pro (
    empn   NUMBER,
    emp    OUT    emp5%rowtype

) IS
 salar number;
BEGIN
    SELECT
        a.*
    INTO emp
    FROM
        emp5 a
    WHERE
        a.empno = empn;

    dbms_output.put_line('The hire date is'
                         || '    '
                         || emp.hiredate);
    dbms_output.put_line('Name is'
                         || '   '
                         || emp.ename);
P44(emp.hiredate, emp.ename, salr):
END pro;
/

干杯!