2012-02-27 33 views
0

我有以下的自定义RECORD TYPE为什么PLS-00382:表达式是错误的类型?

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

据我所知,在模式级别声明了一些记录类型,并且有一些记录类型可以在pl/sql环境中声明。使用系统生成的名称将包和pl/sql类型生成到模式级别类型中。您生成了两种不同的类型。声明后删除本地类型定义,以便引用在架构级别定义的类型。 – Glenn 2012-02-27 20:58:40

回答

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;你确定它编译?

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; 
1

我不知道,但似乎你在许多其他语言(如帕斯卡或遇到同样的事情Java),假设你使用完全相同的字段和方法在Java中声明了两个不同的类,它们是可赋值的吗?不。

我相信你的类型看起来是一样的,但它们是一样的。您必须使用您在调用代码块中定义的类型。

相关问题