Llamadas a procedimientos

Un procedimiento es un objeto ejecutable almacenado en el origen de datos. Normalmente, se trata de una o varias instrucciones SQL compiladas. La secuencia de escape para llamar a un procedimiento es

{[?=]callprocedure-name[([parameter][,[parameter]]...)]}

donde procedure-name especifica el nombre de un procedimiento y parameter especifica un parámetro de un procedimiento.

Para obtener más información sobre la secuencia de escape de una llamada a procedimiento, consulte Secuencia de escape de llamadas a procedimiento en el Anexo C: Gramática de SQL.

Un procedimiento puede tener cero o más parámetros. También puede devolver un valor, que se indica con el marcador de parámetro opcional ?= al inicio de la sintaxis. Si parameter es un parámetro de entrada o de entrada/salida, puede ser un literal o un marcador de parámetro. Sin embargo, las aplicaciones interoperables siempre deben usar marcadores de parámetro porque algunos orígenes de datos no aceptan valores de parámetros literales. Si parameter es un parámetro de salida, debe ser un marcador de parámetro. Los marcadores de parámetro deben enlazarse con SQLBindParameter antes de ejecutar la instrucción de llamada a procedimiento.

Los parámetros de entrada y de entrada/salida pueden omitirse de las llamadas a procedimiento. Si se llama a un procedimiento con paréntesis pero sin ningún parámetro, como procedure-name()}, el controlador indica al origen de datos que use el valor predeterminado para el primer parámetro. Si el procedimiento no tiene ningún parámetro, puede producirse un error en el procedimiento. Si se llama a un procedimiento sin paréntesis, como {call procedure-name}, el controlador no envía ningún valor de parámetro.

Pueden especificarse literales para los parámetros de entrada y de entrada/salida en llamadas a procedimiento. Por ejemplo, supongamos que el procedimiento InsertOrder tiene cinco parámetros de entrada. La siguiente llamada a InsertOrder omite el primer parámetro, proporciona un literal para el segundo parámetro y usa un marcador de parámetro para el tercero, cuarto y quinto parámetro:

{call InsertOrder(, 10, ?, ?, ?)}   // Not interoperable!  

Tenga en cuenta que, si se omite un parámetro, la coma que lo separa de los demás parámetros debe estar presente. Si se omite un parámetro de entrada o de entrada/salida, el procedimiento usa el valor predeterminado del parámetro. Otra forma de especificar el valor predeterminado de un parámetro de entrada o de entrada/salida consisten en establecer el valor del búfer de longitud o indicador enlazado al parámetro en SQL_DEFAULT_PARAM.

Si se omite un parámetro de entrada/salida o se proporciona un literal para el parámetro, el controlador descarta el valor de salida. Del mismo modo, si se omite el marcador de parámetro para el valor devuelto de un procedimiento, el controlador descarta dicho valor devuelto. Finalmente, si una aplicación especifica un parámetro de valor devuelto para un procedimiento que no devuelve ningún valor, el controlador establece el valor del búfer de longitud/indicador enlazado al parámetro en SQL_NULL_DATA.

Supongamos que el procedimiento PARTS_IN_ORDERS crea un conjunto de resultados que incluye una lista de pedidos que contienen un número de pieza determinado. El código siguiente llama a este procedimiento para el número de pieza 544:

SQLUINTEGER   PartID;  
SQLINTEGER    PartIDInd = 0;  
  
// Bind the parameter.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0,  
                  &PartID, 0, PartIDInd);  
  
// Place the department number in PartID.  
PartID = 544;  
  
// Execute the statement.  
SQLExecDirect(hstmt, "{call PARTS_IN_ORDERS(?)}", SQL_NTS);  

Para determinar si un origen de datos admite procedimientos, una aplicación llama a SQLGetInfo con la opción SQL_PROCEDURES.

Para obtener más información sobre los procedimientos, consulte Procedimientos.