Fórum Stored Procedure no MySQL com erro #517818
25/04/2015
0
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***
Curtir tópico
+ 0Posts
30/04/2015
Marisiana Battistella
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.
Gostei + 0
30/04/2015
Marisiana Battistella
Gostei + 0
30/04/2015
Marcos P
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...
Gostei + 0
30/04/2015
Marisiana Battistella
Percebi que a sintaxe no MySQL é um pouco diferente do Oracle, então não dei muitos palpites... =D
Gostei + 0
30/04/2015
Frederico Brigatte***
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
Gostei + 0
01/05/2015
Marisiana Battistella
Gostei + 0
02/05/2015
Frederico Brigatte***
Gostei + 0
02/05/2015
Marcos P
Foi você que desenvolveu essas procedures ?
Qual o objetivo e a lógica de cada uma dessas procedures ?
Gostei + 0
02/05/2015
Frederico Brigatte***
Foi tirado desse artigo. É pra Interbase. Estou tentando modificar para MySql.
Gostei + 0
02/05/2015
Frederico Brigatte***
Gostei + 0
02/05/2015
Jothaz
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.
Gostei + 0
03/05/2015
Frederico Brigatte***
Gostei + 0
03/05/2015
Frederico Brigatte***
Gostei + 0
03/05/2015
Marisiana Battistella
Gostei + 0
04/05/2015
William
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)