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

Posted

技术标签:

【中文标题】无法识别存储过程的记录类型参数【英文标题】:Not recognizing the record type parameter of a stored procedure 【发布时间】:2019-03-30 01:14:19 【问题描述】:

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

但我得到了同样的错误。

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

【问题讨论】:

【参考方案1】:

脚本正在识别您的记录定义,两者都是。调用例程正在传递“trailer%ROWTYPE”类型的参数,但您的过程需要“rectype_trailer”类型即使“rectype_trailer”在别处定义,它们也不相同;因此错误是错误的参数类型。

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

PROCEDURE PR_UPDATE_DUE_INFO
(p_rec         IN OUT trailer%ROWTYPE); 

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

【讨论】:

【参考方案2】:

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,编译器在尝试解析您的调用代码时也会出现问题。

【讨论】:

以上是关于无法识别存储过程的记录类型参数的主要内容,如果未能解决你的问题,请参考以下文章

vSAN集群 无法识别磁盘处理

当函数作为参数传递给线程时,Doxygen无法识别函数调用

Swift 3:编译器无法识别子类 UIView 的类型

从 SQL 导入后 Excel 无法识别数字单元格

Android Studio 无法识别 Oreo 的最新版本代码或新窗口类型

MySQL phpmyadmin - SELECT FOR UPDATE 无法识别