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

Dúvida procedure


Felipe - Iniciante-Delphi

Pergunta

Fulvio, se for voce que le esse tópico, essa procedure nova eu to montando na mesma logica da ultima que você havia me ensinado, ok ?

Bom, primeiramente, segue ela :

CREATE PROCEDURE SP_INSEREDADOS_1

-- DECLARAÇÃO DAS VARIAVEIS

@CODIGO int = null,

@NOME varchar(200),

@EMAIL varchar(200),

@RG varchar(9),

@TELEFONE numeric(14),

@TIPO numeric(1),

@CPF integer,

@NASCIMENTO numeric(11),

@SEXO char(1),

@PROFISSAO varchar(200),

@CNPJ numeric(14),

@NOMEEMP varchar(200),

@INSCRICAO varchar(30),

@ORDEM char(1)

AS

IF (@ORDEM) = 'i' -- insere registros nas tabelas.

BEGIN

IF EXISTS (SELECT DS_RG FROM TB_CADASTROP WHERE DS_RG = @RG)

BEGIN

SELECT 'RG já CONSTA NO CADASTRO, NÃO PODENDO SER DUPLICADO'

RETURN

END

ELSE

BEGIN

BEGIN TRANSACTION

INSERT INTO TB_CADASTROP (DS_NOME, DS_EMAIL, DS_RG, NR_TELEFONE, DS_TIPO) VALUES (@NOME, @EMAIL, @RG, @TELEFONE, @TIPO)

IF ( SELECT DS_TIPO = 1)

BEGIN

SET @CODIGO = (SELECT MAX(CD_PESSOA) FROM TB_PESSOAP)

INSERT INTO TB_PESSOAF (CD_PESSOA, NR_CPF, DT_NASCIMENTO, TP_SEXO, TP_PROFISSAO) VALUES (@CODIGO, @CPF, @NASCIMENTO, @SEXO, @PROFISSAO)

END

ELSE

BEGIN

SET @CODIGO = (SELECT MAX(CD_PESSOA) FROM TB_PESSOAP)

INSERT INTO TB_PESSOAJ (CD_PESSOA, NR_CNPJ, DS_NOME_EMP, DS_INSCRICAO_EST) VALUES (@CODIGO, @CNPJ, @NOMEEMP, @INSCRICAO)

END

COMMIT TRANSACTION

END

END

O problema agora é o seguinte, ela vai inserir em 2 tabelas, primeiro ela insere na TB_PESSOAP onde insere os dados normais com o campo CD_PESSOA identity.

Segundo, ela verifica se o campo (DS_TIPO_PESSOA) é igual a ' 1 ' ou ' 2 ' ( ele passa por uma constraint check que só permite esses dois valores) se for igual a 1 , ela vai inserir na tabela TB_PESSOAF, se for igual a 2 ela insere na TB_PESSOAJ.

Mas quando eu vo compilar isso, ele me retorna dois erros := 'Incorrect sintax near BEGIN' e o outro 'Incorrect sintax near ELSE' .

Eu ainda me perco um pouco com Begin´s e End´s .

Sera que alguém pode falar para mim onde eu estou errando ?? Creio que a logica que esta feira esteja certa, só me falta arrumas esses ' INCORRECTS' mesmo. HAHAHA

Obrigado galera. =]

Abraços ;

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Boa tarde Felipe. Pensei q não tinha mais nenhuma dúvidas!!! rs....

Como você recupera o campo DS_TIPO_PESSOA? Achei meio estranho a estrutura “IF ( SELECT DS_TIPO = 1)”. O problema está exatamente nesta estrutura. Na cláusula IF, você tem q comparar uma coisa com outra. Neste IF, você não realiza esta comparação.

Alterei o seu script, alterando o inicio da transação. Depois apenas texto se deu erro. Caso negativo, “comito”.

No script coloquei onde está o problema. Ai você altera aí!!! :.)

Qualquer problema, posta ai...

CREATE PROCEDURE SP_INSEREDADOS_1

-- DECLARAÇÃO DAS VARIAVEIS

