【问题标题】:not able to delete an element from array无法从数组中删除元素
【发布时间】:2018-06-01 09:41:17
【问题描述】:

PLS-00306:调用“DELETE”时参数的数量或类型错误

create or replace PACKAGE BODY MYPACKAGE AS

    PROCEDURE LeaveDates4 
    (
        I_STDATE  IN  DATE,
        I_ENDDATE IN  DATE,
        O_DATES   OUT DateArray 
    )
    AS 
        n INTEGER := LEAST( I_ENDDATE - I_STDATE, 29 );
        just_date DATE;
        H_dates DateArray;
        --cursor cur_holidates is select HOLIDAY_DATE from TSL_HOLIDAYLIST;
        x number;
    BEGIN
        select count(*) into x from TSL_HOLIDAYLIST;

        O_DATES := DateArray();
        H_dates := DateArray();
        O_DATES.EXTEND( n + 1 );
        --  h_dates.extend;
        dbms_output.put_line(n);
        dbms_output.put_line(x);

        FOR i IN 0 .. n LOOP
            O_DATES(i+1) := I_STDATE + i;
            dbms_output.put_line(I_STDATE + i);
        END LOOP;

        for cur in (select HOLIDAY_DATE from TSL_HOLIDAYLIST)
        loop
            h_dates.extend;
            h_dates(h_dates.last):= cur.HOLIDAY_DATE;
        end loop;

        FOR i IN h_DATES.first..h_DATES.last LOOP             
            dbms_output.put_line(h_DATES(i)||i);
        END LOOP;

        for i in O_DATES.first..O_DATES.last LOOP      
            FOR j IN h_DATES.first..h_DATES.last LOOP  
                if o_dates(i)=h_dates(j)
                    then o_dates.delete(i);  -- PLS-00306 error here
                end if;
            end loop;
        end loop;
    END LeaveDates4;

END MYPACKAGE;

上面的代码失败,在o_dates.delete(i); 出现错误 如果 h_dates 中存在日期,我想从 o_dates 中删除该日期。 我得到的错误是:

PLS-00306: wrong number or types of arguments in call to 'DELETE'

【问题讨论】:

  • DateArray 是如何定义的?
  • 如果 DateArray 是 Varray 集合类型,那么这就是你的问题的原因。

标签: oracle plsql varray


【解决方案1】:

您不能从可变数组的中间删除元素。

PL/SQL Language Reference: PL/SQL Collections and Records: DELETE Collection Method

举个更简单的例子,定义一个可变数组和一个嵌套表集合:

create or replace type date_varray as varray(3) of date;

create or replace type date_ntab as table of date;

现在声明每种类型的集合并尝试从中删除元素。

嵌套表:

declare
    my_ntable date_ntab := date_ntab(sysdate -1, sysdate, sysdate +1);
begin
    my_ntable.delete(2);
end;

PL/SQL procedure successfully completed.

变量:

declare
    my_varray date_varray := date_varray(sysdate -1, sysdate, sysdate +1);
begin
    my_varray.delete(2);
end;

    my_varray.delete(2);
    *
ERROR at line 4:
ORA-06550: line 4, column 5:
PLS-00306: wrong number or types of arguments in call to 'DELETE'
ORA-06550: line 4, column 5:
PL/SQL: Statement ignored

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 2018-08-29
    • 1970-01-01
    • 2017-03-10
    • 2019-03-02
    • 2011-10-31
    • 1970-01-01
    相关资源
    最近更新 更多