2017-10-11 90 views
0

我试图打电话与在包范围定义的表类型参数的功能,但得到的错误:PLS-00306:错号码或类型的呼叫“好玩”的论点

PLS-00306: wrong number or types of arguments in call to '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; 

有什么想法是什么问题?

谢谢。

+0

错误是哪一行? – Tenzin

回答

0

不能使用在SQLassociative 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工作过独立的对象类型和嵌套表,但在你的情况下,这不是一个选项。