无法识别存储过程的记录类型参数
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
,编译器在尝试解析您的调用代码时也会出现问题。
【讨论】:
以上是关于无法识别存储过程的记录类型参数的主要内容,如果未能解决你的问题,请参考以下文章