Ir para conteúdo
Fórum Script Brasil
  • 0

Stored Procedure No Interbase Problemas


gladiador

Pergunta

Desenvolvi varias tabelas em um determinado banco de dados

utilizando o SQL Server 7.0, sendo que criei stored procedures para

executar consultas junto a essas tabelas, isso tudo utilizando como

Front End o Delphi 7.0 obtive excelente resultado ou seja tudo

funciona perfeitamente , porém atualmente migrei os bancos para o

Interbase 7.1 e quando tentei contruir uma stored procedure me deparei

com os seguintes erros :

erro linha 1 , nº 104

Segue o código da procedure que era realizada perfeitamente no SQL Server

e que quando roda no Interbase da erro :

---------------------------------------------------------------------------

CREATE PROCEDURE ADVOGA
@DATA_INI DATETIME,
@DATA_FINAL DATETIME ,
@CIA VERCHAR(4)
AS

SELECT Cad_Log.DP, Cad_Log.Nome_Rua, Tab_Infracao.Tipo_Infracao,
Ocorrencia.Data, Ocorrencia.Horario, Ocorrencia.Flagrante

FROM Ocorrencia Ocorrencia, Cad_Log Cad_Log ,
Tab_Infracao Tab_Infracao

WHERE Ocorrencia.Cod_Infracao = Tab_Infracao.Cod_Infracao AND 
             Ocorrencia.Codigo_Rua = Cad_Log.Codigo_Rua  AND 
             Ocorrencia.Data >= @DATA_INI AND 
             Ocorrencia.Data <= @DATA_FINAL   AND
             Cad_Log.Cia = @CIA  AND 
             Ocorrencia.Flagrante ="S"
             Order by Tab_Infracao.Tipo_Infracao

EXEC ADVOGA "2000-04-01", "2000-08-30", "02"

-------------------------------------------------------------------------------

Deixando claro o código acima funciona perfeitamente no SQL Server 7.0 / 2000

porém no Interbase 7.1 da erro na primeira linha e reclama do "@" ou seja não posso

usar arroba?

Como ficaria isso no Interbase poderia me explicar o código pois, os tutoriais sobre

procedures no Interbase estão deixando a desejar e estão bem fracos e executando

basico

Obrigado

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Ola kro amigo Gladiador muito estranho, mas tenho a impressao que o uso das @ neste caso não seria necessario no interbase, simples porque o seu metodo é diferente do SQL SERVER, bem mas não importa agora eu achei um artigo no site www.delphi.eti.br sobre store procedures em interbase quem sabe isso pode ajudar você ok

Stored Procedures é um objeto de banco de dados que contém comandos  que se resumem em linhas de comando que processam tarefas, ou fazem chamadas a outras procedures.

Uma Stored Procedure (procedimento armazenado), além de executar instruções, possibilita a interação e aplicação que a invoca e o seu corpo de código por intermédio dos parâmetros definidos no seu cabeçalho.

A execução de uma Stored Procedure sempre ocorre de forma explícita, ou de forma interativa, como por exemplo pela utilização do SQL* Plus ou sendo referenciada no corpo do código de uma aplicação Cliente.

Neste último exemplo um procedimento armazenado, se revela um excelente núcleo para manter código que processa tarefa envolvendo a estrutura de dados. Manter o código de processamento armazenado no banco de dados, traz de imediato a facilidade na manutenção em um único local, refletindo na aplicação que faz referência a esta procedure.

Se elevarmos a análise para um ambiente de desenvolvimento corporativo onde se caracteriza a heterogeneidade pela adoção de linguagens de programação múltiplas, o uso de Stored Procedure alcança importância sem igual, já que seu uso conforme abordado no parágrafo anterior, irá atingir uma maior magnitude.

Diferente de uma Trigger, que tem o seu processamento disparado pela ocorrência de comandos para a tabela associada, uma Stored Procedure ocorre quando explicitamente solicitada.

Na sequência, teremos alguns exemplos práticos do cotidiano, que visam explorar a plenitude do uso de procedures no contexto do desenvolvimento de sistemas comerciais.

23) CREATE PROCEDURE PROC_GENCLIENTES RETURNS (NUMERO INTEGER) AS

begin

NUMERO = GEN_ID(Gen_clientes, 1);

Suspend;

end

24) CREATE PROCEDURE PROC_GENPRODUTOS RETURNS (NUMERO INTEGER) AS

begin

NUMERO = GEN_ID(Gen_Produtos, 1);

