Не распознает параметр типа записи хранимой процедуры - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь протестировать вновь созданную хранимую процедуру в 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);

Я также попытался добавить определение типа:

PROCEDURE PR_UPDATE_DUE_INFO
    (p_rec         IN OUT rectype_trailer);

но я получаю ту же ошибку.

Почему скрипт не распознает определение записи?

Ответы [ 2 ]

1 голос
/ 31 марта 2019

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.

1 голос
/ 30 марта 2019

Хорошо, скрипт распознает ваши определения записей, оба из них. Вызывающая подпрограмма передает параметр типа «trailer% ROWTYPE», но ваша процедура ожидает тип «rectype_trailer», даже если «rectype_trailer» определено в другом месте, они не совпадают; таким образом ошибка является неправильным типом аргумента.

Вам нужно изменить один из них, чтобы он соответствовал другому. Предполагая, что определение типа строки правильное, вам нужно изменить определение процедуры на

PROCEDURE PR_UPDATE_DUE_INFO
(p_rec         IN OUT trailer%ROWTYPE); 

Короче говоря, определение вызывающего параметра должно точно соответствовать определению вызываемой процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...