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

(Resolvido) Problema com sintaxe SQL 5.0


Cadu0220

Pergunta

E ai pessoal, sou novo cadastrado aqui do forum mas já passei muito por aqui pra pegar umas dicas! haha

então, estou com o seguinte problemao e não consigo resolver:

eu tenho esse codigo de criação de um procedure:

CREATE PROCEDURE jclgraf_SelectRequisicao

(

IN id_requisicao int

)

BEGIN

declare trabalhos int;

declare itens int;

set @trabalhos = (SELECT COUNT(id_trabalho) FROM trabalhos WHERE id_requisicao = @id_requisicao);

set @itens = (SELECT COUNT(id_item) FROM itens WHERE id_requisicao = @id_requisicao);

SELECT R.titulo

,R.produto

,E.razao_social

,Contato.nome nome_contato

,Contato.email email_contato

,Vendedor.nome nome_vendedor

,Vendedor.email email_vendedor

,R.observacoes

,CASE R.status

WHEN 1 THEN 'Criada'

WHEN 2 THEN 'Aguardando Orçamento'

WHEN 3 THEN 'Aguardando Aprovação'

WHEN 4 THEN 'Em produção'

WHEN 5 THEN 'Finalizada'

ELSE 'Cancelada' END CASE

,R.data_cadastro

,P.id_pedido

,@trabalhos trabalhos

,@itens itens

,F.id_faturamento

,F.emissao_nota_fornecedor

,F.vencimento_nota_fornecedor

,F.numero_nota_fornecedor

,F.vencimento_nota_jcl

,F.numero_nota_jcl

,((O.bv_jcl - (O.bv_agencia + O.bv_producao)) / 100) * T.preco_total comissao

FROM requisicoes R

LEFT OUTER JOIN pedidos P ON (R.id_requisicao = P.id_requisicao)

LEFT OUTER JOIN faturamentos F ON (R.id_requisicao = F.id_requisicao)

LEFT OUTER JOIN trabalhos T ON (R.id_requisicao = T.id_requisicao AND T.status = 4)

LEFT OUTER JOIN orcamentos O ON (O.id_orcamento = T.id_orcamento)

,empresas E

,contatos Vendedor

,contatos Contato

WHERE R.id_requisicao = @id_requisicao AND

E.id_empresa = R.id_empresa AND

Contato.id_contato = R.id_contato AND

Vendedor.id_contato = R.id_vendedor;

END;

so que quando eu executo, ele joga o seguinte erro:

You have error in your SQL syntax .... near 'CASE

,R.data_cadastro

,P.id_pedido

,@trabalhos tr

e tambem tenho este caso:

CREATE PROCEDURE jclgraf_SelectToPropostaEmail

(

IN id_requisicao int, IN opcao_consulta int

)

BEGIN

IF (@opcao_consulta = 1) THEN

{

SELECT R.titulo

,R.produto

,R.observacoes

,C.email

FROM requisicoes R, contatos C

WHERE R.id_requisicao = @id_requisicao AND C.id_contato = R.id_contato;

}

ELSE IF (@opcao_consulta = 2) THEN

{

SELECT descricao

,largura_aberto

,altura_aberto

,largura_fechado

,altura_fechado

,cores_frente

,cores_verso

,substratos

,acabamentos

FROM itens

WHERE id_requisicao = @id_requisicao;

}

ELSE

{

SELECT O.quantidade

,E.razao_social

,T.id_trabalho

,T.proposta

,T.preco_unitario

,T.preco_total

FROM trabalhos T, orcamentos O, empresas E

WHERE T.id_requisicao = @id_requisicao AND T.id_orcamento = O.id_orcamento AND E.id_empresa = T.id_empresa;

}

END IF;

END;

onde ele fala que a syntax esta errado na ultima linha, a do 'END;'

alguém sabe o que pode ser esses erros, ou como eu resolvo?

muitissimo obrigado galera, abraços!

Att,

Cadu.

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

Oi, Cadu!

Para o primeiro erro, observe o que diz o manual do mysql (versão 4.1 traduzido para o português). Observe que não há end case.

O end case é usado somente na sintaxe de case dentro do controle de fluxo (de programação) em stored procedures e funções.

“6.3.1.4. Funções de Fluxo de Controle

CASE valor WHEN [valor comparado]THEN resultado [WHEN [valor comparado] THEN resultado ...] [ELSE resultado] END, CASE WHEN [condição] THEN result [WHEN [condição] THEN resultado ...] [ELSE resultado] END

A primeira expressão retorna o resultado onde valor=valor comparado. A segunda expressão retorna o o resultado da primeira condição, a qual é verdadeira. Se não existe nenhum resultado correspondente, então o resultado depois do ELSE é retornado. Se não existe parte ELSE então é retornado NULL is returned:

mysql> SELECT CASE 1 WHEN 1 THEN "um" WHEN 2 THEN "dois" ELSE "mais" END;

-> "one"

mysql> SELECT CASE WHEN 1>0 THEN "verdadeiro" ELSE "falso" END;

-> "true"

mysql> SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END;

-> NULL”

No segundo erro, você colocou {} como separador de blocos de controle, quando o correto é usar begin end. Finalizando o end com ‘;’ (ponto e vírgula).

11.1.4. BEGIN ... END Compound Statement

[begin_label:]BEGIN

statement(s)

END [end_label]

As rotinas armazenadas podem conter várias instruções, usando um instrução BEGIN ... END.

begin_label e end_label devem ser os mesmos, se ambos forem especificados.

Notem que a cláusula opcional [NOT] ATOMIC ainda não é suportada. Isto significa que nenhum savepoint de transação é definido no início do bloco da instrução e a cláusula BEGIN usada neste contexto não tem nenhum efeito no transação atual.

Várias instruções exigem que um cliente tenha permissão para enviar strings de querys contendo ‘;’. Isto é tratado no cliente mysql e linha de comando com o comando delimiter. Alterando o delimitador ‘;’ do final da consulta (por exemplo, para ‘|’) permite que ‘;’ seja usado no corpo de uma rotina.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Denis, obrigado por me ajudar!

mas mesmo com as mudanças continua dando erro,

na procedure do Case, a regiao do codigo em questao ficou assim com as mudanças:

,Vendedor.email email_vendedor

,R.observacoes

,CASE R.status

WHEN 1 THEN 'Criada'

WHEN 2 THEN 'Aguardando Orçamento'

WHEN 3 THEN 'Aguardando Aprovação'

WHEN 4 THEN 'Em produção'

WHEN 5 THEN 'Finalizada'

ELSE 'Cancelada'

,R.data_cadastro

,P.id_pedido

,@trabalhos trabalhos

so que continua dando erro, o erro agora ele fala que é "near 'R.data_cadastro, P.id_pedido, @trabalhos tra'"

e o codigo do if, eu fiz as mudanças mas mesmo assim continua dando o mesmo erro!!

o codigo ficou assim:

CREATE PROCEDURE jclgraf_SelectToPropostaEmail

(

IN id_requisicao int, IN opcao_consulta int

)

BEGIN

IF (@opcao_consulta = 1) THEN

BEGIN

SELECT R.titulo

,R.produto

,R.observacoes

,C.email

FROM requisicoes R, contatos C

WHERE R.id_requisicao = @id_requisicao AND C.id_contato = R.id_contato;

END;

ELSE IF (@opcao_consulta = 2) THEN

BEGIN

SELECT descricao

,largura_aberto

,altura_aberto

,largura_fechado

,altura_fechado

,cores_frente

,cores_verso

,substratos

,acabamentos

FROM itens

WHERE id_requisicao = @id_requisicao;

END;

ELSE

BEGIN

SELECT O.quantidade

,E.razao_social

,T.id_trabalho

,T.proposta

,T.preco_unitario

,T.preco_total

FROM trabalhos T, orcamentos O, empresas E

WHERE T.id_requisicao = @id_requisicao AND T.id_orcamento = O.id_orcamento AND E.id_empresa = T.id_empresa;

END;

END;

não sei mais o que eu faço com essas procedures, to ficando loco!!!

obrigado por tudo, abraços!

att,

Cadu.

Link para o comentário
Compartilhar em outros sites

  • 0

Cadu veja este trecho de código

