Partilhar via


Executando uma declaração

Existem quatro formas de executar uma instrução, dependendo de quando são compiladas (preparadas) pelo motor da base de dados e de quem as define:

  • Execução Direta A aplicação define a instrução SQL. É preparado e executado em tempo de execução num único passo.

  • Execução Preparada A aplicação define a instrução SQL. É preparado e executado em tempo de execução em etapas separadas. A declaração pode ser preparada uma vez e executada várias vezes.

  • Procedimentos A aplicação pode definir e compilar uma ou mais instruções SQL no momento do desenvolvimento e armazenar essas instruções na fonte de dados como um procedimento. O procedimento é executado uma ou mais vezes em tempo de execução. A aplicação pode enumerar os procedimentos armazenados disponíveis usando funções de catálogo.

  • Funções do Catálogo O autor do driver cria uma função que devolve um conjunto de resultados pré-definido. Normalmente, esta função submete uma instrução SQL pré-definida ou chama um procedimento criado para esse fim. A função é executada uma ou mais vezes em tempo de execução.

Uma determinada instrução (identificada pelo seu identificador de instrução) pode ser executada um número ilimitado de vezes. A instrução pode ser executada com uma variedade de diferentes instruções SQL, ou pode ser executada repetidamente com a mesma instrução SQL. Por exemplo, o código seguinte utiliza o mesmo handle de instrução (hstmt1) para recuperar e exibir as tabelas na base de dados de Vendas. Depois, reutiliza este handle para recuperar as colunas numa tabela selecionada pelo utilizador.

SQLHSTMT    hstmt1;  
SQLCHAR *   Table;  
  
// Create a result set of all tables in the Sales database.  
SQLTables(hstmt1, "Sales", SQL_NTS, "sysadmin", SQL_NTS, NULL, 0, NULL, 0);  
  
// Fetch and display the table names; then close the cursor.  
// Code not shown.  
  
// Have the user select a particular table.  
SelectTable(Table);  
  
// Reuse hstmt1 to create a result set of all columns in Table.  
SQLColumns(hstmt1, "Sales", SQL_NTS, "sysadmin", SQL_NTS, Table, SQL_NTS, NULL, 0);  
  
// Fetch and display the column names in Table; then close the cursor.  
// Code not shown.  

E o código seguinte mostra como um único handle é usado para executar repetidamente a mesma instrução para eliminar linhas de uma tabela.

SQLHSTMT      hstmt1;  
SQLUINTEGER   OrderID;  
SQLINTEGER    OrderIDInd = 0;  
  
// Prepare a statement to delete orders from the Orders table.  
SQLPrepare(hstmt1, "DELETE FROM Orders WHERE OrderID = ?", SQL_NTS);  
  
// Bind OrderID to the parameter for the OrderID column.  
SQLBindParameter(hstmt1, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &OrderID, 0, &OrderIDInd);  
  
// Repeatedly execute hstmt1 with different values of OrderID.  
while ((OrderID = GetOrderID()) != 0) {  
   SQLExecute(hstmt1);  
}  

Para muitos programadores, alocar declarações é uma tarefa dispendiosa, por isso reutilizar a mesma declaração desta forma é geralmente mais eficiente do que libertar a memória de declarações existentes e alocar novas. As aplicações que criam conjuntos de resultados numa instrução devem ter cuidado para fechar o cursor sobre o conjunto de resultados antes de a reexecutar; para mais informações, veja Fechar o Cursor.

A reutilização de instruções também obriga a aplicação a evitar uma limitação, em alguns drivers, do número de instruções que podem estar ativas simultaneamente. A definição exata de "ativo" é específica de cada driver, mas frequentemente refere-se a qualquer afirmação que tenha sido preparada ou executada e que ainda tenha resultados disponíveis. Por exemplo, depois de uma instrução INSERT ter sido preparada, é geralmente considerada ativa; após uma instrução SELECT ter sido executada e o cursor ainda estar aberto, é geralmente considerado ativo; após a execução de uma instrução CREATE TABLE, geralmente não é considerada ativa.

Uma aplicação determina quantas instruções podem estar ativas numa única ligação ao mesmo tempo, chamando SQLGetInfo com a opção SQL_MAX_CONCURRENT_ACTIVITIES. Uma aplicação pode usar mais instruções ativas do que este limite ao abrir múltiplas ligações à fonte de dados; Como as ligações podem ser caras, no entanto, o efeito no desempenho deve ser considerado.

As aplicações podem limitar o tempo atribuído à execução de uma instrução com o atributo da instrução SQL_ATTR_QUERY_TIMEOUT. Se o período de tempo expirar antes da fonte de dados devolver o conjunto de resultados, a função que executa a instrução SQL devolve SQLSTATE HYT00 (Timeout expirado). Por defeito, não há timeout.

Esta seção contém os seguintes tópicos.