【问题标题】:PLS-00306: wrong number or types of arguments in call to 'fun'PLS-00306:调用“fun”时参数的数量或类型错误
【发布时间】:2018-03-22 22:45:39
【问题描述】:

我正在尝试使用包范围中定义的表类型参数调用函数,但出现错误:

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

CREATE OR REPLACE PACKAGE pkg AS
    TYPE aging_sch_record_type IS
        RECORD (days_delq NUMBER, eligible NUMBER, unit NUMBER, balance NUMBER);
    TYPE aging_sch_table_type IS
        TABLE OF aging_sch_record_type INDEX BY VARCHAR2(20);

    PROCEDURE proc ();
    FUNCTION fun (v_aging_sch_table aging_sch_table_type,
        v_days_delq NUMBER, v_eligible NUMBER) RETURN NUMBER;
END pkg;

create or replace PACKAGE BODY pkg AS
    PROCEDURE proc () AS
        CURSOR aging_sch_cursor IS
        SELECT ...
        GROUP BY ...;

        v_aging_sch_row aging_sch_cursor%rowtype;
        v_aging_sch_table aging_sch_table_type;
    BEGIN
        FOR v_aging_sch_row IN aging_sch_cursor LOOP
            v_aging_sch_table(v_aging_sch_row.days_delq || ' ' || v_aging_sch_row.eligible).days_delq := v_aging_sch_row.days_delq;
            v_aging_sch_table(v_aging_sch_row.days_delq || ' ' || v_aging_sch_row.eligible).eligible := v_aging_sch_row.eligible;
            v_aging_sch_table(v_aging_sch_row.days_delq || ' ' || v_aging_sch_row.eligible).unit    := v_aging_sch_row.unit;
            v_aging_sch_table(v_aging_sch_row.days_delq || ' ' || v_aging_sch_row.eligible).balance := v_aging_sch_row.balance;
        END LOOP;

        INSERT INTO t
        VALUES (fun(v_aging_sch_table,0,2));
    END proc;

    FUNCTION fun (v_aging_sch_table aging_sch_table_type,
        v_days_delq NUMBER, v_eligible NUMBER) RETURN NUMBER
        AS
    BEGIN
        ...
    END fun;
END pkg;

知道什么问题吗?

谢谢。

【问题讨论】:

  • 错误在哪一行?

标签: oracle plsql


【解决方案1】:

您不能在SQL 中使用associative array(并且您不能在12c 之前的Oracle 版本中使用SQL 中的包规范中声明的任何数组),但是您可以将fun 函数的结果存储到局部变量中,然后将该变量插入表t:

PROCEDURE proc () AS
    CURSOR aging_sch_cursor IS
    SELECT ...
    GROUP BY ...;

    v_aging_sch_row aging_sch_cursor%rowtype;
    v_aging_sch_table aging_sch_table_type;
    v_fun number;
BEGIN
    FOR v_aging_sch_row IN aging_sch_cursor LOOP
        v_aging_sch_table(v_aging_sch_row.days_delq || ' ' || v_aging_sch_row.eligible).days_delq := v_aging_sch_row.days_delq;
        v_aging_sch_table(v_aging_sch_row.days_delq || ' ' || v_aging_sch_row.eligible).eligible := v_aging_sch_row.eligible;
        v_aging_sch_table(v_aging_sch_row.days_delq || ' ' || v_aging_sch_row.eligible).unit    := v_aging_sch_row.unit;
        v_aging_sch_table(v_aging_sch_row.days_delq || ' ' || v_aging_sch_row.eligible).balance := v_aging_sch_row.balance;
    END LOOP;

    v_fun := fun(v_aging_sch_table,0,2)
    INSERT INTO t
    VALUES (v_fun);
END proc;

此外,您将函数的结果插入到表t 中而不命名列 - 该表真的只有一列吗?如果没有,您应该为要插入数据的每一列命名,如下所示:

INSERT INTO t (COLUMN1)
VALUES (v_fun);

如果您不按字符串索引,则可以使用在 SQL 中可以使用的独立对象类型和嵌套表,但在您的情况下,这不是一个选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多