Oracle PLS-00103:在预期以下情况时遇到符号“程序”:

Oracle PLS-00103:在预期以下情况时遇到符号“程序”:,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我是一个学习plsql的人,我试图在另一个过程中创建过程和调用过程,我可以得到想要的输出。但当我试图在另一个过程中创建过程而不是调用另一个过程时,我得到了以下错误 23/1 PLS-00103:在预期以下情况之一时遇到符号过程:开始案例声明结束异常退出goto如果循环mod null pragma raise return select update,而使用则无法在过程中创建过程 过程是单个对象,必须单独创建。您可以从一个过程调用另一个过程 您可以使用包在单个包内创建多个过程,但在这种情况下,过

我是一个学习plsql的人,我试图在另一个过程中创建过程和调用过程,我可以得到想要的输出。但当我试图在另一个过程中创建过程而不是调用另一个过程时,我得到了以下错误


23/1 PLS-00103:在预期以下情况之一时遇到符号过程:开始案例声明结束异常退出goto如果循环mod null pragma raise return select update,而使用则无法在过程中创建过程

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

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

-- 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;
/
procedure p44(p_hiredate in emp.hiredate%type
              ,p_ename   in emp.ename%type
              ,p_sal     out emp.sal%type) IS

干杯

程序是具有以下结构的单个程序单元:

create or replace procedure p43 () is
  ...
begin
  …
end;
/
您的代码有两个过程实例,这正是编译器所抱怨的

如果需要两个单独的过程,则需要两个单独的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(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;
/
procedure p44(p_hiredate in emp.hiredate%type
              ,p_ename   in emp.ename%type
              ,p_sal     out emp.sal%type) IS
在SQL语句中使用参数时,为参数指定一个不同的名称可防止范围混淆:

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