GARANTIR DESCONTO

Fórum Stored Procedure no MySQL com erro #517818

25/04/2015

0

Feras, tenho esse script e está dando erro. O que pode ser? Estou rodando no MySQL

USE bancovendas
CREATE PROCEDURE PROC_VERIFICA_ACESSO_MENU (
CODUSUARIO INTEGER, CODMENU INTEGER)
RETURNS (CONSULTAR CHAR(1))
AS
DECLARE VARIABLE GU_CONSULTAR CHAR(1);
BEGIN
CONSULTAR = 'N';
FOR SELECT PU_CONSULTAR FROM PERMISSOES_USUARIOS WHERE USU_CODIGO = :CODUSUARIO AND MEN_CODIGO = :CODMENU
UNION
SELECT PG_CONSULTAR FROM PERMISSOES_GRUPOS WHERE GRU_CODIGO IN (SELECT GRU_CODIGO FROM GRUPOS_USUARIOS WHERE USU_CODIGO = :CODUSUARIO) AND MEN_CODIGO = :CODMENU
INTO :GU_CONSULTAR
DO
BEGIN
IF (:GU_CONSULTAR = 'S') THEN
BEGIN
CONSULTAR = 'S';
EXIT;
END
END
END

Erro ao executar:
1 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(CONSULTAR CHAR(1))
AS
DECLARE VARIABLE GU_CONSULTAR CHAR(1)' at line 2 SQL.sql 4 1
Frederico Brigatte***

Frederico Brigatte***

Responder

Posts

30/04/2015

Marisiana Battistella

Já conseguistes encontrar a solução?
O problema está na variável GU_CONSULTAR, quando vc utiliza ela no corpo da procedure, vc inclui dois pontos...
Eu acho que nesse caso é sem os dois pontos.
Responder

Gostei + 0

30/04/2015

Marisiana Battistella

Esse artigo possui uma explicação detalhada: Stored Procedures no MySQL
Responder

Gostei + 0

30/04/2015

Marcos P

Com esse link da Marisiana, fica fácil compreender a estrutura de uma stored procedure no MySql.

Sobre a query original...

1. Não existe declaração de RETURNS no escopo da procedure ( isso somente serve se você estiver criando uma FUNCTION )
2. DECLARE, deve estar contido ENTRE o begin e o end ( do corpo da procedure )
3. GU_CONSULTAR é variável local. Nesse caso,não é necessário colocar ":" antes de utilizá-la.
4. GU_CONSULTAR vai receber o resultado do UNION de dois selects, ou seja, possivelmente múltiplos registros. Tentar armazenar essas linhas em uma variável declarada como Char(1), não parece muito correto...
Responder

Gostei + 0

30/04/2015

Marisiana Battistella

Obrigada por contribuir Marcos!
Percebi que a sintaxe no MySQL é um pouco diferente do Oracle, então não dei muitos palpites... =D
Responder

Gostei + 0

30/04/2015

Frederico Brigatte***

Ainda não consegui resolver o problema. Esse link postado já verifiquei. Consegui fazer algumas modificações, mas parece que está num loop e não sai. Está assim:

Essa é uma

PROCEDURE bancovendas.PROC_VERIFICA_ACESSO_MENU(IN CODUSUARIO INTEGER, IN CODMENU INTEGER, OUT CONSULTAR CHAR(1))
BEGIN 
  DECLARE GU_CONSULTAR CHAR(1); 
  SET CONSULTAR = 'N';
Loop_Label:  LOOP SELECT PU_CONSULTAR FROM PERMISSOES_USUARIOS
    WHERE USU_CODIGO = CODUSUARIO AND
    MEN_CODIGO = CODMENU
  UNION
  SELECT PG_CONSULTAR FROM PERMISSOES_GRUPOS
    WHERE GRU_CODIGO IN (
    SELECT GRU_CODIGO FROM GRUPOS_USUARIOS
    WHERE USU_CODIGO = CODUSUARIO) AND
    MEN_CODIGO = CODMENU
  INTO GU_CONSULTAR;
  /*DO
  BEGIN*/
    IF (GU_CONSULTAR = 'S') THEN
    /*BEGIN*/
     SET CONSULTAR = 'S';
     LEAVE Loop_Label;
    END IF;
  END LOOP Loop_Label;
END


Essa é outra:

PROCEDURE bancovendas.PROC_VERIFICA_DIREITOS_ACESSO(IN CODUSUARIO INTEGER, IN CODMENU INTEGER, OUT NOVO CHAR(1), OUT ALTERAR CHAR(1), OUT APAGAR CHAR(1))
BEGIN
DECLARE ADM CHAR(1);
DECLARE GU_NOVO CHAR(1);
DECLARE GU_ALTERAR CHAR(1);
DECLARE GU_APAGAR CHAR(1);
/*BEGIN*/
  SET NOVO = 'N'; 
  SET ALTERAR = 'N'; 
  SET APAGAR = 'N';
  SELECT USU_ADMIN FROM USUARIOS
    WHERE USU_CODIGO = CODUSUARIO
  INTO ADM;
  IF (ADM = 'S') THEN
    /*BEGIN*/
    SET NOVO = 'S';
    SET ALTERAR = 'S';
    SET APAGAR = 'S';
    /*EXIT;*/
  END IF; /*IF*/
 
