我正在尝试在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);
但是我遇到同样的错误。
为什么脚本无法识别记录定义?
答案 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
的情况下,编译器也会在尝试解析您的调用代码时匆匆忙忙。