Partilhar via


Lotes de instruções SQL

Um lote de instruções SQL é um grupo de duas ou mais instruções SQL ou uma única instrução SQL que tem o mesmo efeito que um grupo de duas ou mais instruções SQL. O agrupamento de instruções pode melhorar o desempenho ao reduzir o tráfego de rede e permitir que a fonte de dados otimize a execução.

Tipos de lotes

Em algumas implementações, toda a instrução batch é executada antes de quaisquer resultados estarem disponíveis. Isto é frequentemente mais eficiente do que submeter instruções separadamente, porque o tráfego de rede pode ser reduzido e a fonte de dados pode, por vezes, otimizar a execução de um lote de instruções SQL. Noutras implementações, chamar SQLMoreResults desencadeia a execução da próxima instrução no lote. O ODBC suporta os seguintes tipos de lotes:

  • Lotes Explícitos Um batch explícito são duas ou mais instruções SQL separadas por ponto e vírgula (;). Por exemplo, o seguinte lote de instruções SQL abre uma nova ordem de venda. Isto requer inserir linhas tanto nas tabelas de Ordens como de Linhas. Note que não há ponto e vírgula após a última afirmação.

    INSERT INTO Orders (OrderID, CustID, OpenDate, SalesPerson, Status)  
       VALUES (2002, 1001, {fn CURDATE()}, 'Garcia', 'OPEN');  
    INSERT INTO Lines (OrderID, Line, PartID, Quantity)  
       VALUES (2002, 1, 1234, 10);  
    INSERT INTO Lines (OrderID, Line, PartID, Quantity)  
       VALUES (2002, 2, 987, 8);  
    INSERT INTO Lines (OrderID, Line, PartID, Quantity)  
       VALUES (2002, 3, 566, 17);  
    INSERT INTO Lines (OrderID, Line, PartID, Quantity)  
       VALUES (2002, 4, 412, 500)  
    
  • Procedimentos Se um procedimento contiver mais do que uma instrução SQL, é considerado um conjunto de instruções SQL. Por exemplo, a seguinte instrução específica do SQL Server cria um procedimento que devolve um conjunto de resultados contendo informações sobre um cliente e um conjunto de resultados que lista todas as ordens de venda abertas para esse cliente:

    CREATE PROCEDURE GetCustInfo (@CustomerID INT) AS  
       SELECT * FROM Customers WHERE CustID = @CustomerID  
       SELECT OrderID FROM Orders  
          WHERE CustID = @CustomerID AND Status = 'OPEN'  
    

    A instrução CREATE PROCEDURE em si não é um conjunto de instruções SQL. No entanto, o procedimento que cria é um lote de instruções SQL. Nenhum ponto e vírgula separa as duas instruções SELECT porque a instrução CREATE PROCEDURE é específica do SQL Server, e o SQL Server não exige pontos e vírgulas para separar múltiplas instruções numa instrução CREATE PROCEDURE .

  • Arrays de Parâmetros - Arrays de parâmetros podem ser utilizados com uma instrução SQL parametrizada como uma maneira eficaz de realizar operações em massa. Por exemplo, arrays de parâmetros podem ser usados com a seguinte instrução INSERT para inserir múltiplas linhas na tabela Lines executando apenas uma única instrução SQL:

    INSERT INTO Lines (OrderID, Line, PartID, Quantity)  
       VALUES (?, ?, ?, ?)  
    

    Se uma fonte de dados não suportar arrays de parâmetros, o driver pode emulá-los executando a instrução SQL uma vez para cada conjunto de parâmetros. Para mais informações, veja Parâmetros da Instrução e Matrizes de Valores de Parâmetros, mais adiante neste artigo.

Os diferentes tipos de lotes não podem ser misturados de forma interoperável. Ou seja, a forma como uma aplicação determina o resultado da execução de um batch explícito que inclui chamadas de procedimento, um batch explícito que usa arrays de parâmetros, e uma chamada de procedimento que usa arrays de parâmetros é específica do driver.