【问题标题】:Stored Procedure Oracle (expression 'TO_NUMBER(SQLDEVBIND1Z_1)' cannot be used as an assignment target)存储过程 Oracle(表达式 'TO_NUMBER(SQLDEVBIND1Z_1)' 不能用作赋值目标)
【发布时间】:2018-08-28 15:06:24
【问题描述】:

前一周我们开始在课堂上学习存储过程,教授已经布置了一个非常复杂的大作业,此时我很困惑。我什至不确定我到底想在这里完成什么。

我需要为下面的 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 行开始的错误命令 - 开始 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 编译错误。 *行动:

【问题讨论】:

  • 这是用于 SQL-Server 还是 Oracle?它们是两个不同的 RDBMS。
  • 为什么你有一个 refcursor 作为你的过程的输出参数?
  • oracle,问题出在我尝试执行该过程时。
  • 教授希望我们使用光标,除非我误解了什么

标签: oracle stored-procedures


【解决方案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>

我希望它会有所帮助;尝试将此类代码应用于您的案例。说如果你不能让它工作。

【讨论】:

    【解决方案2】:

    为什么在过程 GET_VAN_SP 需要一个整数时传递一个整数 SYS_REFCURSOR 类型的参数?

    【讨论】:

    • 那个参数是什么?
    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多