Oracle: вызов SP с параметром IN AND Out

Во-первых, мои знания об Oracle очень ограничены.

Я унаследовал большой проект Delphi с использованием Oracle, он был обновлен до Oracle 11g. И теперь у меня проблемы с вызовом хранимых процедур с параметрами IN и OUT:

Начнем с SP (находится в пакете)

PROCEDURE GetAccessObjects(AAccessObjects OUT CURSOR_TYPE);

и определение CURSOR_TYPE

TYPE  CURSOR_TYPE IS REF CURSOR;

Затем код Delphi:

procedure TDBApi.GetAccessObjects(var ResultSet: TADOStoredProc);
var
  SP: TDbStoredProc;
begin
  SP := CreateStoredProc(SQLPackage + 'GetAccessObjects');
  try
    SP.MaxRecords := mrAll;
    SP.Open;
    ResultSet := SP;
  except
    SP.Free;
    raise;
  end;
end;

При выполнении кода Delphi он отлично работает!

Затем я создал GetAccessObjects2 и добавил в интерфейс параметр IN:

PROCEDURE GetAccessObjects2(ALotteryID IN INT, AAccessObjects OUT CURSOR_TYPE);

ALotteryID ни для чего не используется внутри SP, это просто фиктивный параметрер!

Затем я вызываю его из Delphi:

procedure TDBApi.GetAccessObjects2(var ResultSet: TADOStoredProc);
var
  SP: TDbStoredProc;
begin
  SP := CreateStoredProc(SQLPackage + 'GetAccessObjects2');

  try
    ParamAdd(SP.Parameters, 'ALOTTERYID', 1, ftInteger, pdInput, -1);

    SP.MaxRecords := mrAll;
    SP.Open;
    ResultSet := SP;
  except
    SP.Free;
    raise;
  end;
end;

И я получаю сообщение об ошибке:

ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GETACCESSOBJECTS2'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

Код Delphi работает около 10 лет, поэтому в базе данных должно быть какое-то отличие! Либо из-за обновления, либо из-за.

Вкратце: для справки требовался вызов GetAccessObjects2 из заданного кода Delphi.

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

Dsm 10.12.2018 14:26

Я предоставляю ALotteryID, но не предоставляю AAccessObjects

Jens Borrisholt 10.12.2018 14:29

Конечно! моя ошибка.

Dsm 10.12.2018 14:40

В своем последнем вопросе вы сказали, что собираетесь поговорить с Oracle об использовании SP как функции. Что они ответили?

Dsm 10.12.2018 14:41

Ооо, я совсем забыл об этом. Я завтра спрошу.

Jens Borrisholt 10.12.2018 14:42

Я должен сказать, что, глядя на веб-сайт Oracle, вы, похоже, злоупотребляете хранимыми процедурами. Чтобы избежать противоречий и двусмысленностей и просто с точки зрения ясности, если бы я хотел использовать сохраненную функцию, я бы определил ее как ФУНКЦИЮ (которую поддерживает Oracle), а не как ПРОЦЕДУРУ с параметром вне. Под капотом они могут быть эквивалентны сегодня, но это не значит, что они будут завтра ...

Dsm 10.12.2018 17:28

@Dsm можешь показать мне пример

Jens Borrisholt 10.12.2018 17:55

Возможно, вам также потребуется включить параметр в курсор, поскольку теперь вы предоставляете параметр ALotterID. Если вы уже объявляете курсор в методе CreateStoredProc (мы не видим ваш код !!), вам необходимо удалить его и объявить после параметра ALotteryId. Или измените объявление вашей процедуры так, чтобы ваш курсор был первым, а ALotteryID - после

Jason 11.12.2018 05:22

К сожалению, у меня не установлен Oracle, и я использовал его много лет назад, поэтому я не могу тестировать. Я предлагаю вам просмотреть веб-руководство по хранимым процедурам и функциям и представить себе, как вы решите проблему самостоятельно, а не просто принимаете чужой код. Попробуйте сами на простой тестовой процедуре / функции. Так вы научитесь работать с Oracle и сможете лучше поддерживать этот код.

Dsm 11.12.2018 10:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
92
0

Другие вопросы по теме