PRB: No se puede utilizar el parámetro booleano con Oracle

Exención de responsabilidades de contenido KB retirado

Este artículo se refiere a productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Síntomas

Si intenta utilizar el tipo de datos BOOLEAN como un tipo de parámetro de entrada o de salida con un procedimiento almacenado de Oracle, puede recibir el siguiente mensaje de error:
Número equivocado o tipos de argumentos en la llamada a 'SP_Name'
donde 'SP_Name' es el nombre del procedimiento almacenado o la función.

Causa

No puede utilizar el tipo de datos BOOLEAN como un tipo de parámetro de entrada o de salida con un procedimiento almacenado de Oracle. BOOLEAN es un tipo de datos PL/SQL y no se pueden pasar dentro o fuera de la colección de parámetros de ActiveX Data Objects (ADO) de Microsoft.

Solución

Para evitar este problema, utilice un tipo de datos compatible (como varchar). Para obtener una lista de tipos de datos compatibles, consulte la Ayuda en línea para el controlador ODBC de Microsoft para Oracle y el proveedor OLE DB para Oracle, que están disponibles con el Kit de desarrollo de Software (SDK) de Windows plataforma. Puede descargar el SDK de la plataforma de Windows desde el siguiente sitio Web de Microsoft:

Estado

Este comportamiento es por diseño. El tipo de datos BOOLEAN de Oracle es un tipo de datos PL/SQL y no un tipo de datos de base de datos de Oracle. El controlador de Oracle de Microsoft y el proveedor sólo admiten tipos de datos de la base de datos.

Más información

Pasos para reproducir el comportamiento

Crear los procedimientos almacenados

Para reproducir el problema, cree un procedimiento almacenado con un parámetro de salida de tipo BOOLEAN. También puede reproducir este problema si utiliza un procedimiento almacenado con un parámetro de entrada de tipo BOOLEAN. Además, puede utilizar la solución siguiente para resolver este problema si el parámetro de entrada tiene un tipo booleano.

  1. Utilice el tipo de datos PL/SQL de BOOLEAN para crear el primer procedimiento almacenado como sigue:
    CREATE OR REPLACE PROCEDURE TESTPARAM (                          RET_Result OUT BOOLEAN              
    )
    AS
    BEGIN
    RET_Result := True;
    END;

  2. Utilice un tipo de datos varchar para crear el segundo procedimiento almacenado como sigue:
    CREATE OR REPLACE PROCEDURE TESTPARAM1 (                          RET_Result OUT VARCHAR              
    )
    AS
    BEGIN
    RET_Result := 'True';
    END;

Crear la aplicación de Visual Basic

  1. Cree un nuevo proyecto EXE estándar en Visual Basic. Se creará Form1 de forma predeterminada.
  2. En el menú proyectos , haga clic en referenciasy, a continuación, seleccione la Microsoft ActiveX Data Objects 2. x casilla de verificación.
  3. Agregue dos botones de comando a Form1.
  4. Abra la ventana de código que está asociada a Form1 y pegue el código siguiente en la ventana de código:
    Private Sub Command1_Click()   Dim Cn As ADODB.Connection
    Dim Cmd As ADODB.Command
    Dim strConnect As String

    'Change the connection string to match your Oracle server name
    'and logon credentials.
    strConnect = "Provider=MSDAORA;Data Source=ORACLE816;User ID=User;Password=Password"
    Set Cn = New ADODB.Connection
    Cn.Open strConnect
    Set Cmd = New ADODB.Command
    With Cmd
    .ActiveConnection = Cn
    .CommandText = "TestParam"
    .CommandType = adCmdStoredProc
    .Parameters.Append .CreateParameter("RET_Result", adBoolean, adParamOutput, 1, 0)
    .Execute
    Debug.Print .Parameters.Item(0)
    End With
    End Sub

    Private Sub Command2_Click()
    Dim Cn As ADODB.Connection
    Dim Cmd As ADODB.Command
    Dim strConnect As String

    'Change the connection string to match your Oracle server name
    'and logon credentials.
    strConnect = "Provider=MSDAORA;Data Source=ORACLE816;User ID=User;Password=Password"
    Set Cn = New ADODB.Connection
    Cn.Open strConnect
    Set Cmd = New ADODB.Command
    With Cmd
    .ActiveConnection = Cn
    .CommandText = "TestParam1"
    .CommandType = adCmdStoredProc
    .Parameters.Append .CreateParameter("RET_Result", adVarChar, adParamOutput, 1, 0)
    .Execute
    Debug.Print .Parameters.Item(0)
    End With
    End Sub

  5. Asegúrese de cambiar los argumentos de las cadenas de conexión anterior para que señalen a su base de datos de Oracle.
  6. Ejecutar el código y haga clic en Command1. Recibirá el mensaje de error mencionado.
  7. Ejecute la aplicación una segunda vez y, a continuación, haga clic en Command2. Esto devuelve el valor True a la ventana Inmediato.
Propiedades

Id. de artículo: 306530 - Última revisión: 22 ene. 2017 - Revisión: 1

Comentarios