procedure no MySql

MySQL

22/07/2014

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 ?
Robson Morais

Robson Morais

Curtidas 0

Respostas

Marisiana Battistella

Marisiana Battistella

22/07/2014

Bom dia!
Vc já criou alguma estrutura?
Poderia postar pra vermos como vc está fazendo?
GOSTEI 0
Robson Morais

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
GOSTEI 0
Robson Morais

Robson Morais

22/07/2014

alguém ?
GOSTEI 0
Marisiana Battistella

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:
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

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

Alex Lekao

22/07/2014

ta parecendo recursividade.

meio complexo, vou acompanhar para conhecimento. rsrs
GOSTEI 0
Ronaldo Lanhellas

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

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

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

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:
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

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.
GOSTEI 0
Robson Morais

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



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:
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

Marisiana Battistella

22/07/2014

Mas vc adaptou essa estrutura a tua base de dados?
GOSTEI 0
Robson Morais

Robson Morais

22/07/2014

sim o select eu montei de acordo com minha tabela
GOSTEI 0
Marisiana Battistella

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....
GOSTEI 0
Robson Morais

Robson Morais

22/07/2014

Ok Marisiana sem problemas, obrigado.....
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

22/07/2014

Por nada!
Conseguiu criar a procedure?
GOSTEI 0
Robson Morais

Robson Morais

22/07/2014

Não consegui muita coisa, então parti para o php mesmo....

Obrigado.
GOSTEI 0
Eduardo Martins

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.
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
POSTAR