无法识别存储过程的记录类型参数

时间:2019-03-30 01:14:20

标签: oracle plsql

我正在尝试在Oracle中测试新创建的存储过程。

我将存储过程添加到了程序包中,并成功地对其进行了编译。输入参数是记录类型。

这是脚本:

SET serveroutput on;
DECLARE
  p_trlr_rec trailer%ROWTYPE;
BEGIN
    /* Call procedure within package, identifying schema if necessary */
    TMS_SL_SQL_TRAILER.PR_UPDATE_DUE_INFO(p_trlr_rec);
END;

我得到了错误:

  

PLS-00306:“ PR_UPDATE_DUE_INFO”调用中参数的数量或类型错误

在软件包文件中,参数的定义如下:

PROCEDURE PR_UPDATE_DUE_INFO
(p_rec         IN OUT rectype_trailer);

PROCEDURE PR_UPDATE_DUE_INFO
    (p_rec         IN OUT rectype_trailer);

我还尝试添加TYPE定义:

PROCEDURE PR_UPDATE_DUE_INFO
    (p_rec         IN OUT rectype_trailer);

但是我遇到同样的错误。

为什么脚本无法识别记录定义?

2 个答案:

答案 0 :(得分:1)

该脚本正在识别您的记录定义,这两个都可以。调用例程正在传递类型为“ trailer%ROWTYPE”的参数,但是您的过程期望的是“ rectype_trailer”类型,即使在其他地方定义了“ rectype_trailer”,它们也不相同;因此错误是错误的参数类型。

您需要更改其中一个以匹配另一个。假设行类型定义正确,则需要将过程定义更改为

PROCEDURE PR_UPDATE_DUE_INFO
(p_rec         IN OUT trailer%ROWTYPE); 

简而言之,调用参数定义必须与被调用过程定义完全匹配。

答案 1 :(得分:1)

  

PROCEDURE PR_UPDATE_DUE_INFO (p_rec IN OUT rectype_trailer);

因此要进行编译,您必须在某个地方声明该记录类型,希望在软件包TMS_SL_SQL_TRAILER的规范中声明。因此,您只需要在调用代码中引用该声明即可:

DECLARE
  p_trlr_rec TMS_SL_SQL_TRAILER.rectype_trailer;
BEGIN
    /* Call procedure within package, identifying schema if necessary */
    TMS_SL_SQL_TRAILER.PR_UPDATE_DUE_INFO(p_trlr_rec);
END;

Oracle PL / SQL严格执行数据键入。具有相同结构的两种不同类型是两种不同类型,编译器将它们视为不兼容。因此,即使TMS_SL_SQL_TRAILER.rectype_trailer被声明为trailer%ROWTYPE的情况下,编译器也会在尝试解析您的调用代码时匆匆忙忙。