Loop_Label:  LOOP SELECT PU_NOVO, PU_ALTERAR, PU_APAGAR
    FROM PERMISSOES_USUARIOS
    WHERE USU_CODIGO = CODUSUARIO AND
    MEN_CODIGO = CODMENU
  UNION
  SELECT PG_NOVO, PG_ALTERAR, PG_APAGAR
    FROM PERMISSOES_GRUPOS
    WHERE GRU_CODIGO IN (SELECT GRU_CODIGO
    FROM GRUPOS_USUARIOS
    WHERE USU_CODIGO = CODUSUARIO) AND
    MEN_CODIGO = CODMENU
  INTO GU_NOVO, GU_ALTERAR, GU_APAGAR;
  /*DO
  BEGIN*/
    IF (GU_NOVO = 'S') THEN
      SET NOVO = 'S';
    END IF;
    IF (GU_ALTERAR = 'S') THEN
      SET ALTERAR = 'S';
    END IF;
    IF (GU_APAGAR = 'S') THEN
      SET APAGAR = 'S';
    END IF;
  END LOOP Loop_Label;
END
Responder

Gostei + 0

01/05/2015

Marisiana Battistella

Qual é o erro que estão ocorrendo agora?
Responder

Gostei + 0

02/05/2015

Frederico Brigatte***

Nao da erro. Ele trava.
Responder

Gostei + 0

02/05/2015

Marcos P

Frederico,

Foi você que desenvolveu essas procedures ?

Qual o objetivo e a lógica de cada uma dessas procedures ?
Responder

Gostei + 0

02/05/2015

Frederico Brigatte***

https://www.devmedia.com.br/artigo-clube-delphi-76-controle-de-acesso/11344

Foi tirado desse artigo. É pra Interbase. Estou tentando modificar para MySql.
Responder

Gostei + 0

02/05/2015

Frederico Brigatte***

Poderia me dar uma ajuda para solucionar isso?
Responder

Gostei + 0

02/05/2015

Jothaz

Se quer realmente ajuda precisa ser mais claro na elaboração do post.

Tente responder as questões abaixo:

1 - Você postou duas SP, para qual você precisa de ajuda?

2 - Qual a estrutura da sua tabela? Se possível post o conteúdo da sua tabela!

3 - Pelo que entendi é um controle de permissão? É isso?

4 - Você disse que parece estar em loop. O que porque do uso do loop?

5 - Já tentou retirar o loop e testar o que acontece?

6 - Não vi o "return" da SP, o que você pretende retornar?

7 - Você esta fazendo a seguinte operação:
    IF (GU_NOVO = 'S') THEN
      SET NOVO = 'S';


Qual o motivo disso? É muito mais simples retornar um select com "GU_NOVO" (pois ele já contém 'S') e tratar na aplicação.
Responder

Gostei + 0

03/05/2015

Frederico Brigatte***

Ké um controle de permissão. No artigo é para INTERBASE. Como converter essas duas SPs para o mysql?. Do jeito que esta ai, não apresenta erro. Fica travado. Eu postei o link que estou fazendo como referencia. Lá tem tudo, script tabela, stored procedure, mas é para Inter base. Gostaria de saber o que esta errado ai e como seria o correto, não sei como faz isso.
Responder

Gostei + 0

03/05/2015

Frederico Brigatte***

Ké um controle de permissão. No artigo é para INTERBASE. Como converter essas duas SPs para o mysql?. Do jeito que esta ai, não apresenta erro. Fica travado. Eu postei o link que estou fazendo como referencia. Lá tem tudo, script tabela, stored procedure, mas é para Inter base. Gostaria de saber o que esta errado ai e como seria o correto, não sei como faz isso.
Responder

Gostei + 0

03/05/2015

Marisiana Battistella

Você tem que procurar entender a lógica dela, o que ela faz... Depois disso, você recreia ela de acordo com a sintaxe do MySQL.
Responder

Gostei + 0

04/05/2015

William

Só dei uma lida por cima, mas senão dá erro e trava então tem grandes chances de estar ficando preso no loop, você já tentou executar somente essa instrução SQL para ver quantos registros ela retorna ou qual tempo de processamento dela:

SELECT PU_CONSULTAR FROM PERMISSOES_USUARIOS
    WHERE USU_CODIGO = CODUSUARIO AND
    MEN_CODIGO = CODMENU
  UNION
  SELECT PG_CONSULTAR FROM PERMISSOES_GRUPOS
    WHERE GRU_CODIGO IN (
    SELECT GRU_CODIGO FROM GRUPOS_USUARIOS
    WHERE USU_CODIGO = CODUSUARIO) AND
    MEN_CODIGO = CODMENU
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar