我们已经开始在课堂上学习存储过程,教授已经做了一个非常复杂的大任务,此时我很困惑。我甚至不确定我到底想要完成什么。
我需要为以下select语句创建一个过程
SELECT *
FROM Vehicle, VAN
WHERE SEATCAPACITY > 5
AND MAXIMUMPAYLOAD > 5000;
这是我编译的,存储过程已成功编译。
create or replace PROCEDURE GET_VAN_SP
(
van_cursor OUT SYS_REFCURSOR
) AS
BEGIN OPEN van_cursor for
SELECT Vehicle.VINNUMBER VINNUMBER,
Vehicle.MAKE MAKE,
Vehicle.MODELKIND MODELKIND,
Vehicle.YEARMADE YEARMADE,
Vehicle.RENTALCATEGORYID RENTALCATEGORYID,
Vehicle.COLOR COLOR,
Vehicle.PLATENUMBER PLATENUMBER,
Vehicle.MILEAGE MILEAGE,
Vehicle.TRANSMISIONTYPE TRANSMISIONTYPE,
Vehicle.SEATCAPACITY SEATCAPACITY,
Vehicle.DAILYRENTALCOST DAILYRENTALCOST,
Vehicle.VEHICLESTATUSID VEHICLESTATUSID,
Vehicle.ASSIGNEDAGENCYID ASSIGNEDAGENCYID,
Vehicle.CURRENTAGENCYID CURRENTAGENCYID,
Vehicle.VEHICLETYPE VEHICLETYPE,
Vehicle.PRICE PRICE,
Vehicle.MPH MPH,
Vehicle.HORSEPOWER HORSEPOWER,
Vehicle.MPG MPG,
VAN.VVINNUMBER VVINNUMBER,
VAN.CARGOCAPACITY CARGOCAPACITY,
VAN.MAXIMUMPAYLOAD MAXIMUMPAYLOAD
FROM Vehicle, VAN
WHERE SEATCAPACITY > 5
AND MAXIMUMPAYLOAD > 5000;
END GET_VAN_SP;
这是尝试执行时的错误。
错误从第37行开始:命令中出现错误 - BEGIN GET_VAN_SP(5);结束; 错误报告 - ORA-06550:第1行,第52栏: PLS-00306:调用'GET_VAN_SP'时参数的数量或类型错误 ORA-06550:第1行,第63栏: PLS-00363:表达式'TO_NUMBER(SQLDEVBIND1Z_1)'不能用作 分配目标 ORA-06550:第1行,第52栏: PL / SQL:语句被忽略 06550. 00000 - “行%s,列%s:\ n%s” *原因:通常是PL / SQL编译错误。 *操作:
答案 0 :(得分:1)
此:
我甚至不确定我到底想要完成的是什么
是最大的问题。在我看来,你应该根据需要多次重新阅读作业,直到你确切知道你应该做什么为止。如果你做不到,你应该咨询教授。 如何完成这项工作是另一个问题。
好的,为了让您入门,这里有两个使用相同SELECT
语句作为数据源的过程。它基于Scott的架构(因为我没有你的表,你没有提供测试用例)。
第一个过程接受两个IN
参数 - 部门编号和工资(与您正在执行的操作类似)。请注意,我正在加入两个表,这是您没有做的(但应该有):您的查询中有两个表,VEHICLE和VAN - 没有连接,您将获得笛卡尔积。
SQL> set serveroutput on
SQL> create or replace procedure p_test
2 (par_deptno in dept.deptno%type,
3 par_sal in emp.sal%type
4 )
5 is
6 begin
7 for cur_r in (select d.dname, e.ename, e.sal
8 from dept d join emp e on e.deptno = d.deptno
9 where d.deptno = par_deptno
10 and e.sal > par_sal
11 )
12 loop
13 dbms_output.put_line(cur_r.dname ||' '|| cur_r.ename ||' '|| cur_r.sal);
14 end loop;
15 end;
16 /
Procedure created.
SQL> begin
2 p_test(10, 2000);
3 end;
4 /
ACCOUNTING KING 5000
ACCOUNTING CLARK 2450
PL/SQL procedure successfully completed.
SQL>
第二个使用refcursor
(在你的例子中 - 我不确定这是否是你真正需要做的,因为你也不知道)。您的过程需要一个OUT
参数(refcursor
),但您传递的IN
参数为NUMBER
(5)。没有多大意义,是吗?请注意,我传递了两个IN
和一个OUT
参数,这正是Oracle所期望的。
SQL> create or replace procedure p_test
2 (par_deptno in dept.deptno%type,
3 par_sal in emp.sal%type,
4 par_out out sys_refcursor
5 )
6 is
7 begin
8 open par_out for
9 select d.dname, e.ename, e.sal
10 from dept d join emp e on e.deptno = d.deptno
11 where d.deptno = par_deptno
12 and e.sal > par_sal;
13 end;
14 /
Procedure created.
SQL> var l_out refcursor
SQL>
SQL> begin
2 p_test(10, 2000, :l_out);
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> print l_out
DNAME ENAME SAL
-------------- ---------- ----------
ACCOUNTING KING 5000
ACCOUNTING CLARK 2450
SQL>
我希望它会有所帮助;尝试将这样的代码应用于您的案例。如果你不能使它工作,请说。
答案 1 :(得分:0)
为什么在期望a时将整数传递给过程GET_VAN_SP SYS_REFCURSOR类型的参数?