Вызов функции Oracle из VB6. Функция не является ошибкой процедуры - PullRequest
1 голос
/ 22 декабря 2011

У меня есть функция Oracle, объявленная как

create or replace FUNCTION CheckScan(
  pMode IN number, 
  pAgrISN in number, 
  pAgrId in varchar2, 
  pDocISN in number, 
  pRefundId in varchar2) RETURN NUMBER IS  ...

И клиентский код Visual Basic 6, который подключается к Oracle в качестве администратора, например:

...

cmd.ActiveConnection = conn
cmd.CommandText = "CheckScan"
cmd.CommandType = 4 'adCmdStoredProc

Dim pMode As Integer
Dim pAgrISN As Integer
Dim pAgrId As String
Dim pDocISN As Integer
Dim pRefundId As String

pMode = 2
pAgrISN = 12345
pAgrId = "Some-Id"
pDocISN = 12345
pRefundId = "Some-id"

cmd.Parameters.Append cmd.CreateParameter("pMode", 131, 1, 10, pMode)
cmd.Parameters.Append cmd.CreateParameter("pAgrISN", 131, 1, 10, pAgrISN)
cmd.Parameters.Append cmd.CreateParameter("pAgrId", 200, 1, 255, pAgrId)
cmd.Parameters.Append cmd.CreateParameter("pDocISN", 131, 1, 255, pDocISN)
cmd.Parameters.Append cmd.CreateParameter("pRefundId", 200, 1, 255, pRefundId)

cmd.Execute

Этот код заканчивается на:

PLS-00221: "CHECKSCAN" is not a procedure or is undefined

Что здесь не так? Функция была успешно скомпилирована.

Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 22 декабря 2011

Поскольку у вас есть функция (а не процедура), вы должны что-то сделать с возвращаемым значением. Добавьте следующий параметр:

With cmd
    .Parameters.Append .CreateParameter("pRetval", adNumeric, adParamReturnValue)
    .Parameters.Append .CreateParameter("pMode", adNumeric, adParamInput, 10, pMode)
    .Parameters.Append .CreateParameter("pAgrISN", adNumeric, adParamInput, 10, pAgrISN)
    .Parameters.Append .CreateParameter("pAgrId", adVarChar, adParamInput, 255, pAgrId)
    .Parameters.Append .CreateParameter("pDocISN", adNumeric, adParamInput, 255, pDocISN)
    .Parameters.Append .CreateParameter("pRefundId", adVarChar, adParamInput, 255, pRefundId)

    .Execute
End With

Обновление:

Порядок параметров актуален. Он должен начинаться с возвращаемого типа. Тогда все параметры функции должны следовать в том порядке, в котором они были объявлены. Однако имена параметров не имеют значения, поскольку позиционные (а не именованные) параметры используются внутри системы. Это очевидно, если вы посмотрите на CommandText свойство cmd:

"{ ? = call CheckScan(?, ?, ?, ?, ?) }"
3 голосов
/ 22 декабря 2011

Это просто вызвано тем, что вы определили его как функцию, но вызываете его, как если бы это была процедура.Либо вызовите его как функцию (с SELECT), либо используйте параметр IN OUT вместо RETURNING.

2 голосов
/ 22 декабря 2011

Я не знаю, можете ли вы вызвать функцию самостоятельно. Вместо этого я бы попытался выполнить выборку, что-то вроде:

select CheckScan(:pMode, :pAgrISN, :pArgId, :pDocISN, :pRefundId) from dual;
1 голос
/ 22 декабря 2011

Что делает эта функция?Oracle имеет определенные ограничения на функции (не разрешается делать обновления в определенных ситуациях и т. Д.). Ознакомьтесь с этим документом и убедитесь, что вы ничего не нарушаете в разделе Ограничения для пользовательских функций .Возможно, вам придется создать ее как хранимую процедуру (или обернуть ее одной).

...