Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.