Oracle Developer
SQL & PL/SQL
DBA
BUGs
OIPStaff
Altro...









Forum Home » SQL & PL/SQL

Topic: PLS-00306: wrong number or types of arguments in call to 'sting'
Risposte: 6   Pagine: 1   Ultimo Invio: 6-apr-2009 14.34 da: cristiancudizio

Reply to this Topic
Cerca Forum

Back to Topic List Topics: [ precedente | Prossimo ]
Risposte: 6   Pagine: 1  
Don Claudissimo

Posts: 1.184
Da: Antarctica
Registrato: 29-ago-2010
PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato: 3-apr-2009 17.09
  Risposta

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


cristiancudizio

Posts: 88
Da: Italia
Registrato: 3-apr-2008
Re: PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato: 3-apr-2009 17.39
  Risposta

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

peloritana49

Posts: 55
Da: italia
Registrato: 30-set-2005
Re: PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato: 3-apr-2009 17.46
  Risposta

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

peloritana49

Posts: 55
Da: italia
Registrato: 30-set-2005
Re: PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato: 3-apr-2009 17.52
  Risposta

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
  Risposta

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

Don Claudissimo

Posts: 1.184
Da: Antarctica
Registrato: 29-ago-2010
Re: PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato: 3-apr-2009 20.04
  Risposta

Lunedì metto in pratica i vostri consigli

Grazie per essere corsi in mio aiuto (dopo richiesta per email )

Caffè pagato!

Un saluto dal DON

cristiancudizio

Posts: 88
Da: Italia
Registrato: 3-apr-2008
Re: PLS-00306: wrong number or types of arguments in call to 'sting'
Inviato: 6-apr-2009 14.34
  Risposta

Grazie Massimo per il chiarimento.

Saluti
Cristian

Risposte: 6   Pagine: 1  
Back to Topic List
Topics: [ precedente | Prossimo ]