Plsql 我想使用out参数,但我没有得到正确的语法:ORA-00900:invalid SQL语句

Plsql 我想使用out参数,但我没有得到正确的语法:ORA-00900:invalid SQL语句,plsql,Plsql,问题定义:创建一个过程,该过程将按员工姓名的降序显示员工 计算机系 CREATE OR REPLACE PROCEDURE pr_disp (name OUT VARCHAR2, age OUT NUMBER, dep OUT VARCHAR, sa

问题定义:创建一个过程,该过程将按员工姓名的降序显示员工 计算机系

CREATE OR REPLACE PROCEDURE pr_disp (name     OUT VARCHAR2,
                                     age      OUT NUMBER,
                                     dep      OUT VARCHAR,
                                     salary   OUT NUMBER)
AS
    CURSOR c
    IS
          SELECT name,
                 age,
                 department,
                 salary
            FROM enployee2
           WHERE department = 'Computer'
        ORDER BY name DESC;

    this_name   enployee2.name%TYPE;
    this_age    enployee2.age%TYPE;
    this_dep    enployee2.department%TYPE;
    this_sal    enployee2.salary%TYPE;
BEGIN
    OPEN c1;

    LOOP
        FETCH c1
            INTO this_name,
                 this_age,
                 this_dep,
                 this_sal;

        DBMS_OUTPUT.put_line (
            this_name || ' ' || this_age || ' ' || this_dep || ' 
'             || this_sal);
        EXIT WHEN c1%NOTFOUND;
    END LOOP;

    CLOSE c1;
END;
/
也许我的执行部分有问题

执行部分:

variable nm varchar2(50);
variable age number
variable dep varchar2(50);
variable sal number;
execute  pr_disp(nm,age,dep,sal);

。执行代码时出现的错误是:ORA-00900:无效的SQL语句

您必须像这样编写PL/SQL块:

DECLARE
    nm    VARCHAR2 (50);
    age   NUMBER; -- here you were missing a semi-colon
    dep   VARCHAR2 (50);
    sal   NUMBER;
BEGIN
    pr_disp (nm,
             age,
             dep,
             sal);
END;

您的代码有几个错误。请参见下文,了解内容和地点:

表格创建:

create   table enployee2(  name  VARCHAR2(100),
                                    age NUMBER,
                                    department  VARCHAR2(100),
                                    salary NUMBER
                                    );

INSERT INTO enployee2 VALUES ('AAA',32,'Computer',2344);
INSERT INTO enployee2 VALUES ('BBB',42,'Computer',4400);
insert into enployee2 values ('CCC',21,'Computer',2454);
程序:

Create OR REPLACE PROCEDURE pr_disp(
                                    name OUT VARCHAR2,
                                    age OUT NUMBER,
                                    dep OUT VARCHAR,
                                    salary OUT NUMBER)
AS
  CURSOR c --<-- Your cursor name is `C` but you used it as `C1` below while opening and closing
  IS
    SELECT name,
      age,
      department,
      salary
    FROM enployee2
    WHERE department ='Computer'
    ORDER BY name DESC;

  this_name enployee2.name%type;
  this_age enployee2.age%type;
  this_dep enployee2.department%type;
  this_sal enployee2.salary%TYPE;

BEGIN
  OPEN c; --<--Opening `C1` while your cursor name is `C`
  LOOP
    FETCH c INTO this_name,this_age,this_dep,this_sal;
    dbms_output.put_line(this_name||' '||this_age||' '||this_dep||' '||this_sal);
    EXIT   WHEN c%NOTFOUND; --<--Exiting `C1` while your cursor name is `C`
  END LOOP;
  CLOSE c; --<--Closing `C1` while your cursor name is `C`
END;
/

我假设您的存储过程由于编译错误而无效。请再次尝试编译并检查消息

您还可以通过以下方式检查状态:

select status from user_objects where object_name='PR_DISP';
如果无效,您还可以通过以下方式获取错误消息:

select * from user_errors where name = 'PR_DISP';
也许您的表名为employee2(不是enployee2)


顺便问一下:输出参数是什么?您从未使用过它们。

您得到的错误是什么?我已经编辑了这个问题…请帮助先生解决这个问题。。。如果需要使用dbms_输出在控制台上显示,那么为什么要将参数传递给过程。如果您只是捕获名称而没有传递过滤条件,那么为什么不使用查询本身而不是使用过程呢。还有两个大的逻辑问题,我看到的是…首先,您捕获了局部变量中的值,但没有将它们分配给out参数。第二,如果有多个记录,您需要一个记录类型表来响应,否则您将始终获得单个员工的数据,而不是所有员工的数据。再多描述一下会有帮助的。谢谢,先生!!这对我很有帮助,先生!!谢谢你的努力
select * from user_errors where name = 'PR_DISP';