Suspend;

end

25) CREATE PROCEDURE PROC_GENPEDIDOS RETURNS (NUMERO INTEGER) AS

begin

NUMERO = GEN_ID(Gen_pedidos, 1);

Suspend;

end

29) CREATE PROCEDURE PROC_SELECT RETURNS (VARNOME CHAR(60)) AS

BEGIN

FOR

SELECT NOME FROM CLIENTES INTO :VARNOME

DO

SUSPEND;

END

26) CREATE PROCEDURE PROC_INCPRODUTOS (PARDESCRICAO VARCHAR(25),

PARPRECO NUMERIC(15, 2),

PARSALDO INTEGER) AS

DECLARE VARIABLE

VarReg INTEGER;   

begin

BEGIN

VarReg = GEN_ID(Gen_Produtos, 1);

Insert Into Produtos Values(  :VarReg,

:ParDESCRICAO,

:ParPRECO,

:ParSaldo);

WHEN SQLCODE -530 DO

EXCEPTION EXC_REGEXISTENTE;

END

SUSPEND;

END

27) CREATE PROCEDURE PROC_ALTPRODUTOS (PARID_PRODUTO INTEGER,

PARDESCRICAO VARCHAR(25),

PARPRECO NUMERIC(15, 2),

PARSALDO INTEGER) AS

begin

Update Produtos Set

DESCRICAO = :PARDESCRICAO,

preço = :PARPRECO,

Saldo = :PARSALDO

Where ID_Produto = :PARID_PRODUTO;

END

28) CREATE PROCEDURE PROC_EXCPRODUTOS (PARID_PRODUTO INTEGER) AS

begin

Delete From Produtos

Where ID_Produto = :PARID_PRODUTO;

END

29) CREATE PROCEDURE PROC_SELECT RETURNS (VARNOME CHAR(60)) AS

BEGIN

FOR

SELECT NOME FROM CLIENTES INTO :VARNOME

DO

SUSPEND;

END

30) CREATE PROCEDURE PROC_ESTATVENDA (PARID_CLIENTE INTEGER,

PARDATAINI DATE,

PARDATAFIM DATE)

RETURNS (    TOT_VENDA NUMERIC(15, 2),

AVG_VENDA NUMERIC(15, 2),

MIN_VENDA NUMERIC(15, 2),

MAX_VENDA NUMERIC(15, 2)) AS

BEGIN

SELECT        SUM(ITENS.QUANTIDADE * ITENS.preço),

AVG(ITENS.QUANTIDADE * ITENS.preço),

MIN(ITENS.QUANTIDADE * ITENS.preço),

MAX(ITENS.QUANTIDADE * ITENS.preço)

FROM            CLIENTES, PEDIDOS, ITENS

WHERE          CLIENTES.ID_CLIENTE = PEDIDOS.ID_CLIENTE            AND  PEDIDOS.ID_PEDIDO = ITENS.ID_PEDIDO                AND

CLIENTES.ID_CLIENTE = :PARID_CLIENTE                    AND

PEDIDOS.DATA BETWEEN

:PARDATAINI AND :PARDATAFIM

INTO              :TOT_VENDA,

:AVG_VENDA,

:MIN_VENDA, 

:MAX_VENDA;

SUSPEND;

END

Triggers

Triggers  são blocos ISQL que contém códigos que implementam instruções que podem afetar dados contidos em tabelas, validos dados baseadas em certas condições, acionar procedimentos armazenados entre outros objetos.

Uma Trigger, que significa gatilho, é definida (criada) e associada a um evento (ocorrência) conseqüente aos comandos Insert, Delete ou Update.

Ao contrário de uma Store Procedure (Procedimento Armazenad), uma Trigger não é invocada nem referenciada em código Cliente nem no servidor InterBase . Conforme sugere seu nome, uma Trigger é disparada (executada ) pela manipulação da tabela na qual foi criada.

Conforme conceitualmente já abordado no tópico integridade, uma Trigger é um excelente mecanismo para se controlar as restrições, tendo em vista a possibilidade de interferir nos valores que estão sendo manipulados, pode-se ainda estabelecer uma comunicação clara com a aplicação Front-End.

Como exemplos de situações em que a adoção de Triggers se aplica, relacionamos o seguinte:

- Fazer manutenção (atualização) em outras tabelas quando ocorrerem operações de inclusão, alteração ou exclusão na tabela corrente.

- Estabelecer validação para colunas.

- Alimentar tabelas de controle de Log.

