PREPARE

Nome

PREPARE -- prepara um comando para execução

Sinopse

PREPARE nome [ (tipo_de_dado [, ...] ) ] AS comando

Descrição

O comando PREPARE cria um comando preparado. Um comando preparado é um objeto no lado servidor que pode ser usado para otimizar o desempenho. Quando o comando PREPARE é executado, o comando especificado é analisado, reescrito e planejado. Após isso, quando o comando EXECUTE for submetido o comando preparado precisará apenas ser executado. Assim os estágios de análise, reescrita e planejamento são realizados apenas uma vez, e não todas as vezes que o comando é executado. [1] [2] [3]

Os comandos preparados podem receber parâmetros: valores que são substituídos no comando quando este é executado. Quando se cria o comando preparado, a referência aos parâmetros é feita pela sua posição, utilizando $1, $2, etc. Opcionalmente, pode ser especificada uma lista de tipos de dado dos parâmetros correspondente. Quando o tipo de dado do parâmetro não é especificado, ou é especificado como unknown, o tipo é inferido a partir do contexto onde o parâmetro é utilizado (se for possível). Ao executar o comando devem ser especificados os valores reais destes parâmetros no comando EXECUTE. Para obter informações adicionais deve ser consultado o comando EXECUTE.

Os comandos preparados somente continuam existindo enquanto a sessão de banco de dados corrente existir. Quando a sessão termina o comando preparado é esquecido e, portanto, deve ser recriado antes de poder ser usado novamente. Isto significa, também, que o mesmo comando preparado não pode ser usado simultaneamente por vários clientes do banco de dados; entretanto, cada cliente pode criar e usar o seu próprio comando preparado. O comando preparado pode ser liberado manualmente utilizando o comando DEALLOCATE.

A maior vantagem de desempenho dos comandos preparados acontece quando uma única sessão é usada para executar um grande número de comandos semelhantes. A diferença no desempenho é particularmente significativa quando os comandos possuem um planejamento ou reescrita complexos como, por exemplo, um comando envolvendo a junção de muitas tabelas, ou requerendo a aplicação de várias regras. Se o comando for relativamente simples de ser planejado e reescrito, e relativamente dispendioso para ser executado, fica mais difícil perceber a vantagem de desempenho dos comandos preparados.

Parâmetros

nome

Um nome arbitrário dado a este comando preparado. Deve ser único dentro da mesma sessão, sendo usado em seguida para executar ou liberar o comando preparado anteriormente.

tipo_de_dado

O tipo de dado do parâmetro do comando preparado. Quando o tipo de dado de um determinado parâmetro não é especificado, ou é especificado com unknown, o tipo é inferido a partir do contexto onde o parâmetro é utilizado. Para fazer referência aos parâmetros no comando preparado são usados $1, $2, etc.

comando

Um entre SELECT, INSERT, UPDATE, DELETE, ou or VALUES.

Observações

Em algumas situações o plano de comando produzido para o comando preparado será inferior ao plano de comando que teria sido escolhido se o comando fosse submetido e executado normalmente. Isto se deve ao fato de quando o comando é planejado, e o planejador tenta determinar o plano de comando ótimo, os valores verdadeiros dos parâmetros especificados no comando não estão disponíveis. O PostgreSQL coleta estatísticas sobre a distribuição dos dados na tabela, e pode usar valores constantes no comando para fazer suposições sobre o provável resultado da execução do comando. Como os dados reais não estão disponíveis ao planejar comandos preparados com parâmetros, o plano escolhido pode ser inferior ao ótimo. Para examinar o plano de comando escolhido pelo PostgreSQL para o comando preparado, deve ser utilizado o comando EXPLAIN.

Para obter informações adicionais sobre planejamento de comandos e estatísticas coletadas pelo PostgreSQL para esta finalidade, deve ser consultada a documentação do comando ANALYZE.

Podem ser vistos todos os comandos preparados disponíveis da sessão consultando a visão do sistema pg_prepared_statements.

Exemplos

Criar um comando preparado para o comando INSERT e, em seguida, executá-lo:

PREPARE fooplan (int, text, bool, numeric) AS
    INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Vale dos Caçadores', 't', 200.00);

Criar um comando preparado para o comando SELECT e, em seguida, executá-lo:

PREPARE usrrptplan (int) AS
    SELECT * FROM users u, logs l WHERE u.usrid=$1 AND u.usrid=l.usrid
    AND l.date = $2;
EXECUTE usrrptplan(1, current_date);

Deve ser observado que o tipo de dado do segundo parâmetro não foi especificado e, portanto, será inferido a partir do contexto onde $2 for utilizado.

Compatibilidade

O padrão SQL inclui o comando PREPARE, mas apenas para utilização na linguagem SQL incorporada (embedded). Esta versão do comando PREPARE também utiliza uma sintaxe um pouco diferente.

Consulte também

DEALLOCATE, EXECUTE

Notas

[1]

Oracle — O comando PREPARE (SQL incorporado executável) analisa um comando SQL ou um bloco PL/SQL especificado pela variável hospedeira e associa a um identificador. Pro*C/C++ Programmer's Guide Release 9.2 Part Number A97269-03 (N. do T.)

[2]

SQL Server 2000 — O comando PREPARE prepara um comando SQL a partir de uma cadeia de caracteres em uma variável hospedeira para execução posterior. Também associa o comando a um nome SQL simbólico. Embedded SQL for C and SQL Server — PREPARE (N. do T.)

[3]

DB2 — O comando PREPARE é utilizado por programas aplicativos para preparar dinamicamente comandos SQL para execução. O comando PREPARE criar um comando SQL executável, chamado de comando preparado, a partir da forma cadeia de caracteres do comando, chamada de cadeia do comando. Embora a cadeia do comando não possa incluir referências a variáveis hospedeiras, pode incluir marcadores de parâmetros. Os marcadores de parâmetros podem ser substituídos por valores de variáveis hospedeiras quando o comando preparado é executado. O marcador de parâmetro é um ponto de interrogação (?) utilizado onde uma variável hospedeira poderia ser utilizada se a cadeia do comando fosse um comando SQL estático. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.)

SourceForge.net Logo CSS válido!