Как вызвать функцию с возвращаемым номером
Прости мое отсутствие знаний. Я пытаюсь вызвать функцию вставки из sqlnavigator
, Я могу захватить prm1.Value
, но я не уверен, как я должен включать RETURN NUMBER
(см. SQL ниже) из моей спецификации пакета в sqlnavigator. Когда я запускаю его, ничего не добавляется в ORACLE.
Public Shared Function INSERT_CATEGORY()
Dim cmdOraCommand As New OracleCommand
Try
cmdOraCommand.CommandType = CommandType.StoredProcedure
cmdOraCommand.CommandText = "SF_ALEX_TEST.insertCategory"
Dim prm1 As OracleParameter = cmdOraCommand.Parameters.Add( _
"inCategory", OracleType.VarChar)
prm1.Direction = ParameterDirection.Input
prm1.Value = strCategory
Catch ex As Exception
MsgBox(ex.Message)
Finally
cmdOraCommand.Dispose()
End Try
End Function
SQL / ORACLE
FUNCTION insertCategory(inCategory IN VARCHAR2) RETURN NUMBER
IS
vReturnedValue NUMBER;
vID NUMBER;
vExist NUMBER;
BEGIN
IF inCategory IS NULL THEN
vReturnedValue := 0;
RETURN vReturnedValue;
ELSE
BEGIN
SELECT COUNT(MNT_CATEGORY) INTO vExist
FROM MNT_CATEGORIES
WHERE MNT_CATEGORIES.MNT_CATEGORY = upper(inCategory);
END;
IF vExist = 0 THEN
BEGIN
SELECT SEQ_MNT_LOG.NEXTVAL INTO vID FROM DUAL;
INSERT INTO MNT_CATEGORIES(MNT_CATEGORY_ID, MNT_CATEGORY)
VALUES (vID, UPPER(inCategory));
COMMIT;
vReturnedValue := vID;
RETURN vReturnedValue;
EXCEPTION
WHEN OTHERS THEN
vReturnedValue := SQLCODE;
RETURN vReturnedValue;
END;
ELSE
vReturnedValue := vExist * -1;
RETURN vReturnedValue;
END IF;
END IF;
END;
2 ответа
Решение
Вы создаете команду, но не открываете соединение или не выполняете команду.
Вы также создаете параметр, но не добавляете его в команду.
Вам также понадобится еще один параметр с ParameterDirection.Return
если вы хотите захватить возвращаемое значение. Вы не можете проверить значение этого параметра, пока читатель не будет закрыт.
Вот как я исправил свой код VB.net для правильной связи с Oracle/sqlnavigator.
Спасибо @ Скотт Ханнен
Public Shared Function INSERT_CATEGORY() As Boolean
Dim cmdMntID As New OracleCommand
cmdMntID.CommandType = CommandType.StoredProcedure
cmdMntID.CommandText = "SF_ALEX_TEST.insertCategory"
Dim prm1 As OracleParameter = cmdMntID.Parameters.Add("inCategory", OracleType.VarChar)
prm1.Direction = ParameterDirection.Input
prm1.Value = strCategory
cmdMntID.Parameters.Add("vID", OracleType.Number).Direction = ParameterDirection.ReturnValue
cmdMntID.Connection = ORA_CON
cmdMntID.ExecuteNonQuery()
vID = cmdMntID.Parameters("vID").Value
If cmdMntID.Parameters("vID").Value > 1 Then
Return True
Else
Return False
End If
End Function