- Sinalizar aplicação Front-End de alguma ocorrência específica.

30) CREATE TRIGGER TRIG_TESTACREDITO_INC FOR CLIENTES

ACTIVE BEFORE INSERT POSITION 0 AS

BEGIN

IF (NEW.CREDITO > 20000) THEN

BEGIN

NEW.CREDITO = 20000;

END

END

31) CREATE TRIGGER TRIG_TESTACREDITO_ALT FOR CLIENTES

ACTIVE BEFORE UPDATE POSITION 0 AS

BEGIN

IF (NEW.CREDITO > 20000) THEN

BEGIN

NEW.CREDITO = 20000;

END

END

32) CREATE TRIGGER TRIG_ID_CLIENTE FOR CLIENTES

ACTIVE BEFORE INSERT POSITION 0 AS

BEGIN

NEW.ID_Cliente = GEN_ID(Gen_clientes, 1);

END

33) CREATE TRIGGER TRIG_ATUALIZASALDOPRODUTO_ALT FOR ITENS

ACTIVE BEFORE UPDATE POSITION 0 AS

DECLARE VARIABLE VARSALDO INTEGER;

BEGIN

UPDATE        PRODUTOS SET

PRODUTOS. SALDO = PRODUTOS.SALDO + OLD.QUANTIDADE

WHERE          PRODUTOS.ID_PRODUTO = OLD.ID_PRODUTO;

SELECT        PRODUTOS.SALDO

FROM            PRODUTOS

WHERE          PRODUTOS.ID_PRODUTO = NEW.ID_PRODUTO

INTO              :VARSALDO;

IF (:VARSALDO >= NEW.QUANTIDADE) THEN

BEGIN

UPDATE PRODUTOS SET

PRODUTOS.SALDO = PRODUTOS.SALDO - NEW.QUANTIDADE

WHERE  PRODUTOS.ID_PRODUTO = NEW.ID_PRODUTO;

END

ELSE

BEGIN       

EXCEPTION EXC_SALDO;

END

END

34) CREATE TRIGGER TRIG_ATUALIZASALDOPRODUTO_EXC FOR ITENS

ACTIVE BEFORE DELETE POSITION 0 AS

BEGIN

UPDATE PRODUTOS SET

PRODUTOS.SALDO = PRODUTOS.SALDO + OLD.QUANTIDADE

WHERE  PRODUTOS.ID_PRODUTO = OLD.ID_PRODUTO;

END

35) CREATE TRIGGER TRIG_ATUALIZASALDOPRODUTO_INC FOR ITENS

ACTIVE BEFORE INSERT POSITION 0 AS

DECLARE VARIABLE VARSALDO INTEGER;

BEGIN

SELECT        PRODUTOS.SALDO

FROM            PRODUTOS

WHERE          PRODUTOS.ID_PRODUTO = NEW.ID_PRODUTO

INTO              :VARSALDO;

IF (:VARSALDO >= NEW.QUANTIDADE) THEN

BEGIN

UPDATE PRODUTOS SET

PRODUTOS.SALDO = PRODUTOS.SALDO -  NEW.QUANTIDADE

WHERE  PRODUTOS.ID_PRODUTO = NEW.ID_PRODUTO;

END

ELSE

BEGIN       

EXCEPTION EXC_SALDO;

END

END

espero que seja de grande utilidade abraços

Rafael Marciano

Link para o comentário
Compartilhar em outros sites

  • 0

oi amigos, me desculpa a ignorância, mais alguém pode me dizer num modo aportuguesado o que que significa Stored Procedure? ou seja, o que isso ai faz?

E quando é bom utilizar isso?

Eu dei uma lida nesse artigo que o colega acima postou, mais a ignorância não me deixou entender muito!

Obrigado!

Link para o comentário
Compartilhar em outros sites

  • 0

/* Procedimento Armazenado, ou seja vamos supor que você va desenvolver em uma aplicação DELPHI e la tenha que fazer pesquisas ou deleção ou inserção ou atualizar cálculos , o que pode ser feito ?

uma Stored Procedure

Suponhamos que você tenha um campo onde tera pesquisar nomes porem varias outras tabelas relacionadas, ou seja ou SQL grande e complicado, caso faça isso no DELPHI ou seja no FRONT END quando executado na sua máquina ótimo porém quando executado em rede a performance cai , ai entra a procedure você cria ela no banco e executa através de apenas uma linha no front end ou seja no DELPHI fica bem mais rápido , basicamente é isso ai

*/

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...