为什么PLS-00382:表达式错误?

时间:2012-02-27 20:48:22

标签: sql oracle plsql oracle11g

我有以下自定义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点)。

3 个答案:

答案 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中声明了两个不同的类,它们是否可分配?不。

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