ORA-06502: PL / SQL: цифра c или ошибка значения
ORA-06512: в «JOHN.GET_USERS_EMAIL», строка 7
ORA-06512: в строке 1
Когда я запускаю процедуру в SQL Developer и использую значения в моем приложении, она работает без каких-либо проблем. Когда я запускаю свой код VB. Net, я получаю исключение (показано выше)
Я не знаю, что я делаю неправильно. (Процедура Oracle была написана не мной, а другим лицом, которое здесь больше не работает).
Процедура в Oracle
create or replace PROCEDURE "GET_USERS_EMAIL" (
User_Email_P OUT VARCHAR,
Employee_P IN VARCHAR
)
As
Begin
SELECT USER_EMAIL INTO User_Email_P FROM
EMPLOYEE
WHERE
USER_ID = Employee_P;
end;
Код в VB. Net
Public Function Get_A_Users_Email(ByVal strEmpId As String) As String
Try
Dim rValue As String = ""
Dim strSQL As String = "JOHN.GET_USERS_EMAIL"
Dim cmd As OracleCommand = dba.CreateStoredProcCommand(strSQL)
cmd.BindByName = True
Dim oracleParameter(1) As OracleParameter
oracleParameter(0) = New OracleParameter()
oracleParameter(1) = New OracleParameter()
strEmpId = UCase(strEmpId.Trim())
With cmd
oracleParameter(0) = cmd.Parameters.Add(name:="User_Email_P", dbType:=OracleDbType.Varchar2, direction:=ParameterDirection.Output)
oracleParameter(1) = cmd.Parameters.Add(name:="Employee_P", dbType:=OracleDbType.Varchar2, val:=strEmpId, ParameterDirection.Input)
End With
dba.ExecuteScaler(cmd)
If String.IsNullOrEmpty(cmd.Parameters("User_Email_P").Value.ToString) = True Then
rValue = 0
Else
rValue = cmd.Parameters("User_Email_P").Value.ToString
End If
Return rValue
Catch ex As Exception
Dim Err As New App_Errors("App_Users", "Get_A_Users_Email", ex)
Return Nothing
End Try
End Function
Public Function ExecuteScaler(ByVal cmd As OracleCommand) As String
' the value tobe return ...
Dim value As String = ""
Dim oValue As Object
Dim bValue As Boolean = False
' execute command ...
Try
' open connection ...
cmd.Connection.Open()
Catch ex As Exception
MsgBox("Unable to establish a connection to CFR database." & ex.ToString, MsgBoxStyle.Critical)
Return value = ""
Exit Function
End Try
Try
' execute command ... convert type in the case of return value null ...
oValue = cmd.ExecuteScalar
bValue = Convert.IsDBNull(oValue)
If Not (bValue) Then
value = CType(oValue, String)
Else
value = ""
End If
Catch ex As Exception
' rethrow error ...
' Dim Err As New App_Errors("Data_Access_Class", "ExecuteScalar", ex)
Throw New Exception(ex.InnerException.ToString, ex)
Finally
cmd.Connection.Close()
End Try
Return value
End Function
Public Function CreateStoredProcCommand(ByVal cmdtext As String) As OracleCommand
Dim Cmd As New OracleCommand ' command object ...
' create command ...
With Cmd
.Connection = Conn
.CommandText = cmdtext
.CommandType = CommandType.StoredProcedure
End With
Return Cmd
End Function
Вот DDL таблицы.
CREATE TABLE "JOHN"."EMPLOYEE"
( "EMPLOYEE_NUMBER" NUMBER(9,0),
"LOCATION_CODE" VARCHAR2(4 BYTE),
"SECURITY_LEVEL" NUMBER(2,0),
"DATE_LAST_UPDATE" DATE,
"DATE_SECURITY_ASSIGNED" DATE,
"LAST_PASSWORD_DATE" DATE,
"CURRENT_PASSWORD" VARCHAR2(8 BYTE),
"FIRST_NAME" VARCHAR2(20 BYTE),
"MIDDLE_INITIAL" VARCHAR2(1 BYTE),
"LAST_NAME" VARCHAR2(30 BYTE),
"USER_ID" VARCHAR2(8 BYTE),
"USER_TYPE" CHAR(1 BYTE),
"INACTIVE_DATE" DATE,
"SECURITY_ASSIGNED_BY" VARCHAR2(8 BYTE),
"PASSWORD_EXPIRATION_DATE" DATE,
"STATUS_CODE" NUMBER(2,0),
"ACCOUNT_LOCKED" VARCHAR2(1 BYTE),
"UPDATE_PASS_ON_SIGNON" VARCHAR2(1 BYTE),
"USER_EMAIL" VARCHAR2(30 BYTE))
Обратите внимание, что код DDL, хранимые процедуры и VB. Net остались от предыдущего разработчика. Я заменяю реализацию Microsoft драйвера Oracle на ODP. Net. Там нет буквально никаких изменений в коде, кроме этого.