2013-10-23 9 views
8

Sto provando a chiamare un'API utilizzando la firma della procedura esatta, ma in qualche modo la tabella dei numeri che indosso Penso che sia riconosciuto correttamente.PL/SQL: errore "PLS-00306: numero errato o tipi di argomenti nella chiamata a" attivato per la tabella dei numeri

definizione

API:

TYPE NUMLIST IS TABLE OF NUMBER INDEX BY VARCHAR2(50); 

PROCEDURE GETSERVICES_API 
(
    I_DIMOBJID IN NUMBER, I_OBJECTID IN NUMBER, I_FILTER IN NUMBER, 
    O_ERRORCODE OUT NUMBER, O_ERRORTEXT OUT VARCHAR2, O_SERVICELIST OUT NUMLIST 
); 

La mia chiamata di API:

DECLARE 

    TYPE NUMLIST IS TABLE OF NUMBER INDEX BY VARCHAR2(50); 
    lt_SERVICELIST    NUMLIST; 

    ls_errortext    varchar2(100); 
    ln_errorcode    number; 

BEGIN 


    PKGCOMSUPPORT_SERVICE.GETSERVICES_API(I_DIMOBJID => 6, 
              I_OBJECTID => 5263, 
              I_FILTER => 3, 
              O_ERRORCODE => ln_errorcode, 
              O_ERRORTEXT => ls_errortext, 
              O_SERVICELIST => lt_SERVICELIST); 

END; 

Quando eseguo la mia chiamata di API che ho ottenuto: PLS-00306: numero errato di tipi di argomenti nella chiamata a ' GETSERVICE_API

Qualche idea sul perché? Grazie

+0

hai provato a mettere la tua dichiarazione di tipo NUMLIST al di fuori del tuo blocco pl/sql? – mucio

+0

No, non ho provato, ma dovrebbe essere la stessa cosa. – Alin

+0

Non penso che sia possibile creare tipi in un blocco pl/sql, sono oggetti di database – mucio

risposta

9

Il motivo per cui si trovano ad affrontare l'errore PLS-00306 è l'incompatibilità di NUMLIST tipo di raccolta, definito nella specifica del pacchetto e nel tipo di raccolta NUMLIST definito nel blocco anonimo PL/SQL. Anche se le definizioni di questi due tipi di raccolta sono uguali, non sono compatibili. Nel blocco anonimo PL/SQL devi dichiarare e quindi passare alla procedura GETSERVICES_API una variabile del tipo di dati PKGCOMSUPPORT_SERVICE.NUMLIST.

create or replace package PKG as 
    type t_numlist is table of number index by varchar2(50); 
    procedure SomeProc(p_var in pkg.t_numlist); 
end; 
/

create or replace package body PKG as 
    procedure someproc(p_var in pkg.t_numlist) is 
    begin 
    null; 
    end; 
end; 
/

declare 
    type t_numlist is table of number index by varchar2(50); 
    l_var t_numlist; 
begin 
    pkg.someproc(l_var); 
end; 

ORA-06550: line 5, column 3: 
PLS-00306: wrong number or types of arguments in call to 'SOMEPROC' 

declare 
    --type t_numlist is table of number index by varchar2(50); 
    l_var pkg.t_numlist; 
begin 
    pkg.someproc(l_var); 
end; 

anonymous block completed 
0

Penso che la definizione del tipo non sia valida. Per creare un 'tipo' tavolo avete bisogno di qualcosa come il seguente:

CREATE OR REPLACE TYPE NUMLIST AS OBJECT (COLUMN1 VARCHAR2(50)); 
0

forse si può provare questo:

CREATE TYPE NUMLIST AS TABLE OF NUMBER INDEX BY VARCHAR2(50); 

DECLARE 

    lt_SERVICELIST    NUMLIST; 

    ls_errortext    varchar2(100); 
    ln_errorcode    number; 

BEGIN 


    PKGCOMSUPPORT_SERVICE.GETSERVICES_API(I_DIMOBJID => 6, 
              I_OBJECTID => 5263, 
              I_FILTER => 3, 
              O_ERRORCODE => ln_errorcode, 
              O_ERRORTEXT => ls_errortext, 
              O_SERVICELIST => lt_SERVICELIST); 

END;