CASE R.status
WHEN 1 THEN 'Criada'
WHEN 2 THEN 'Aguardando Orçamento'
WHEN 3 THEN 'Aguardando Aprovação'
WHEN 4 THEN 'Em produção'
WHEN 5 THEN 'Finalizada'
ELSE 'Cancelada'
Agora veja este:
,Vendedor.email email_vendedor
Notou o que está faltando? Já tentou colocar um ALIAS após o ELSE 'Cancelada'? No segundo erro não está faltando um END IF; após o END IF e antes do END? Tente desta forma:
CREATE PROCEDURE jclgraf_SelectToPropostaEmail (IN id_requisicao int, IN opcao_consulta int)
BEGIN
   IF (@opcao_consulta = 1) THEN
      SELECT R.titulo
         ,R.produto
         ,R.observacoes
         ,C.email 
      FROM requisicoes R, contatos C
      WHERE R.id_requisicao = @id_requisicao AND C.id_contato = R.id_contato;
   ELSE 
      IF (@opcao_consulta = 2) THEN
         SELECT descricao
            ,largura_aberto
            ,altura_aberto
            ,largura_fechado
            ,altura_fechado
            ,cores_frente
            ,cores_verso
            ,substratos
            ,acabamentos
         FROM itens
         WHERE id_requisicao = @id_requisicao;
      ELSE
         SELECT O.quantidade
            ,E.razao_social
            ,T.id_trabalho
            ,T.proposta
            ,T.preco_unitario
            ,T.preco_total
         FROM trabalhos T, orcamentos O, empresas E
         WHERE T.id_requisicao = @id_requisicao AND T.id_orcamento = O.id_orcamento AND E.id_empresa = T.id_empresa;
      END IF;
   END IF;
END;

Link para o comentário
Compartilhar em outros sites

  • 0

permitam-me um pitaco aqui...

(...) eu tenho esse codigo de criação de um procedure:

CREATE PROCEDURE jclgraf_SelectRequisicao

(

IN id_requisicao int

)

BEGIN

...

,R.observacoes

,CASE R.status

WHEN 1 THEN 'Criada'

WHEN 2 THEN 'Aguardando Orçamento'

WHEN 3 THEN 'Aguardando Aprovação'

WHEN 4 THEN 'Em produção'

WHEN 5 THEN 'Finalizada'

ELSE 'Cancelada' END CASE

,R.data_cadastro

...

END

...

Cadu0220, a mensagem: "You have error in your SQL syntax .... near 'CASE", se refere àquele CASE após o END.

mas mesmo com as mudanças continua dando erro,

na procedure do Case, a regiao do codigo em questao ficou assim com as mudanças:

,Vendedor.email email_vendedor

,R.observacoes

,CASE R.status

WHEN 1 THEN 'Criada'

WHEN 2 THEN 'Aguardando Orçamento'

WHEN 3 THEN 'Aguardando Aprovação'

WHEN 4 THEN 'Em produção'

WHEN 5 THEN 'Finalizada'

ELSE 'Cancelada'

,R.data_cadastro

,P.id_pedido

,@trabalhos trabalhos

so que continua dando erro, o erro agora ele fala que é "near 'R.data_cadastro, P.id_pedido, @trabalhos tra'"

aqui, você retirou tudo, motivo da nova mensagem de erro.

Você deve manter apenas o END. A sintax seria, grosseiramente:

CASE <campo> 
  WHEN <valor> THEN <resultado>
   ...
  WHEN <valor> THEN <resultado>
  ELSE  <resultado>
END [AS <nome_coluna>]

Voce pode usar o alias como sugeriu o colega Denis Courcy, pois dará um nome legível e mais significativo a coluna criada com o uso do case.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

E ai pessoal, obrgiado mesmo pela ajuda!

e funcionou!!!

a do if-then-else funcionou perfeitamente, agora, a do case continua dando o MESMO erro!!!!!

o codigo ficou assim:

CREATE PROCEDURE jclgraf_SelectRequisicao

(

IN id_requisicao int

)

BEGIN

declare trabalhos int;

declare itens int;

set @trabalhos = (SELECT COUNT(id_trabalho) FROM trabalhos WHERE id_requisicao = @id_requisicao);

set @itens = (SELECT COUNT(id_item) FROM itens WHERE id_requisicao = @id_requisicao);

SELECT R.titulo

,R.produto

,E.razao_social

,Contato.nome nome_contato

,Contato.email email_contato

,Vendedor.nome nome_vendedor

,Vendedor.email email_vendedor

