Chamadas de procedimento
Um procedimento é um objeto executável armazenado na fonte de dados. Em geral, é uma ou mais instruções SQL que foram pré-compiladas. A sequência de escape para chamar um procedimento é
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
em que procedure-name especifica o nome de um procedimento e parameter especifica um parâmetro de procedimento.
Para obter mais informações sobre a sequência de escape de chamada de procedimento, confira Sequência de escape de chamada de procedimento no Apêndice C: Gramática SQL.
Um procedimento pode ter zero ou mais parâmetros. Ele também pode retornar um valor (conforme indicado pelo marcador de parâmetro opcional ?= no início da sintaxe). Se um parâmetro for de entrada ou entrada/saída, ele poderá ser um literal ou um marcador de parâmetro. Porém, aplicativos interoperáveis sempre devem usar marcadores de parâmetro porque algumas fontes de dados não aceitam valores de parâmetro literais. Se o parâmetro for um parâmetro de saída, ele deverá ser um marcador de parâmetro. Os marcadores de parâmetro devem ser vinculados a SQLBindParameter antes da execução da instrução de chamada de procedimento.
Parâmetros de entrada e entrada/saída podem ser omitidos das chamadas de procedimento. Se um procedimento for chamado usando parênteses, mas sem nenhum parâmetro, como {call procedure-name()}, o driver instruirá a fonte de dados a usar o valor padrão para o primeiro parâmetro. Se o procedimento não tiver nenhum parâmetro, ele poderá falhar. Se um procedimento for chamado sem parênteses, como {call procedure-name}, o driver não enviará nenhum valor de parâmetro.
Literais podem ser especificados para parâmetros de entrada e de entrada/saída em chamadas de procedimento. Por exemplo, suponha que o procedimento InsertOrder tem cinco parâmetros de entrada. A seguinte chamada a InsertOrder omite o primeiro parâmetro, fornece um literal para o segundo parâmetro e usa um marcador de parâmetro para o terceiro, o quarto e o quinto parâmetros:
{call InsertOrder(, 10, ?, ?, ?)} // Not interoperable!
Note que, se um parâmetro for omitido, a vírgula que o separa de outros parâmetros ainda precisará aparecer. Se um parâmetro de entrada ou entrada/saída for omitido, o procedimento usará o valor padrão do parâmetro. Outra forma de especificar o valor padrão de um parâmetro de entrada ou entrada/saída é definir o valor do buffer de comprimento/indicador associado ao parâmetro como SQL_DEFAULT_PARAM.
Se um parâmetro de entrada/saída for omitido ou se for fornecido um literal para o parâmetro, o driver descartará o valor de saída. De forma semelhante, se o marcador de parâmetro para o valor de retorno de um procedimento for omitido, o driver descartará o valor de retorno. Finalmente, se um aplicativo especificar um parâmetro de valor de retorno para um procedimento que não retorna um valor, o driver definirá o valor do buffer de comprimento/indicador associado ao parâmetro como SQL_NULL_DATA.
Suponha que o procedimento PARTS_IN_ORDERS crie um conjunto de resultados que contenha uma lista de pedidos com um número de peça específico. O seguinte código chama esse procedimento para o número de peça 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 se uma fonte de dados é compatível com procedimentos, um aplicativo chama SQLGetInfo com a opção SQL_PROCEDURES.
Para obter mais informações, confira Procedimentos.