@CODIGO int = null,

@NOME varchar(200),

@EMAIL varchar(200),

@RG varchar(9),

@TELEFONE numeric(14),

@TIPO numeric(1),

@CPF integer,

@NASCIMENTO numeric(11),

@SEXO char(1),

@PROFISSAO varchar(200),

@CNPJ numeric(14),

@NOMEEMP varchar(200),

@INSCRICAO varchar(30),

@ORDEM char(1)

AS

IF (@ORDEM) = 'i' -- insere registros nas tabelas.

BEGIN

IF EXISTS (SELECT DS_RG FROM TB_CADASTROP WHERE DS_RG = @RG)

BEGIN

SELECT 'RG já CONSTA NO CADASTRO, NÃO PODENDO SER DUPLICADO'

RETURN

END

END

ELSE

BEGIN TRAN

BEGIN

INSERT INTO TB_CADASTROP (DS_NOME, DS_EMAIL, DS_RG, NR_TELEFONE, DS_TIPO) VALUES (@NOME, @EMAIL, @RG, @TELEFONE, @TIPO)

IF ( SELECT DS_TIPO = 1) = 1 -- aqui você deve fazer a comparação, ok? Mas se você deixar o select assim, o resultado sempre será positivo, pois o resultado do select será sempre 1. Muda ai.

BEGIN

SET @CODIGO = (SELECT MAX(CD_PESSOA) FROM TB_PESSOAP)

INSERT INTO TB_PESSOAF (CD_PESSOA, NR_CPF, DT_NASCIMENTO, TP_SEXO, TP_PROFISSAO) VALUES (@CODIGO, @CPF, @NASCIMENTO, @SEXO, @PROFISSAO)

END

ELSE

BEGIN

SET @CODIGO = (SELECT MAX(CD_PESSOA) FROM TB_PESSOAP)

INSERT INTO TB_PESSOAJ (CD_PESSOA, NR_CNPJ, DS_NOME_EMP, DS_INSCRICAO_EST) VALUES (@CODIGO, @CNPJ, @NOMEEMP, @INSCRICAO)

END

END

IF @@ERROR > 0

BEGIN

ROLLBACK TRAN

RETURN

END

Link para o comentário
Compartilhar em outros sites

  • 0

HAHAHAHA. NÃO TENHO MAIS DUVIDAS QUANTO A INSERIR EM 2 TABELAS, MAS AGORA A DUVIDA É PARA INSERIR EM 3.

HAHAHAHAHA'

Bom, eu tentei entender o que você me explicou, mas como você já percebeu, eu sou meio lerdo. hahaha'

mas assim, eu fiz a tal comparação, não sei se foi isso que você quis dizer, até por que deu o mesmo erro de antes. ( axo que meu negocio é administrar banco mesmo ) HUAHAUA

mas vamos com calma que eu aprendo como aprendi o outro.

Segue o script com a comparação. :

CREATE PROCEDURE SP_INSEREDADOS_1

-- DECLARAÇÃO DAS VARIAVEIS

@CODIGO int = null,

@NOME varchar(200),

@EMAIL varchar(200),

@RG varchar(9),

@TELEFONE numeric(14),

@TIPO numeric(1),

@CPF integer,

@NASCIMENTO numeric(11),

@SEXO char(1),

@PROFISSAO varchar(200),

@CNPJ numeric(14),

@NOMEEMP varchar(200),

@INSCRICAO varchar(30),

@ORDEM char(1)

AS

IF (@ORDEM) = 'i' -- insere registros nas tabelas.

BEGIN

IF EXISTS (SELECT DS_RG FROM TB_CADASTROP WHERE DS_RG = @RG)

BEGIN

SELECT 'RG já CONSTA NO CADASTRO, NÃO PODENDO SER DUPLICADO'

RETURN

END

ELSE

BEGIN

BEGIN TRANSACTION

INSERT INTO TB_CADASTROP (DS_NOME, DS_EMAIL, DS_RG, NR_TELEFONE, DS_TIPO) VALUES (@NOME, @EMAIL, @RG, @TELEFONE, @TIPO)

