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. Em algumas implementações, a instrução batch inteira é executada antes que qualquer resultado esteja disponível. Isso geralmente é mais eficiente do que enviar instruções separadamente, porque o tráfego de rede geralmente pode ser reduzido e a fonte de dados às vezes pode otimizar a execução de um lote de instruções SQL. Em outras implementações, chamar SQLMoreResults dispara a execução da próxima instrução no lote. ODBC oferece suporte aos seguintes tipos de lotes:

  • Lotes explícitos Um lote explícito é duas ou mais instruções SQL separadas por ponto-e-vírgula (;). Por exemplo, o lote de instruções SQL a seguir abre uma nova ordem do cliente. Isso requer a inserção de linhas nas tabelas Ordens e Linhas. Observe que não há ponto-e-vírgula após a última instruçã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 de uma instrução SQL, ele será considerado um lote de instruções SQL. Por exemplo, a instrução específica do SQL Server a seguir cria um procedimento que retorna um conjunto de resultados contendo informações sobre um cliente e um conjunto de resultados listando 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 lote de instruções SQL. No entanto, o procedimento que ele 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 ponto-e-vírgula para separar várias instruções em uma instrução CREATE PROCEDUR.

  • Matrizes de parâmetros As matrizes de parâmetros podem ser usadas com uma instrução SQL parametrizada como uma maneira eficaz de executar operações em massa. Por exemplo, matrizes de parâmetros podem ser usadas com a seguinte instrução INSERT para inserir várias linhas na tabela Lines enquanto executa apenas uma única instrução SQL:

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

    Se uma fonte de dados não oferecer suporte a matrizes de parâmetros, o driver poderá emulá-las executando a instrução SQL uma vez para cada conjunto de parâmetros Para obter mais informações, consulte Parâmetros de instrução e matrizes de valores de parâmetro, mais adiante nesta seção.

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

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