我有以下自定义RECORD TYPE
:
TYPE TB48_RECTYPE IS RECORD (
codpo varchar2(5 BYTE),
codco varchar2(5 BYTE),
quadr varchar2(5 BYTE),
espec varchar2(5 BYTE),
aperf varchar2(5 BYTE),
subes varchar2(5 BYTE),
datin date);
现在是一个返回完全相同类型的函数。
function retorna_infos_tabela_48(i_nip in varchar2) return TB48_RECTYPE is
retorno_REC TB48_RECTYPE;
begin
select m.CODPO,
m.CODCO,
m.QUADR,
m.ESPEC,
m.APERF,
m.SUBES,
m.DATIN
into retorno_REC
from TB48_M m
where m.NRO = i_nip;
return retorno_REC;
end retorna_infos_tabela_48;
然而,(这已经花了我4个多小时),当我尝试像这样运行时:
DECLARE
TYPE TB48_RECTYPE IS RECORD (
codpo varchar2(5 BYTE),
codco varchar2(5 BYTE),
quadr varchar2(5 BYTE),
espec varchar2(5 BYTE),
aperf varchar2(5 BYTE),
subes varchar2(5 BYTE),
datin date);
RetVal TB48_RECTYPE;
I_NIP VARCHAR2(200);
BEGIN
I_NIP := '88888888';
RetVal := RETORNA_INFOS_TABELA_48 ( I_NIP );
COMMIT;
END;
我收到以下错误消息: PLS-00382:表达式类型错误。 (在我将函数返回值赋给RetVal变量的行上)
我的意思是,函数返回一个RECORD
,它与我声明的变量的类型完全相同!!我在这里想念的是什么?
提前谢谢(以及几个REP点)。
答案 0 :(得分:6)
我怀疑你的问题是你试图将全局声明的类型放入本地声明的类型。
我认为如果您将程序更改为以下程序,它应该有效。
declare
RetVal TB48_RECTYPE;
i_nip varchar2(200);
begin
i_nip := '86583557';
RetVal := USERTEMPOS.PKG_ESTRANG_NOVA.RETORNA_INFOS_TABELA_48 ( I_NIP );
commit;
end;
目前您的commit
无所事事......
您尚未提供创建全局类型的方式,但如果您未在包中执行此操作,则提供的语法为incorrect;你确定它编译好了吗?
答案 1 :(得分:3)
声明框中的类型与函数中使用的类型不同。它可能看起来一样,但对PLSQL编译器来说是不同的。如果您只是在声明块中使用已定义的类型,它可能会起作用,例如:
declare
RetVal TB48_RECTYPE;
I_NIP VARCHAR2(200);
BEGIN
I_NIP := '86583557';
RetVal := USERTEMPOS.PKG_ESTRANG_NOVA.RETORNA_INFOS_TABELA_48 ( I_NIP );
COMMIT;
END;
答案 2 :(得分:1)
我不确定,但在许多其他语言(例如Pascal或Java)中遇到的情况似乎相同。假设您使用完全相同的字段和方法在Java中声明了两个不同的类,它们是否可分配?不。
我相信你的类型看起来一样,但它们是一样的。您必须使用在调用代码块时定义的类型。