STORAGE PROCEDURE
Bom dia senhores, amigos, vejam só, tenho duas storage procedure direrentes, uma para adicionar informacoes, outra para alterar, eu estava querendo fazer o seguinte, criar apenas uma storage para cada tela, e dentro dela colocar todos os dados de manipulacao da tabela, como por exemplo alterar, excluir, incluir, vou passar como eu faço essa storage .. se alguem puder dar uma força, pq eu pensei em criar um parametro na storage, tipo uma string que recebe um valor, se receber o valor A e para alterar , ele vai executar somente os dados de alteraçao, se receber o parametro I ele vai incluir, mas como eu faço isso?
Entao como faço para fusionar essas duas?
[ô]Essa e de inclusao
DELIMITER $$
DROP PROCEDURE IF EXISTS 'sp_add_cadpessoas' $$
CREATE DEFINER='root'@'localhost' PROCEDURE 'sp_add_cadpessoas'(
IN v_pesscodigo VARCHAR(10),
v_pessnome VARCHAR(80),
v_pesscontato VARCHAR(80),
v_pesscnpj VARCHAR(20),
v_pessestadual VARCHAR(25),
v_pesscat VARCHAR(5),
v_pessdtainclusao DATE,
v_pessativo TINYINT(1),
v_pessexcluso TINYINT(1),
v_pessdtaclidesde DATETIME,
v_pessorigem VARCHAR(10),
v_pessclassificacao VARCHAR(10)
)
BEGIN
INSERT INTO cadpessoas
(
pesscodigo,pessnome,pesscontato,pesscnpj,pessestadual,pesscat,pessdtainclusao,pessativo,
pessexcluso,pessdtaclidesde,pessorigem,pessclassificacao
)
VALUES
(
v_pesscodigo,v_pessnome,v_pesscontato,v_pesscnpj,v_pessestadual,v_pesscat,v_pessdtainclusao,v_pessativo,
v_pessexcluso,v_pessdtaclidesde,v_pessorigem,v_pessclassificacao
);
END $$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS 'sp_edt_cadpessoas' $$
CREATE DEFINER='root'@'localhost' PROCEDURE 'sp_edt_cadpessoas'(
IN v_id INT(10),
v_pesscodigo VARCHAR(10),
v_pessnome VARCHAR(80),
v_pesscontato VARCHAR(80),
v_pesscnpj VARCHAR(20),
v_pessestadual VARCHAR(25),
v_pesscat VARCHAR(5),
v_pessativo TINYINT(1),
v_pessorigem VARCHAR(10),
v_pessclassificacao VARCHAR(10)
)
BEGIN
UPDATE cadpessoas SET
pesscodigo = v_pesscodigo,
pessnome = v_pessnome,
pesscontato = v_pesscontato,
pesscnpj = v_pesscnpj,
pessestadual = v_pessestadual,
pesscat = v_pesscat,
pessativo = v_pessativo,
pessorigem = v_pessorigem,
pessclassificacao = v_pessclassificacao
WHERE
idpess=v_id;
END $$
DELIMITER ;
Entao como faço para fusionar essas duas?
Entendi, mas como seria para fazer passando parametro? para mim será a melhor pedida..
Vilanova acredito que seja possÃvel usar um select case no banco, estão seria sÃmples, basta usar um outro parâmetro inicial (antes dos campos) como se fosse um e testar assim:
Select Case Acao
Case [Ô]A[Ô]
......
Case [Ô]I[Ô]
....
.....
end Select
Neste caso não precisaria nem do If que o colega colocou [Ô]....if (v_id) = 0 ....[Ô] pois o A já informaria que é uma alteração e o I uma inclusão.
Select Case Acao
Case [Ô]A[Ô]
......
Case [Ô]I[Ô]
....
.....
end Select
Neste caso não precisaria nem do If que o colega colocou [Ô]....if (v_id) = 0 ....[Ô] pois o A já informaria que é uma alteração e o I uma inclusão.
Um exemplo de um procedure, em Oracle:
CREATE OR REPLACE PROCEDURE [Ô]PCR_GRAVA_BANCO[Ô] (
CODIGO IN BANCO.BAN_CODIGO%TYPE ,
NOME IN BANCO.BAN_NOME%TYPE,
ACAO IN VARCHAR2
)
AS
COD NUMBER;
BEGIN
-- SE FOR UM NOVO REGISTRO
IF ACAO = [ô]N[ô] THEN
INSERT INTO BANCO(BAN_CODIGO, BAN_NOME)
VALUES(CODIGO, NOME);
COMMIT;
END IF;
-- SE FOR UMA ALTERAÇÃO DE REGISTRO
IF ACAO = [ô]A[ô] THEN
UPDATE BANCO SET BAN_NOME = NOME WHERE BAN_CODIGO = CODIGO;
COMMIT;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END PCR_GRAVA_BANCO;
/
Para executar:
Conexao.Execute([Ô]PCR_GRAVA_BANCO( & Val(TxtCodigo.Text) & [Ô],[ô][Ô] & Trim(TxtNomeBanco.Text) & [Ô][ô], [ô]N[ô])[Ô])
ou
Conexao.Execute([Ô]PCR_GRAVA_BANCO( & Val(TxtCodigo.Text) & [Ô],[ô][Ô] & Trim(TxtNomeBanco.Text) & [Ô][ô], [ô]A[ô])[Ô])
CREATE OR REPLACE PROCEDURE [Ô]PCR_GRAVA_BANCO[Ô] (
CODIGO IN BANCO.BAN_CODIGO%TYPE ,
NOME IN BANCO.BAN_NOME%TYPE,
ACAO IN VARCHAR2
)
AS
COD NUMBER;
BEGIN
-- SE FOR UM NOVO REGISTRO
IF ACAO = [ô]N[ô] THEN
INSERT INTO BANCO(BAN_CODIGO, BAN_NOME)
VALUES(CODIGO, NOME);
COMMIT;
END IF;
-- SE FOR UMA ALTERAÇÃO DE REGISTRO
IF ACAO = [ô]A[ô] THEN
UPDATE BANCO SET BAN_NOME = NOME WHERE BAN_CODIGO = CODIGO;
COMMIT;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END PCR_GRAVA_BANCO;
/
Para executar:
Conexao.Execute([Ô]PCR_GRAVA_BANCO( & Val(TxtCodigo.Text) & [Ô],[ô][Ô] & Trim(TxtNomeBanco.Text) & [Ô][ô], [ô]N[ô])[Ô])
ou
Conexao.Execute([Ô]PCR_GRAVA_BANCO( & Val(TxtCodigo.Text) & [Ô],[ô][Ô] & Trim(TxtNomeBanco.Text) & [Ô][ô], [ô]A[ô])[Ô])
Amigos, nao consegui adaptar o codigo acima, esta dando erro.. estou fazendo um teste em uma tabela com dois campos, vejam o que pode estar errado.
esta dando erro no begin do insert into
DELIMITER $$
DROP PROCEDURE IF EXISTS 'sp_teste' $$
CREATE DEFINER='root'@'localhost' PROCEDURE 'sp_teste'(
IN v_opcao INT(10),
v_id int(10),
v_nome VARCHAR(45),
v_endereco VARCHAR(45)
)
IF (v_opcao = 0)
BEGIN
INSERT INTO teste
(nome, endereco)
VALUES
(v_nome,v_endereco)
ELSE
UPDATE teste SET
nome = v_nome,
endereco = v_endereco WHERE idpess=v_id;
END $$
DELIMITER ;
esta dando erro no begin do insert into
Consegui criar pessoal, ficou assim
Agora pergunto uma ultima coisinha.. rsrsrs.. como eu vou passar para storage o valor I ou A ? tentei atraves de parameter, mas logicamente como nao é um campo do banco, vai dar problema, vejam a forma que chamo a storage.
Set Cmd = New ADODB.Command
With Cmd
.ActiveConnection = Conexao
.CommandType = adCmdStoredProc
.CommandText = [Ô]sp_teste[Ô]
.Parameters.Append .CreateParameter([Ô]nome[Ô], adVarChar, adParamInput, 45, txtnome.Text)
.Parameters.Append .CreateParameter([Ô]endereco[Ô], adVarChar, adParamInput, 45, txtendereco.Text)
.Execute
Set .ActiveConnection = Nothing
End With
DELIMITER $$
DROP PROCEDURE IF EXISTS 'sp_teste' $$
CREATE DEFINER='root'@'localhost' PROCEDURE 'sp_teste'(
IN v_acao varchar(1),
v_id int(10),
v_nome VARCHAR(45),
v_endereco VARCHAR(45)
)
BEGIN
IF v_acao = [ô]I[ô] THEN
INSERT INTO teste(nome, endereco)
VALUES(v_nome, v_endereco);
COMMIT;
END IF;
IF v_acao = [ô]A[ô] THEN
UPDATE teste SET nome = v_nome WHERE id = v_id;
COMMIT;
END IF;
END $$
DELIMITER ;
Agora pergunto uma ultima coisinha.. rsrsrs.. como eu vou passar para storage o valor I ou A ? tentei atraves de parameter, mas logicamente como nao é um campo do banco, vai dar problema, vejam a forma que chamo a storage.
Set Cmd = New ADODB.Command
With Cmd
.ActiveConnection = Conexao
.CommandType = adCmdStoredProc
.CommandText = [Ô]sp_teste[Ô]
.Parameters.Append .CreateParameter([Ô]nome[Ô], adVarChar, adParamInput, 45, txtnome.Text)
.Parameters.Append .CreateParameter([Ô]endereco[Ô], adVarChar, adParamInput, 45, txtendereco.Text)
.Execute
Set .ActiveConnection = Nothing
End With
Tópico encerrado , respostas não são mais permitidas