【问题标题】:Error: "Wrong number or types or arguments" when passing array to another procedure错误:将数组传递给另一个过程时出现“错误数量或类型的参数”
【发布时间】:2019-05-29 03:31:34
【问题描述】:

我想将数组作为参数传递给另一个过程..两者都在同一个包中..在下面的场景中传递了演示数组..出现错误:“PLS-00306 显示错误数量或类型的参数”..

CREATE or REPLACE package WSH_Delivery_Detail_Shipment is

type Result IS VARRAY(8) OF INTEGER;
p_result Result:=Result();

PROCEDURE CreateShipment(p_delivery_detail_interface_id IN WSH_DEL_DETAILS_INTERFACE.DELIVERY_DETAIL_INTERFACE_ID%TYPE,p_status OUT String);
PROCEDURE CreateShipmentLines(p_result IN RESULT);

END WSH_Delivery_Detail_Shipment;
/


CREATE OR REPLACE package body WSH_Delivery_Detail_Shipment as

PROCEDURE CreateShipment(p_delivery_detail_interface_id IN WSH_DEL_DETAILS_INTERFACE.DELIVERY_DETAIL_INTERFACE_ID%TYPE,p_status OUT String)

IS

CURSOR wddi_cur IS SELECT * FROM WSH_DEL_DETAILS_INTERFACE WHERE DELIVERY_DETAIL_INTERFACE_ID=p_delivery_detail_interface_id;
wddi_record WSH_DEL_DETAILS_INTERFACE%ROWTYPE;

type Result IS VARRAY(8) OF INTEGER;
p_result Result:=Result(1,1,1,1,1,1,1,1);

BEGIN

OPEN wddi_cur;

LOOP

.. Some few select queries>>>>

WSH_Delivery_Detail_Shipment.CreateShipmentLines(p_result); // Calling procedure and passing array



END LOOP;
CLOSE wddi_cur;
END CreateShipment;

procedure CreateShipmentLines(p_result IN RESULT)

is

BEGIN

....Some select queries

END CreateShipmentLines;
END WSH_Delivery_Detail_Shipment;
/

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您声明了两个名为 Result 的类型。 CreateShipmentLines 期待第一个,但您正在通过第二个。

    删除第二个声明(CreateShipment 中以“type Result is ...”开头的行)应该可以解决问题。

    【讨论】:

      【解决方案2】:

      From the documentation:

      包规范中定义的集合类型与相同定义的本地或独立集合类型不兼容。

      虽然在您的情况下,两个声明都在包内,但第二个声明是 CreateShipment 过程定义的本地声明,因此仍然与包规范中的声明不兼容。尽管它们在您看来相同,但在 Oracle 编译器看来它们是不同的类型。

      正如@WilliamRobertson 所说,您只需更改程序以使用规范中声明的类型:

      CREATE OR REPLACE package body WSH_Delivery_Detail_Shipment as
      
      PROCEDURE CreateShipment(p_delivery_detail_interface_id IN WSH_DEL_DETAILS_INTERFACE.DELIVERY_DETAIL_INTERFACE_ID%TYPE,p_status OUT String)
      IS
      
        CURSOR wddi_cur IS SELECT * FROM WSH_DEL_DETAILS_INTERFACE WHERE DELIVERY_DETAIL_INTERFACE_ID=p_delivery_detail_interface_id;
        wddi_record WSH_DEL_DETAILS_INTERFACE%ROWTYPE;
      
        -- type Result IS VARRAY(8) OF INTEGER; -- remove this
        p_result Result:=Result(1,1,1,1,1,1,1,1); -- now uses type from specification
      
      BEGIN
        ...
      

      作为一个单独的问题,包规范中的p_result Result:=Result(); 也完全独立于该过程定义中声明的p_result 变量。从您所展示的情况来看,从未使用过全局p_result,这使得它变得多余;但它也让你的包stateful,你可能不打算这样做 - 这可能会导致不必要的“ORA-04068:包的现有状态已被丢弃”错误。因此,您可能希望从规范中删除该全局变量声明。 (当然,如果你确实使用了那个全局变量并且你的包需要有状态,那么忽略这部分......)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-22
        • 2014-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多