无法使用记录类型输入参数调用函数 (PLS-00306/00382)
Posted
技术标签:
【中文标题】无法使用记录类型输入参数调用函数 (PLS-00306/00382)【英文标题】:Unable to call function with record type input parameter (PLS-00306/00382) 【发布时间】:2013-06-24 13:04:05 【问题描述】:类型定义(在包中):
TYPE t_konfiguracja_raport IS RECORD(
nazwa_tabeli varchar2(32),
nazwa_kolumny_etykieta varchar2(32),
nazwa_kolumny_wartosc varchar2(32),
etykieta varchar2(255),
numer_wystapienia integer,
odi_sesja_id pg_odi_type.t_sesja,
offset integer
);
函数声明——函数使用类型作为输入参数:
function pobierz_wartosc(konfiguracja in pg_odi_type.t_konfiguracja_raport)
return varchar2;
还有过程(与函数在同一个包中)。我需要在过程中使用函数,所以我试图这样做:
PROCEDURE zasilaj_posg_meldunek_dobowy(
p_sesja IN pg_odi_type.t_sesja,
o_status OUT pg_odi_type.t_boolean) as
c_blok constant pg_odi_type.t_log_blok := 'pg_odi_raport.zasilaj_posg_meldunek_dobowy';
v_konfiguracja PZK_MAIN_V3.PG_ODI_TYPE.T_KONFIGURACJA_RAPORT;
begin
pg_odi_log_err.save_log(c_blok,'BEGIN',pg_odi_const.C_LOG_CODE_DEBUG_01);
o_status := pg_odi_const.C_BFALSE;
v_konfiguracja.nazwa_tabeli := 'odi_posg_meldunek_dobowy';
v_konfiguracja.nazwa_kolumny_etykieta := 'natezenie_ruchu';
v_konfiguracja.nazwa_kolumny_wartosc := 'ilosc_w_dniu';
v_konfiguracja.etykieta := 'Wjechało do RP';
v_konfiguracja.numer_wystapienia := 1;
v_konfiguracja.odi_sesja_id := p_sesja;
v_konfiguracja.offset := 0;
select pg_odi_raport.pobierz_wartosc(v_konfiguracja) from dual; <--error!
null;
end zasilaj_posg_meldunek_dobowy;
不幸的是,它不起作用:
Error(90,12): PL/SQL: ORA-00904: "PG_ODI_RAPORT"."POBIERZ_WARTOSC": invalid identifier
Error(90,26): PLS-00306: wrong number or types of arguments in call to "POBIERZ_WARTOSC"
Error(90,42): PLS-00382: expression is of wrong type
我做错了什么?
【问题讨论】:
【参考方案1】:添加声明:
l_function_result varchar2(4000);
更改自:
pg_odi_raport.pobierz_wartosc(v_konfiguracja) from dual; <--error!
到:
l_function_result := pg_odi_raport.pobierz_wartosc(v_konfiguracja);
...应该没问题
【讨论】:
以上是关于无法使用记录类型输入参数调用函数 (PLS-00306/00382)的主要内容,如果未能解决你的问题,请参考以下文章
C语言中如何把结构体变量定义在主函数内,再调用一个自定义输入函数和输出函数
在从 simulink 调用 loadMNISTImages 函数时无法使用“machineformat”输入参数