代码绝对正确,但是显示Sid为无效标识符

-2 oracle plsql package

create or replace package body stu_package

as

procedure select_student(id number)

is

name varchar2(20);

begin

select sname into name from students where sid=id;

dbms_output.put_line(name);

end select_ student;

end stu_package;
Run Code Online (Sandbox Code Playgroud)

Lit*_*oot 6

这不是“绝对”正确的,因为在过程结束时应删除一个空格:

end select_ student;
Run Code Online (Sandbox Code Playgroud)

除此之外,是的-可以。测试用例:

SQL> create table students (sid number, sname varchar2(10));

Table created.

SQL> insert into students values (1, 'LF');

1 row created.
Run Code Online (Sandbox Code Playgroud)

包装规格:

SQL> create or replace package stu_package as
  2    procedure select_student(id number);
  3  end;
  4  /

Package created.
Run Code Online (Sandbox Code Playgroud)

包装体:

SQL> create or replace package body stu_package
  2  as
  3    procedure select_student(id number)
  4    is
  5      name varchar2(20);
  6    begin
  7      select sname into name from students where sid=id;
  8      dbms_output.put_line(name);
  9    end select_student;              --> remove a space
 10  end stu_package;
 11  /

Package body created.
Run Code Online (Sandbox Code Playgroud)

测试:

SQL> set serveroutput on
SQL> exec stu_package.select_student(1);
LF

PL/SQL procedure successfully completed.

SQL>
Run Code Online (Sandbox Code Playgroud)

因此,尽管您说一切都很好,但列名似乎不是sid

SQL> alter table students rename column sid to id;

Table altered.

SQL> create or replace package body stu_package
  2  as
  3    procedure select_student(id number)
  4    is
  5      name varchar2(20);
  6    begin
  7      select sname into name from students where sid=id;
  8      dbms_output.put_line(name);
  9    end select_student;
 10  end stu_package;
 11  /

Warning: Package Body created with compilation errors.

SQL> show err
Errors for PACKAGE BODY STU_PACKAGE:

LINE/COL ERROR
-------- --------------------------------------------------------------
7/5      PL/SQL: SQL Statement ignored
7/48     PL/SQL: ORA-00904: "SID": invalid identifier
SQL>
Run Code Online (Sandbox Code Playgroud)

或者,也许您在创建表时将其名称括在双引号中(如果是,请不要这样做!):

SQL> alter table students rename column id to "sid";

Table altered.

SQL> select * From students;

       sid SNAME
---------- ----------
         1 LF

SQL> create or replace package body stu_package
  2  as
  3    procedure select_student(id number)
  4    is
  5      name varchar2(20);
  6    begin
  7      select sname into name from students where sid=id;
  8      dbms_output.put_line(name);
  9    end select_student;
 10  end stu_package;
 11  /

Warning: Package Body created with compilation errors.

SQL> show err
Errors for PACKAGE BODY STU_PACKAGE:

LINE/COL ERROR
-------- --------------------------------------------------------------
7/5      PL/SQL: SQL Statement ignored
7/48     PL/SQL: ORA-00904: "SID": invalid identifier
SQL>
Run Code Online (Sandbox Code Playgroud)

因此,如果您确实使用了双引号,则必须一直这样做:

SQL> create or replace package body stu_package
  2  as
  3    procedure select_student(id number)
  4    is
  5      name varchar2(20);
  6    begin
  7      select sname into name from students where "sid"=id;     --> here
  8      dbms_output.put_line(name);
  9    end select_student;
 10  end stu_package;
 11  /

Package body created.

SQL>
Run Code Online (Sandbox Code Playgroud)