Instrução PASSTHRU

Utilize PASSTHRU para gravar instruções ESQL que:
  • Ignore o analisador do
  • Vá diretamente para o banco de dados de backend configurado
  • Execute uma instrução codificada
PASSTHRU pode ser utilizado como uma instrução e uma função.

O primeiro parâmetro de PASSTHRU deve ser uma expressão ESQL válida que contenha a sintaxe do banco de dados. PASSTHRU permite utilizar sintaxe de banco de dados normalmente não suportada por ESQL.

O comportamento da função PASSTHRU depende se você forneceu um, dois ou mais parâmetros. O primeiro parâmetro da função PASSTHRU deve sempre ser uma expressão ESQL que esteja ou avalie em uma cadeia. Utilize pontos de interrogação na cadeia para estipular o local onde uma substituição de parâmetros é necessária.

Se você fornecer apenas um outro parâmetro, esse parâmetro será avaliado como um dos itens a seguir:
  • Um único valor escalar. Se for esse o caso, ele é inserido no primeiro marcador de parâmetro.
  • Uma lista de valores. Se for esse o caso, os itens da lista são inseridos em ordem em cada um dos marcadores de parâmetro dentro da cadeia.

Se você transmitir outros dois ou mais parâmetros, cada parâmetro será ligado ao ponto de interrogação correspondente na cadeia da instrução: ou seja, o primeiro parâmetro é ligado ao primeiro ponto de interrogação, o segundo parâmetro é ligado ao segundo ponto de interrogação e assim por diante.

Os pontos de interrogação são processados como marcadores de parâmetros em uma instrução SQL preparada pelo DBMS. Se você fornecer valores para funções no DBMS, deverá utilizar marcadores de parâmetros digitados da maneira apropriada. Por exemplo, no DB2 um marcador de parâmetro teria a coerção do seguinte modo:
SET OutputRoot.XML.Result.Data[] =
        PASSTHRU('SELECT * FROM user1.stocktable
    em que time=TIMESTAMP(CAST(? as
TIMESTAMP)),'1999-12-31-23.59.59.999999');
Aqui estão alguns exemplos que ilustram diferentes maneiras de utilizar a instrução PASSTHRU:
SET OutputRoot.XML.Result.Data[] =
                    PASSTHRU('SELECT * FROM user1.stocktable');
PASSTHRU('DELETE FROM user2.AccountData WHERE AccountId =
           ?', InputBody.Data.Account.Id);
SET OutputRoot.XML.Result.Data
    = PASSTHRU('SELECT AccountNum FROM user2.AccountData
    WHERE AccountId = ?', InputBody.Data.Account.Id);
SET OutputRoot.XML.Result.Data[]
    = PASSTHRU('SELECT AccountNum FROM user2.AccountData
              WHERE AccountId IN (? , ? , ?)',
            InputBody.Data.Account.Id[]);
PASSTHRU('INSERT INTO user1.stocktable (stock_id, quantity)
         values (?, ?)', InputBody.Transaction.Id,
                                                      InputBody.Transaction.Quantity);

Utilizando Arrastar e Soltar com PASSTHRU

Se estiver utilizando arrastar e soltar para criar o ESQL e a instrução PASSTHRU contiver toda a instrução ESQL, certifique-se de incluir aspas em torno das instruções ESQL que estão sendo aplicadas. Por exemplo:
PASSTHRU('INSERT INTO user1.stocktable VALUES (1)');
No entanto, se uma variável for primeiro definida e depois citada na instrução PASSTHRU, omita as aspas. Por exemplo:
SET myVar = 'SELECT * FROM user1.stocktable';
SET OutputRoot.XML.Data[] = PASSTHRU(myVar);

Considerações ao Chamar Procedimentos Armazenados

Se você utilizar a instrução PASSTHRU para chamar procedimentos armazenados, observe as seguintes considerações:
  • utiliza ODBC (Open Database Connectivity) para conectar a bancos de dados. O ODBC Versão 1 fornece suporte a chamadas de procedimentos armazenados utilizando a seguinte seqüência de escape ODBC:
    call procedure-name [([parameter][,[parameter]]...)]}

    Somente a seqüência de escape descrita acima é suportada para os parâmetros de entrada da função PASSTHRU em .

  • Utilizando a instrução ESQL CALL, é possível chamar um procedimento armazenado em banco de dados. Esse procedimento se comporta como se uma seqüência de instruções ESQL em linha estivesse sendo executada.
  • Os procedimentos armazenados podem existir:
    • Individualmente (suportado pelo DB2 e pelo Oracle). Isso pode ser escrito da seguinte maneira:
      PASSTHRU('{call proc_insert_comp(?,?)
      }',InputBody.Test.Company,InputBody.Test.Price);
    • Como parte de um coletivo que é acessado utilizando um mecanismo Package (suportado pelo Oracle). Isso pode ser escrito da seguinte maneira:
      PASSTHRU('{call share_management.add_share(?,?)}',
                                            InputBody.Test.Company,InputBody.Test.Price); 
  • Os procedimentos armazenados podem ser:
    Não consolidado
    A lógica do procedimento não executa ação de reversão e consolidação explícita (suportada pelo DB2 e Oracle).

    Se um fluxo de mensagens for consolidado ou revertido, as operações do banco de dados serão consolidadas ou revertidas. Isso é coerente com o comportamento dos nós Database e Warehouse, que têm uma propriedade de transação automática.

    Consolidado
    A lógica do procedimento contém ações de reversão e consolidação explícitas (suportadas pelo Oracle).

    Mesmo que um fluxo de mensagens seja revertido, as operações do banco de dados são consolidadas. Isso é coerente com o comportamento dos nós Database e Warehouse, que têm uma propriedade de transação consolidar.

    Para obter informações adicionais sobre transações coordenadas, consulte Configurando Fluxos de Mensagens Coordenados.

    As chamadas de procedimentos armazenados, tanto committal como noncommittal, afetam quaisquer operações de bancos de dados (e posterior resultado) se um fluxo de mensagens for revertido.

Limitações

Há algumas limitações ao utilizar PASSTHRU para chamar procedimentos armazenados. Para ilustrar as limitações, considere o seguinte exemplo:
PASSTHRU('{call proc_delete_comp(?)}',InputBody.Test.Company);
  1. suporta somente parâmetros de entrada.
  2. SqlMoreResults não pode ser utilizado por para recuperar conjuntos de resultados.

Conceitos relacionados
ESQL

Tarefas relacionadas
Desenvolvendo ESQL
Chamando Procedimentos Armazenados

Referências relacionadas
Instrução CALL
Instrução CREATE PROCEDURE