,R.observacoes

,CASE R.status

WHEN 1 THEN 'Criada'

WHEN 2 THEN 'Aguardando Orçamento'

WHEN 3 THEN 'Aguardando Aprovação'

WHEN 4 THEN 'Em produção'

WHEN 5 THEN 'Finalizada'

ELSE 'Cancelada' END

,R.data_cadastro

,P.id_pedido

,@trabalhos trabalhos

,@itens itens

,F.id_faturamento

,F.emissao_nota_fornecedor

,F.vencimento_nota_fornecedor

,F.numero_nota_fornecedor

,F.vencimento_nota_jcl

,F.numero_nota_jcl

,((O.bv_jcl - (O.bv_agencia + O.bv_producao)) / 100) * T.preco_total comissao

FROM requisicoes R

LEFT OUTER JOIN pedidos P ON (R.id_requisicao = P.id_requisicao)

LEFT OUTER JOIN faturamentos F ON (R.id_requisicao = F.id_requisicao)

LEFT OUTER JOIN trabalhos T ON (R.id_requisicao = T.id_requisicao AND T.status = 4)

LEFT OUTER JOIN orcamentos O ON (O.id_orcamento = T.id_orcamento)

,empresas E

,contatos Vendedor

,contatos Contato

WHERE R.id_requisicao = @id_requisicao AND

E.id_empresa = R.id_empresa AND

Contato.id_contato = R.id_contato AND

Vendedor.id_contato = R.id_vendedor;

END;

e o erro continua sendo o mesmo, o que sera que é??? eu já tentei de tudo mesmo!!!

abraços e muito obrigado mesmo pelas ajudas, e pode ter crtz que eu usarei e ajudarei os otros como eu estou sendo bem ajudado aqui no forum, obrigado pessoal!

abraços, Cadu.

Link para o comentário
Compartilhar em outros sites

  • 0

esse problema continua dando mesmo se eu uso Decode, não funciona tambem!!

isso que eu to axando estranho, não consigo de jeito nenhum fazer funcionar isso, e se eu tiro essa coluna do case funciona perfeitamente a procedure <_<

obg pela ajuda pessoal!

abraços!!!

Link para o comentário
Compartilhar em outros sites

  • 0
(...), agora, a do case continua dando o MESMO erro!!!!!

...

e o erro continua sendo o mesmo, o que sera que é??? eu já tentei de tudo mesmo!!!

Cadu0220, parece estranho mesmo.

Utilizando o MySQL Query Browser e MySQL v. 5.1.22, eu executo uma consulta fazendo uso de CASE sem qualquer problema.

Qual a mensagem que você recebe agora, que não tem o END CASE (no 1º erro) e que colocou o END (do case, 2º erro) ?

Abraços

post-12746-1204614682_thumb.png

Link para o comentário
Compartilhar em outros sites

  • 0
O erro que ele fala é: syntax error near 'R.data_cadastro, P.id_pedido, @trabalhos tra'

