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