IF ( SELECT DS_TIPO FROM TB_CADASTROP WHERE DS_TIPO = 1) BEGIN

SET @CODIGO = (SELECT MAX(CD_PESSOA) FROM TB_CADASTROF)

INSERT INTO TB_PESSOAF (CD_PESSOA, NR_CPF, DT_NASCIMENTO, TP_SEXO, TP_PROFISSAO) VALUES (@CODIGO, @CPF, @NASCIMENTO, @SEXO, @PROFISSAO)

END

ELSE

BEGIN

SET @CODIGO = (SELECT MAX(CD_PESSOA) FROM TB_CADASTROJ)

INSERT INTO TB_PESSOAJ (CD_PESSOA, NR_CNPJ, DS_NOME_EMP, DS_INSCRICAO_EST) VALUES (@CODIGO, @CNPJ, @NOMEEMP, @INSCRICAO)

END

COMMIT TRANSACTION

END

END

Eu so queria dizer que se o rapaz digitar um la no tipo_pessoa 1, o cadastro sera efetuado no cadastrof, else, no cadastroj

=]

Obrigado fulvio,

Até mais,

Link para o comentário
Compartilhar em outros sites

  • 0

Rs... Fala Felipe!!

O erro continua, porque você não o corrigiu!!! Hehehe.

No IF q você refez:

IF ( SELECT DS_TIPO FROM TB_CADASTROP WHERE DS_TIPO = 1) BEGIN

- O resultado do select tem q retornar apenas um valor (senão vai dar erro).

- você tem q pegar o valor q o rapaz digitou. No select você terá q resgatar o número q foi digitado.

- Depois q fechar o parêntese você faz a comparação.

Ex:

IF ( SELECT DS_TIPO FROM TB_CADASTROP WHERE codigo=@codigo) = 1 BEGIN

Altera na sua estrutura.

DE:

......

INSERT INTO TB_CADASTROP (DS_NOME, DS_EMAIL, DS_RG, NR_TELEFONE, DS_TIPO) VALUES (@NOME, @EMAIL, @RG, @TELEFONE, @TIPO)

IF ( SELECT DS_TIPO FROM TB_CADASTROP WHERE DS_TIPO = 1) BEGIN

SET @CODIGO = (SELECT MAX(CD_PESSOA) FROM TB_CADASTROF)

INSERT INTO TB_PESSOAF (CD_PESSOA, NR_CPF, DT_NASCIMENTO, TP_SEXO, TP_PROFISSAO) VALUES (@CODIGO, @CPF, @NASCIMENTO, @SEXO, @PROFISSAO)

......

PARA:

......

INSERT INTO TB_CADASTROP (DS_NOME, DS_EMAIL, DS_RG, NR_TELEFONE, DS_TIPO) VALUES (@NOME, @EMAIL, @RG, @TELEFONE, @TIPO)

SET @CODIGO = (SELECT MAX(CD_PESSOA) FROM TB_CADASTROF)

IF ( SELECT DS_TIPO FROM TB_CADASTROP WHERE CD_PESSOA = @CODIGO) = 1 BEGIN

INSERT INTO TB_PESSOAF (CD_PESSOA, NR_CPF, DT_NASCIMENTO, TP_SEXO, TP_PROFISSAO) VALUES (@CODIGO, @CPF, @NASCIMENTO, @SEXO, @PROFISSAO)

......

Qualquer problema, posta ai... :.)

Link para o comentário
Compartilhar em outros sites

  • 0

ALTER PROCEDURE SP_INSEREDADOS_1

-- DECLARAÇÃO DAS VARIAVEIS

@CODIGO int = null,

@NOME varchar(200),

@EMAIL varchar(200),

@RG varchar(9),

@TELEFONE numeric(14),

@TIPO numeric(1),

@CPF numeric(11),

@NASCIMENTO Datetime,

@SEXO char(1),

@PROFISSAO varchar(200),

@CNPJ numeric(14),

