首页 > 解决方案 > 无法识别存储过程的记录类型参数

问题描述

我正在尝试在 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);

但我得到同样的错误。

为什么脚本不能识别记录定义?

标签: oracleplsql

解决方案


PROCEDURE PR_UPDATE_DUE_INFO (p_rec IN OUT rectype_trailer);

因此,要编译,您必须在某处声明该记录类型,希望在 package 的规范中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被声明为 of ,编译器也会崩溃trailer%ROWTYPE


推荐阅读