|
|
|
|
PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato:
3-apr-2009 17.09
|
|
Mi trovo a trattare con i tipi di dato composti e non riesco a far compilare un pck. Questo è quello incriminato (ridotto all'osso e semplificato):
CREATE OR REPLACE PACKAGE "MIGRPRA_DBK_2_MIGR_RISCATTI" AS PROCEDURE DBP_2_MIGRA_PRATICA (p_id_pratica in number, p_descr_errore out varchar2, p_flag_esito out number);
END; / CREATE OR REPLACE PACKAGE BODY "MIGRPRA_DBK_2_MIGR_RISCATTI" AS v_descr_errore varchar2(1000):=NULL; p_descr_errore varchar2(1000):=NULL; p_flag_esito number:=0; OUT_VR2_ERR VARCHAR2(100);
PROCEDURE DBP_2_MIGRA_PRATICA (p_id_pratica in number, p_descr_errore out varchar2, p_flag_esito out number) AS TYPE TIPO_IN_RECORD_VALCOM IS RECORD (PCPR_ID_VA PCPR_PRATICA_CL_INPRI.PCPR_ID_VA%TYPE ); REC_MIGRPRA_VALCOM TIPO_IN_RECORD_VALCOM; TYPE TYP_IN_LISTA_VALCOM IS TABLE OF TIPO_IN_RECORD_VALCOM; IN_LISTA_VALCOM TYP_IN_LISTA_VALCOM; v_ret_funct_migr_pratica number:=null; BEGIN p_flag_esito:=0; v_descr_errore:=NULL; SELECT PCPR_ID_VA PCPR_ID_VA INTO REC_MIGRPRA_VALCOM FROM PCPR_PRATICA_CL_INPRI WHERE PCPR_ID_VA = p_id_pratica; IN_LISTA_VALCOM:= TYP_IN_LISTA_VALCOM(REC_MIGRPRA_VALCOM); v_ret_funct_migr_pratica:= prova.DBF_MIGRA_PRATICA_BDUBDN(IN_LISTA_VALCOM => IN_LISTA_VALCOM,OUT_VR2_ERR => OUT_VR2_ERR); IF v_ret_funct_migr_pratica!=0 THEN p_descr_errore:=v_descr_errore; p_flag_esito:=1; rollback; RETURN; END IF; END DBP_2_MIGRA_PRATICA; END MIGRPRA_DBK_2_MIGR_RISCATTI; /
All'interno richiama prova.DBF_MIGRA_PRATICA_BDUBDN (ridotto all'osso e semplificato) che è così composto:
create or replace package PROVA is TYPE TYPE_IN_RECORD_VALCOM IS RECORD (PCPR_ID_VA NUMBER(12) ); TYPE TIPO_IN_RECORD_VALCOM IS TABLE OF TYPE_IN_RECORD_VALCOM; FUNCTION DBF_MIGRA_PRATICA_BDUBDN ( IN_LISTA_VALCOM IN TIPO_IN_RECORD_VALCOM, OUT_VR2_ERR OUT VARCHAR2 )RETURN NUMBER; end PROVA; / create or replace package body PROVA is G_PCPR_ID_VA PCPR_PRATICA_CL_inpri.PCPR_ID_VA%TYPE; G_XXXX_BDST_ERI_VR varchar2(10); FUNCTION DBF_MIGRA_PRATICA_BDUBDN (IN_LISTA_VALCOM IN TIPO_IN_RECORD_VALCOM, OUT_VR2_ERR OUT VARCHAR2)RETURN NUMBER IS EX_SU_FUNZIONE_CHIAMATA EXCEPTION; LC_RET_VAL NUMBER; BEGIN G_PCPR_ID_VA :=IN_LISTA_VALCOM(1).PCPR_ID_VA ; BEGIN SELECT '09' INTO G_XXXX_BDST_ERI_VR FROM dual; EXCEPTION WHEN OTHERS THEN OUT_VR2_ERR:='2-'||SQLERRM; RETURN SQLCODE; END; RETURN 0; EXCEPTION WHEN EX_SU_FUNZIONE_CHIAMATA THEN OUT_VR2_ERR:='3-'||OUT_VR2_ERR; RETURN LC_RET_VAL; END DBF_MIGRA_PRATICA_BDUBDN; end PROVA; /
La struttura della tabella PCPR_PRATICA_CL_INPRI (ridotta all'osso e semplificata) è: Name Type Nullable Default Comments -------------------- ------------ -------- ------- -------- PCPR_ID_VA NUMBER(12)
Alla compilazione dl primo pck ho il seguente errore: Error: PLS-00306: wrong number or types of arguments in call to 'DBF_MIGRA_PRATICA_BDUBDN' Line: 25 Text: v_ret_funct_migr_pratica:= prova.DBF_MIGRA_PRATICA_BDUBDN(IN_LISTA_VALCOM => IN_LISTA_VALCOM,OUT_VR2_ERR => OUT_VR2_ERR); Error: PL/SQL: Statement ignored Line: 25 Text: v_ret_funct_migr_pratica:= prova.DBF_MIGRA_PRATICA_BDUBDN(IN_LISTA_VALCOM => IN_LISTA_VALCOM,OUT_VR2_ERR => OUT_VR2_ERR);
Il pck PROVA è di un altro schema e ci si accede tramite sinonimo, ma per test è stato ricreato sullo stesso schema del primo con il medesimo errore in compilazione.
Si accettano tutti i suggerimenti! Grazie
|
|
|
|
Re: PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato:
3-apr-2009 17.39
|
|
v_ret_funct_migr_pratica:= prova.DBF_MIGRA_PRATICA_BDUBDN(IN_LISTA_VALCOM => IN_LISTA_VALCOM,OUT_VR2_ERR => OUT_VR2_ERR);
se non sbaglio non si possono invocare le funzioni con i parametri per nome (cioè IN_LISTA_VALCOM => valore), devi utilizzare la notazione posizionale, quindi prova.DBF_MIGRA_PRATICA_BDUBDN( IN_LISTA_VALCOM, OUT_VR2_ERR); (nei commenti di un mio post http://cristiancudizio.wordpress.com/2007/12/31/passare-parametri-a-sottoprogrammi-plsql/ c'è un riferimento alla documentazione)
Saluti Cristian
|
|
|
|
Re: PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato:
3-apr-2009 17.46
|
|
Nello Spec del package prova vedo questa firma :
FUNCTION DBF_MIGRA_PRATICA_BDUBDN ( IN_LISTA_VALCOM IN TIPO_IN_RECORD_VALCOM , OUT_VR2_ERR OUT VARCHAR2 )RETURN NUMBER;
Dove TIPO_IN_RECORD_VALCOM e' dichiarato nello spec stesso: TYPE TYPE_IN_RECORD_VALCOM IS RECORD (PCPR_ID_VA NUMBER(12) );
Dal chiamante fai questa chiamata : v_ret_funct_migr_pratica:=prova.DBF_MIGRA_PRATICA_BDUBDN (IN_LISTA_VALCOM => IN_LISTA_VALCOM ,OUT_VR2_ERR => OUT_VR2_ERR);
Dove il parametro IN_LISTA_VALCOM e' definito come : TYPE TYP_IN_LISTA_VALCOM IS TABLE OF TIPO_IN_RECORD_VALCOM; IN_LISTA_VALCOM TYP_IN_LISTA_VALCOM; all'interno della procedura
Come fai a passare una pl/sql table ad una funzione che accetta un record?
... e se anche ci fosse corrispondenza esatta delle strutture, non ti funzionerebbe perché passeresti un type definito in un package (oltretutto privato) ad una funzione che accetta un parametro definito con un type dichiarato in un altro package.
Lo Schema dovrebbe essere :
Spec Package A con : Type t; Var t; function(par in t);
Da qualsiasi chiamante il comportamento deve essere: Dichiarazione Variabile: Var A.t; (nota che in dichiarazione la variabile e' riferita al type pubblico t del Package A)
e in fase di chiamata : l := A.function(Var);
... così funziona.
massimo stefanini
|
|
|
|
Re: PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato:
3-apr-2009 17.52
|
|
Rispondo anche in merito alla chiamata posizionale.
Il metodo di chiamata posizionale e' solo nel caso in cui richiami la funzione da codice SQL (essendo la sintassi per nome non riconosciuta dall'SQL Engine dove la select viene eseguita).
All'interno di codice pl/sql e' possibile richiamare funzioni e procedure tramite : Chiamata posizionale Chimata per nome Chimata mista (prima posizionale e poi per nome). .. Quindi la chiamata del don e' corretta.
massimo stefanini
|
|
alberto
Posts:
3.149
Da:
Milano
Registrato:
1-set-2010
|
|
Re: PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato:
3-apr-2009 18.48
|
|
TYPE_IN_RECORD_VALCOM: anche se il nome ed il layput tipo fossero identici nei due package, per Oracle sarebbero comunque differenti (perchè i namespace sono diversi, come in quasi tutti i linguaggi del resto).
Usa solo quello nel package prova (quello chiamato) e referenzia quello dall'altro (come prova.TYPE_IN_RECORD_VALCOM).
Test case:
SQL> create or replace package prova_pkg is 2 type type_test is table of number; 3 4 procedure test (x type_test); 5 end; 6 /
Package created.
SQL> SQL> create or replace package calling_pkg is 2 type type_test is table of number; 3 end; 4 /
Package created.
SQL> SQL> create or replace package body calling_pkg is 2 dummy type_test; 3 begin 4 prova_pkg.test (dummy); 5 end; 6 /
Warning: Package Body created with compilation errors.
SQL> show errors; Errors for PACKAGE BODY CALLING_PKG:
LINE/COL ERROR -------- ----------------------------------------------------------------- 4/3 PL/SQL: Statement ignored 4/3 PLS-00306: wrong number or types of arguments in call to 'TEST' SQL> SQL> create or replace package body calling_pkg is 2 dummy PROVA_PKG.type_test; 3 begin 4 prova_pkg.test (dummy); 5 end; 6 /
Package body created.
ciao Alberto Dell'Era
|
|
|
|
Re: PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato:
3-apr-2009 20.04
|
|
Lunedì metto in pratica i vostri consigli 
Grazie per essere corsi in mio aiuto (dopo richiesta per email )
Caffè pagato!
Un saluto dal DON
|
|
|
|
Re: PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato:
6-apr-2009 14.34
|
|
Grazie Massimo per il chiarimento.
Saluti Cristian
|
|
| |