一尘不染

为什么是PLS-00382:表达式的类型错误?

sql

我有以下习惯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变量的那一行上)

我的意思是,该函数返回的aRECORD与我声明的变量的类型完全相同!我在这里想念什么???

预先感谢(和一些REP要点)!


阅读 197

收藏
2021-05-16

共1个答案

一尘不染

我怀疑您的问题是您试图将全局声明的类型放入本地声明的类型。

我认为,如果您将程序更改为以下内容,则应该可以使用。

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无所事事…

您尚未提供创建全局类型的方式,但是如果没有在包中进行创建,则提供的语法不正确;您确定它已编译吗?

2021-05-16