存储过程Oracle(表达式'TO_NUMBER(SQLDEVBIND1Z_1)'不能用作分配目标)

时间:2018-03-19 22:25:01

标签: oracle stored-procedures

我们已经开始在课堂上学习存储过程,教授已经做了一个非常复杂的大任务,此时我很困惑。我甚至不确定我到底想要完成什么。

我需要为以下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编译错误。           *操作:

2 个答案:

答案 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类型的参数?