Olá galera, nesta Quick Tips, irei mostrar como podemos While e For no Firebird. Os chamados Loops, assim como em linguagem de programação em Banco de Dados também temos While e For, para nos ajudar com Stored Procedures e Triggers. Vamos começar vendo então o While

WHILE-DO

Com este comando podemos criar um loop onde não conhecemos o término da execução, mas ele será encerrado quando a condição não for mais verdadeira, veja a sintaxe:

WHILE (i <=5) DO
  BEGIN
  SELECT language_req[:i] FROM job
  WHERE ((job_code=:code) AND (job_grade=:grade) AND (job_country=:cty)
  AND (language_req IS NOT NULL))
  INTO :languages;
  IF (languages=' ')THEN /* Imprime 'NULL' ao invés de espaços */
  languages='NULL';
  i=i +1;
  SUSPEND;

Antes de falarmos sobre o FOR vamos analisar uma coisa interessante que seria utilizarmos comandos de SQL em uma Stored Procedure.

Comando em Stored Procedure

Podemos utilizar comandos de SQL SELECT, INSERT, UPDATE e DELETE, em uma Stored Procedure, da mesma forma como fazemos em uma query, mudando algumas coisas na sintaxe. No comando INSERT, os valores inseridos são resultantes de um parâmetro de entrada, veja como ficaria:

CREATE PROCEDURE ADD_ESTADO(
  IDESTADO SMALLINT,
  DESCRICAO CHAR(2)
  )
  AS
  BEGIN
  BEGIN
  INSERT INTO ESTADO (IDESTADO, DESCRICAO) VALUES (:IDESTADO, :DESCRICAO);
  WHEN SQLCODE -530 DO
  EXCEPTION unknown_IDDESCRICAO;
  END
  SUSPEND;
  END ^

Outra diferença seria a inclusão da clausula INTO ao comando SELECT, de maneira que possamos selecionar valores diferentes para varáveis ou parâmetros de saída, veja a sintaxe:

CREATE PROCEDURE CLIENTE_COUNT
  RETURNS (
  CLIENTECOUNT INTEGER
  )
  AS
  BEGIN
  SELECT COUNT(*) FROM CLIENTE INTO :CLIENTECOUNT;
  SUSPEND;
  END ^

FOR-DO

Com este comando podemos criar um loop onde sabemos qual é o término. Vamos ver agora um exemplo

CREATE PROCEDURE ORDER_LIST(
  IDCLIENTE INTEGER
  )
  RETURNS (
  DESCRICAO CHAR(8)
  )
  AS
  BEGIN
  FOR SELECT DESCRICAO FROM CLIENTE
  WHERE IDCLIENTE = :IDCLIENTE
  INTO :DESCRICAO
  DO
  SUSPEND;
  END ^

SUSPEND

O Comando SUSPEND informa a Stored Procedure para suspender a execução até que seja solicitado dados pelo cliente. Sempre será utilizado quando a Stored Procedure precisar retornar um valor para o cliente, evitando que a Stored Procedure encerre antes que o cliente tenha o resultado desejado. Veja a sintaxe:

CREATE PROCEDURE CLIENTE_COUNT
  RETURNS (
  CLIENTECOUNT INTEGER
  )
  AS
  BEGIN
  SELECT COUNT(*) FROM CLIENTE INTO :ClienteCount;
  SUSPEND;
  END ^

Fico por aqui ate à próxima Quick Tips.

Um abraço