Como gerar um loop quot;forquot; dentro de um Stored Proce
Pessoal,
Tenho uma tabela onde existem os seguintes campos: ID, NOME_IX. Onde: ID é um valor auto-incremento e NOME_IX é um nome indexado. O indexador do nome varia de acordo com a entrada de um novo registro. Ex.: Supondo que o nome seja ´ABC´ então o indexador irá diferenciar os nomes ´ABC´ em ´ABC1´, ´ABC2´, ´ABC3´ e assim por diante, até que mude o nome. Quando mudar o nome, o indexador volta a ´1´. Ex.: Eu estava incluindo o nome ´ABC´ e já estava no ´ABC15´, daí mudei o nome para ´FFF´. Então, a partir do primeiro ´FFF´ o indexador reinicia: ´FFF1´, ´FFF2´, ´FFF3´.... até mudar de ´FFF´ para outro nome qualquer.
Hoje já tenho esse processo sendo executado via código do Delphi, porém está lento porque para saber se o nome ´FFF7´ (por exemplo) já existe, preciso fazer 6 Select na tabela até encontrar o próximo nome indexado disponível.
Gostaria fazer o seguinte: Criar uma Stored Procedure que me retorne o nome indexado correto. Ex.: Envio um texto como parâmetro para Stored Procedure e ela me retorna ´texto1´, ´texto2´....
Imagino que seja feito usando um loop ´for´ ou ´while´ e atribuindo o resultado do Select a uma variável. Só que não estou conseguindo entender as sintaxes usadas pelo FireBird. Também não estou conseguindo entender como ele faz as atribuições de retono de um Select.
Alguém já fez algo parecido? Tem idéia de como fazer?
Valeu
wbb
Tenho uma tabela onde existem os seguintes campos: ID, NOME_IX. Onde: ID é um valor auto-incremento e NOME_IX é um nome indexado. O indexador do nome varia de acordo com a entrada de um novo registro. Ex.: Supondo que o nome seja ´ABC´ então o indexador irá diferenciar os nomes ´ABC´ em ´ABC1´, ´ABC2´, ´ABC3´ e assim por diante, até que mude o nome. Quando mudar o nome, o indexador volta a ´1´. Ex.: Eu estava incluindo o nome ´ABC´ e já estava no ´ABC15´, daí mudei o nome para ´FFF´. Então, a partir do primeiro ´FFF´ o indexador reinicia: ´FFF1´, ´FFF2´, ´FFF3´.... até mudar de ´FFF´ para outro nome qualquer.
Hoje já tenho esse processo sendo executado via código do Delphi, porém está lento porque para saber se o nome ´FFF7´ (por exemplo) já existe, preciso fazer 6 Select na tabela até encontrar o próximo nome indexado disponível.
Gostaria fazer o seguinte: Criar uma Stored Procedure que me retorne o nome indexado correto. Ex.: Envio um texto como parâmetro para Stored Procedure e ela me retorna ´texto1´, ´texto2´....
Imagino que seja feito usando um loop ´for´ ou ´while´ e atribuindo o resultado do Select a uma variável. Só que não estou conseguindo entender as sintaxes usadas pelo FireBird. Também não estou conseguindo entender como ele faz as atribuições de retono de um Select.
Alguém já fez algo parecido? Tem idéia de como fazer?
Valeu
wbb
Wbb
Curtidas 0
Respostas
Afarias
22/07/2005
Pode explicar melhor o q quer fazer? (com um exemplo de preferência) ... eu não entendi nada.
T+
T+
GOSTEI 0
Rtava
22/07/2005
OK...
Numa tabela existe um campo autoincremental (Campo ´ID´) e outro de nome (Campo NOME).
Eu gravo nomes ´genéricos´ nesta tabela. Estes nomes devem ser diferenciados entre eles por um número (que chamo de indexador).
Hoje, via Delphi, quando preciso gravar um nome nesta tabela, eu preciso checar antes se o nome já existe. Se ele existir é incrementado o ´indexador´ e pesquisado novamente se o nome existe. Se existir, incremento novamente o indexador, pesquiso novamente e assim por diante (lento).
Via Delphi eu faço o seguinte:
Eu gostaria de implementar o que eu fiz em Delphi (acima) no banco do FireBird que estou usando. Porém, não estou conseguindo escrever a rotina lá no banco pois não estou familiarizado com a linguagem do FireBird. Na realidade precisaria ´traduzir´ o que fiz em Delphi para a linguagem do FireBird.
valeu!
Numa tabela existe um campo autoincremental (Campo ´ID´) e outro de nome (Campo NOME).
Eu gravo nomes ´genéricos´ nesta tabela. Estes nomes devem ser diferenciados entre eles por um número (que chamo de indexador).
Hoje, via Delphi, quando preciso gravar um nome nesta tabela, eu preciso checar antes se o nome já existe. Se ele existir é incrementado o ´indexador´ e pesquisado novamente se o nome existe. Se existir, incremento novamente o indexador, pesquiso novamente e assim por diante (lento).
Via Delphi eu faço o seguinte:
Var Nome_Encontrado: String; Index: Integer; begin Nome_Encontrado := "ABC"; Index := 1; with query do begin Close; SQL.Clear; SQL.Add(´Select * from TABELA where NOME = ´´´ + Nome_Encontrado + IntToStr(Index) + ´´´´); Open; // Pesquisa até encontrar um índice não utilizado while query.RecordCount > 0 do begin Index := Index + 1; Close; SQL.Clear; SQL.Add(´Select * from TABELA where NOME = ´´´ + Nome_Encontrado + IntToStr(Index) + ´´´´); Open; end; Nome_Encontrado := Nome_Encontrado + IntToStr(Index); end; end;
Eu gostaria de implementar o que eu fiz em Delphi (acima) no banco do FireBird que estou usando. Porém, não estou conseguindo escrever a rotina lá no banco pois não estou familiarizado com a linguagem do FireBird. Na realidade precisaria ´traduzir´ o que fiz em Delphi para a linguagem do FireBird.
valeu!
GOSTEI 0
Wbb
22/07/2005
Já resolvi... A rotina abaixo me retorna o que preciso e é o que o Rtava precisa também pelo que vejo, pois descreveu um problema idêntico...
Valeu
wbb
CREATE PROCEDURE TESTE ( TEXTO VARCHAR(50), ID_PAI INTEGER) RETURNS ( TEXTO_GERADO VARCHAR(50)) AS DECLARE VARIABLE QTD INTEGER; DECLARE VARIABLE CONTADOR INTEGER; BEGIN CONTADOR = 0; QTD = -1; WHILE (QTD <> 0) DO BEGIN CONTADOR = CONTADOR + 1; SELECT COUNT(*) AS QTD FROM ITENS WHERE (NOME = :TEXTO || ´ ´ || CAST(:CONTADOR AS VARCHAR(10))) AND (ID_PAI = :ID_PAI) INTO :QTD; END TEXTO_GERADO = :TEXTO || ´ ´ || CAST(:CONTADOR AS VARCHAR(10)); SUSPEND; END
Valeu
wbb
GOSTEI 0