procedure no MySql
Estou precisando criar uma procedure no mysql onde passo alguns parametros e me retorna alguns campos....
por exemplo tenho a tabela faturas com os campos a,b,c,d,e.
no parametro de entrada iriei passar os valores de a,b,c,d,e para a consulta....e então tenho que realizar uma consulta(select) colocando o campo a,b,c na clausula dessa consulta, caso a consulta tenha retorno então iriei retornar os campos a,b,c,d,e,f,g,h.
mas caso essa consulta não retorne nada irei pesquisar pela proxima condição sendo por b,c,d caso tenha retorna, caso não passo para a,c,d....e assim vai....
Como posso montar essa procedure ?
por exemplo tenho a tabela faturas com os campos a,b,c,d,e.
no parametro de entrada iriei passar os valores de a,b,c,d,e para a consulta....e então tenho que realizar uma consulta(select) colocando o campo a,b,c na clausula dessa consulta, caso a consulta tenha retorno então iriei retornar os campos a,b,c,d,e,f,g,h.
mas caso essa consulta não retorne nada irei pesquisar pela proxima condição sendo por b,c,d caso tenha retorna, caso não passo para a,c,d....e assim vai....
Como posso montar essa procedure ?
Robson Morais
Curtidas 0
Respostas
Marisiana Battistella
22/07/2014
Bom dia!
Vc já criou alguma estrutura?
Poderia postar pra vermos como vc está fazendo?
Vc já criou alguma estrutura?
Poderia postar pra vermos como vc está fazendo?
GOSTEI 0
Robson Morais
22/07/2014
tenho sim...
tabela fcr_compvendas
campos nsu, autorizacao, datavenda, datavencimento e parcela
então quero assim...
select * from fcr_compvendas where parcela = p_parcela and nsu = p_nsu and autorizacao = p_autorizacao
p_parcela, p_nsu e p_autorizacao seria os parametros....
caso não tenho nada de retorno nessa pesquisa terei que fazer outra....
select * from fcr_compvendas where parcela = p_parcela and autorizacao = p_autorizacao and datavenda = p_datavenda
e etc
tabela fcr_compvendas
campos nsu, autorizacao, datavenda, datavencimento e parcela
então quero assim...
select * from fcr_compvendas where parcela = p_parcela and nsu = p_nsu and autorizacao = p_autorizacao
p_parcela, p_nsu e p_autorizacao seria os parametros....
caso não tenho nada de retorno nessa pesquisa terei que fazer outra....
select * from fcr_compvendas where parcela = p_parcela and autorizacao = p_autorizacao and datavenda = p_datavenda
e etc
GOSTEI 0
Robson Morais
22/07/2014
alguém ?
GOSTEI 0
Marisiana Battistella
22/07/2014
Vou tentar te ajudar...
Em primeiro lugar, como boa prática, nunca utilize "select * from....", sempre inclua os nomes das colunas que vc precisa que o SQL retorne...
Isso reduz o processamento que o database terá que fazer, pois reduz o volume de retorno de dados...
Se vc apenas precisa saber se o primeiro select retornou dados ou não, vc pode fazer o seguinte:
Declara uma variável para receber o retorno do SQL:
Em seguida, vc cria uma estrutura de controle IF... THEN... ELSE para verificar se a variável possui algum valor...
Em primeiro lugar, como boa prática, nunca utilize "select * from....", sempre inclua os nomes das colunas que vc precisa que o SQL retorne...
Isso reduz o processamento que o database terá que fazer, pois reduz o volume de retorno de dados...
Se vc apenas precisa saber se o primeiro select retornou dados ou não, vc pode fazer o seguinte:
Declara uma variável para receber o retorno do SQL:
select COUNT(fcv.<nomedoidentificador>) into v_variável from fcr_compvendas fcv where parcela = p_parcela and nsu = p_nsu and autorizacao = p_autorizacao
Em seguida, vc cria uma estrutura de controle IF... THEN... ELSE para verificar se a variável possui algum valor...
IF v_variavel IS NULL THEN
<define o que será realizado nessa condição>
ELSE
<define o que será realizado nessa condição>
END IF; GOSTEI 0
Marisiana Battistella
22/07/2014
Tentei te ajudar com a lógica, pois não tenho o MySQL instalado aqui pra testar... Então vc precisa aplicar a sintaxe correta, de acordo com a linguagem de programação utilizada pelo MySQL, para fazer funcionar...
GOSTEI 0
Alex Lekao
22/07/2014
ta parecendo recursividade.
meio complexo, vou acompanhar para conhecimento. rsrs
meio complexo, vou acompanhar para conhecimento. rsrs
GOSTEI 0
Ronaldo Lanhellas
22/07/2014
Não entendi uma coisa: Como você pretende retornar os campos "a,b,c,d,e,f,g,h" se (de acordo com você) a tabela faturas só tem os campos "a,b,c,d,e" ?
GOSTEI 0
Robson Morais
22/07/2014
Então o meu problema está sendo a estrutura do stored procedure do mysql que não estou conseguindo montar, passar os parametros do entrada e saida.
GOSTEI 0
Robson Morais
22/07/2014
Não entendi uma coisa: Como você pretende retornar os campos "a,b,c,d,e,f,g,h" se (de acordo com você) a tabela faturas só tem os campos "a,b,c,d,e" ?
só foi um exemplo, tenho que passar os seguintes parametros de entrada....
p_nsu, p_aut, p_dtvenda, p_parcela e p_valor
e irei dar saida desses campos que vai ser retornado do sql....mas terei criterios de pesquisa, se não acha por nsu e aut vai por parcela e nsu, se não sai por esse vai para outro....
GOSTEI 0
Marisiana Battistella
22/07/2014
Algumas explicações:
[url]https://www.devmedia.com.br/stored-procedures-no-mysql/29030[/url]
[url]http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html[/url]
[url]http://www.mysqltutorial.org/stored-procedures-parameters.aspx[/url]
Exemplo de estrutura:
[url]https://www.devmedia.com.br/stored-procedures-no-mysql/29030[/url]
[url]http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html[/url]
[url]http://www.mysqltutorial.org/stored-procedures-parameters.aspx[/url]
Exemplo de estrutura:
DELIMITER $$
CREATE PROCEDURE CountOrderByStatus(
IN orderStatus VARCHAR(25),
OUT total INT)
BEGIN
SELECT count(orderNumber)
INTO total
FROM orders
WHERE status = orderStatus;
END$$
DELIMITER ;
GOSTEI 0
Ronaldo Lanhellas
22/07/2014
Bom, essa é uma questão mais de lógica do que SQL, você tem que montar um tabela com as prováveis clausulas WHERE, ex:
1 - WHERE nsu = x, aut = x
2 - WHERE nsu = x
3 - WHERE aut = x
e assim por diante ...
Você vai buscando em cada WHERE até que o resultado seja maior que zero. Bem simples porém é uma trabalho demorado dependendo da quantidade de filtros que você deseje.
1 - WHERE nsu = x, aut = x
2 - WHERE nsu = x
3 - WHERE aut = x
e assim por diante ...
Você vai buscando em cada WHERE até que o resultado seja maior que zero. Bem simples porém é uma trabalho demorado dependendo da quantidade de filtros que você deseje.
GOSTEI 0
Robson Morais
22/07/2014
tentei criar, mas dá erro:
SQL Error [1064] [42000]: 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 'END$$
DELIMITER' at line 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 'END$$
DELIMITER' at line 1
SQL Error [1064] [42000]: 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 'END$$
DELIMITER' at line 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 'END$$
DELIMITER' at line 1
Algumas explicações:
[url]https://www.devmedia.com.br/stored-procedures-no-mysql/29030[/url]
[url]http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html[/url]
[url]http://www.mysqltutorial.org/stored-procedures-parameters.aspx[/url]
Exemplo de estrutura:
[url]https://www.devmedia.com.br/stored-procedures-no-mysql/29030[/url]
[url]http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html[/url]
[url]http://www.mysqltutorial.org/stored-procedures-parameters.aspx[/url]
Exemplo de estrutura:
DELIMITER $$
CREATE PROCEDURE CountOrderByStatus(
IN orderStatus VARCHAR(25),
OUT total INT)
BEGIN
SELECT count(orderNumber)
INTO total
FROM orders
WHERE status = orderStatus;
END$$
DELIMITER ;
GOSTEI 0
Marisiana Battistella
22/07/2014
Mas vc adaptou essa estrutura a tua base de dados?
GOSTEI 0
Robson Morais
22/07/2014
sim o select eu montei de acordo com minha tabela
GOSTEI 0
Marisiana Battistella
22/07/2014
Eu tirei esse exemplo de estrutura desse tutorial aqui: [url]http://www.mysqltutorial.org/stored-procedures-parameters.aspx[/url]
Teria que ver o que pode estar errado...
Se eu pudesse testar aqui e t passar a resposta mais completa eu faria, mas...
Desculpa não poder ajudar mais....
Teria que ver o que pode estar errado...
Se eu pudesse testar aqui e t passar a resposta mais completa eu faria, mas...
Desculpa não poder ajudar mais....
GOSTEI 0
Robson Morais
22/07/2014
Ok Marisiana sem problemas, obrigado.....
GOSTEI 0
Marisiana Battistella
22/07/2014
Por nada!
Conseguiu criar a procedure?
Conseguiu criar a procedure?
GOSTEI 0
Robson Morais
22/07/2014
Não consegui muita coisa, então parti para o php mesmo....
Obrigado.
Obrigado.
GOSTEI 0
Eduardo Martins
22/07/2014
Olá Robinhocne.
Será que para o que você quer fazer não seja mais fácil criar uma View?
Exemplo:
- No MySql.
- No Php Executa.
Exemplo de procedure.
Se fizer isso no phpmyadmin vc tem q colocar o delimiter no campo delimiter pra funcionar, ai pode remover esta linha abaixo.
Chamada no PHP.
Será que para o que você quer fazer não seja mais fácil criar uma View?
Exemplo:
- No MySql.
CREATE VIEW MINHAVIEW AS ( SELECT A, B, F FROM TABELA );
- No Php Executa.
SELECT * FROM MINHAVIEW WHERE A = 'A' AND B = 'B'
Exemplo de procedure.
Se fizer isso no phpmyadmin vc tem q colocar o delimiter no campo delimiter pra funcionar, ai pode remover esta linha abaixo.
DELIMITER $$ CREATE PROCEDURE `SX_TABELA`( IN PA VARCHAR(255), IN PB VARCHAR(255), OUT PX TEXT ) BEGIN SELECT F INTO PX FROM TABELA WHERE A=PA AND B=PB; END$$
Chamada no PHP.
SET @PX = '';
CALL SX_TABELA('A', 'B', @PX);
SELECT @PX AS RETORNO;
GOSTEI 0