@NOMEEMP varchar(200),

@INSCRICAO varchar(30),

@ORDEM char(1)

AS

IF (@ORDEM) = 'i' -- insere registros nas tabelas.

BEGIN

IF EXISTS (SELECT DS_RG FROM TB_CADASTROP WHERE DS_RG = @RG)

BEGIN

SELECT 'RG já CONSTA NO CADASTRO, NÃO PODENDO SER DUPLICADO'

RETURN

END

ELSE

BEGIN

BEGIN TRANSACTION

INSERT INTO TB_CADASTROP (DS_NOME, DS_EMAIL, DS_RG, NR_TELEFONE, DS_TIPO) VALUES (@NOME, @EMAIL, @RG, @TELEFONE, @TIPO)

SET @CODIGO = (SELECT MAX(CD_PESSOA) FROM TB_CADASTROF)

IF ( SELECT DS_TIPO FROM TB_CADASTROP WHERE CD_PESSOA = @CODIGO) = 1

BEGIN

INSERT INTO TB_PESSOAF (CD_PESSOA, NR_CPF, DT_NASCIMENTO, TP_SEXO, TP_PROFISSAO) VALUES (@CODIGO, @CPF, @NASCIMENTO, @SEXO, @PROFISSAO)

END

ELSE

BEGIN

SET @CODIGO = (SELECT MAX(CD_PESSOA) FROM TB_CADASTROPJ)

INSERT INTO TB_PESSOAPJ (CD_PESSOA, NR_CNPJ, DS_NOME_EMP, DS_INSCRICAO_EST) VALUES (@CODIGO, @CNPJ, @NOMEEMP, @INSCRICAO)

END

END

END

IF @@ERROR > 0

BEGIN

ROLLBACK TRAN

RETURN

END

GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

Bom, agora compilo tudo numa boa, mas um fato que achei gozado foi que, quando eu chamo a procedure e a executo, o meu Toad For Sql Trava =s

Creio que ainda tenha um erro. Só que como compilo tudo numa boa, fica a duvida se realmente existe ou se sou eu que estou chamando errado.

EXEC SP_INSEREDADOS_1

@NOME = 'felipe',

@EMAIL = 'fe.fe.fe@fe.com.fe',

@RG = '345896526' ,

@TELEFONE = 5584123,

@TIPO = 1,

@CPF = 58966354689,

@NASCIMENTO = '05/05/05',

@SEXO = 'm',

@PROFISSAO = 'lixeiro',

@CNPJ = null,

@NOMEEMP = null,

@INSCRICAO = null,

@ORDEM = 'i'

=) eitaaaa , uma hora vai. hahaha

até mais..

Link para o comentário
Compartilhar em outros sites

  • 0

É Felipe... o bom q estas coisas fazem a gente pensar. Assim q se aprende e nunca mais esquece!!! rs...

Desta vez, a culpa foi minha. Desculpa. :.(

Quando te passei o script de teste de erro:

IF @@ERROR > 0

BEGIN

ROLLBACK TRAN

RETURN

END

O problema q esqueci de colocar a hora de "comitar" o processo:

IF @@ERROR > 0

BEGIN

ROLLBACK TRAN

RETURN

END

ELSE

COMMIT TRAN

Publica aí e vê se roda. Qualquer coisa, estamos ai...

Agora vai

\o/

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia Felipe.

Não sei se você conhece a funcionalidade try-catch... o sql também a possui. Caso queira fazer um tratamento de erro, pode utilizar esta funcionalidade.

No caso dos campos NR_CPF e NR_CNPJ que são unique, você terá q verificar se já estão inseridos.

O interessante seria você deixar estas verificações para o aplicativo fazer. Ai você terá q levar em consideração a quantidade de acessos q fará na base. Caso fique muito grande, faça uma função (ou procedure) que realize todos as verificações possíveis. Caso a função (ou procedure) retorne OK, você chama a procedure de inserção dos dados.

Espero ter ajudado... :.)

Qualquer dúvida q tiver, pode postar ai.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...