tambem to achando muito estranho, de jeito nenhum funciona isso :(

Experimentou a outra sintax:

CASE 
WHEN R.status = 1 THEN 'Criada'
WHEN R.status = 2 THEN 'Aguardando Orçamento'
WHEN R.status = 3 THEN 'Aguardando Aprovação'
WHEN R.status = 4 THEN 'Em produção'
WHEN R.status = 5 THEN 'Finalizada'
ELSE 'Cancelada' END

Link para o comentário
Compartilhar em outros sites

  • 0

dessa forma o front não deixa eu criar a procedure, o botao de OK fica desativado como se faltasse alguma coisa na procedure :mellow:

o codigo fica assim desse jeito que você me falou:

CREATE PROCEDURE jclgraf_SelectRequisicao

(

IN id_requisicao int

)

BEGIN

declare trabalhos int;

declare itens int;

set @trabalhos = (SELECT COUNT(id_trabalho) FROM trabalhos WHERE id_requisicao = @id_requisicao);

set @itens = (SELECT COUNT(id_item) FROM itens WHERE id_requisicao = @id_requisicao);

SELECT R.titulo

,R.produto

,E.razao_social

,Contato.nome nome_contato

,Contato.email email_contato

,Vendedor.nome nome_vendedor

,Vendedor.email email_vendedor

,R.observacoes

,CASE

WHEN R.status = 1 THEN 'Criada'

WHEN R.status = 2 THEN 'Aguardando Orçamento'

WHEN R.status = 3 THEN 'Aguardando Aprovação'

WHEN R.status = 4 THEN 'Em produção'

WHEN R.status = 5 THEN 'Finalizada'

ELSE 'Cancelada' END

,R.data_cadastro

,P.id_pedido

,@trabalhos trabalhos

,@itens itens

,F.id_faturamento

,F.emissao_nota_fornecedor

,F.vencimento_nota_fornecedor

,F.numero_nota_fornecedor

,F.vencimento_nota_jcl

,F.numero_nota_jcl

,((O.bv_jcl - (O.bv_agencia + O.bv_producao)) / 100) * T.preco_total comissao

FROM requisicoes R

LEFT OUTER JOIN pedidos P ON (R.id_requisicao = P.id_requisicao)

LEFT OUTER JOIN faturamentos F ON (R.id_requisicao = F.id_requisicao)

LEFT OUTER JOIN trabalhos T ON (R.id_requisicao = T.id_requisicao AND T.status = 4)

LEFT OUTER JOIN orcamentos O ON (O.id_orcamento = T.id_orcamento)

,empresas E

,contatos Vendedor

,contatos Contato

WHERE R.id_requisicao = @id_requisicao AND

E.id_empresa = R.id_empresa AND

Contato.id_contato = R.id_contato AND

Vendedor.id_contato = R.id_vendedor;

END;

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, Cadu0220!

Vamos resolver isso desta forma:

CREATE PROCEDURE jclgraf_SelectRequisicao
(
    IN id_requisicao int
)
BEGIN

declare trabalhos int;
declare itens int;

set @trabalhos = (SELECT COUNT(id_trabalho) FROM trabalhos WHERE id_requisicao = @id_requisicao);
set @itens = (SELECT COUNT(id_item) FROM itens WHERE id_requisicao = @id_requisicao);

SELECT R.titulo
      ,R.produto
      ,E.razao_social
      ,Contato.nome nome_contato
      ,Contato.email email_contato
      ,Vendedor.nome nome_vendedor
      ,Vendedor.email email_vendedor
      ,R.observacoes
      ,IF(R.status = 1, 'Criada', 
          IF(R.status = 2, 'Aguardando Orçamento', 
             IF(R.status = 3, 'Aguardando Aprovação', 
                IF(R.status = 4, 'Em produção', 
                   IF(R.status = 5 THEN 'Finalizada', 'Cancelada'))))) AS Status
      ,R.data_cadastro
      ,P.id_pedido
      ,@trabalhos trabalhos
      ,@itens itens
      ,F.id_faturamento
      ,F.emissao_nota_fornecedor
      ,F.vencimento_nota_fornecedor
      ,F.numero_nota_fornecedor
      ,F.vencimento_nota_jcl
      ,F.numero_nota_jcl
      ,((O.bv_jcl - (O.bv_agencia + O.bv_producao)) / 100) * T.preco_total comissao

  FROM requisicoes R 
            LEFT OUTER JOIN pedidos P ON (R.id_requisicao = P.id_requisicao)
            LEFT OUTER JOIN faturamentos F ON (R.id_requisicao = F.id_requisicao)
            LEFT OUTER JOIN trabalhos T ON (R.id_requisicao = T.id_requisicao AND T.status = 4)
            LEFT OUTER JOIN orcamentos O ON (O.id_orcamento = T.id_orcamento)
        ,empresas E
        ,contatos Vendedor
        ,contatos Contato

WHERE R.id_requisicao = @id_requisicao AND 
      E.id_empresa = R.id_empresa AND 
      Contato.id_contato = R.id_contato AND 
      Vendedor.id_contato = R.id_vendedor;
END;
Instrução IF utilizadas em cláusulas SELECT conforme capítulo 6 do manual do MySQL versão 4.1 tradução em português 6.3.1.4. Funções de Fluxo de Controle
mysql> SELECT IF(1>2,2,3);
-> 3
mysql> SELECT IF(1<2,'sim','não');
-> 'sim'
mysql> SELECT IF(STRCMP('teste','teste1'),'não','sim');
-> 'não'

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,8k
×
×
  • Criar Novo...