GARANTIR DESCONTO

Fórum procedure no MySql #486270

22/07/2014

0

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

Responder

Posts

22/07/2014

Marisiana Battistella

Bom dia!
Vc já criou alguma estrutura?
Poderia postar pra vermos como vc está fazendo?
Responder

Gostei + 0

22/07/2014

Robson Morais

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
Responder

Gostei + 0

23/07/2014

Robson Morais

alguém ?
Responder

Gostei + 0

23/07/2014

Marisiana Battistella

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; 
Responder

Gostei + 0

23/07/2014

Marisiana Battistella

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

Gostei + 0

23/07/2014

Alex Lekao

ta parecendo recursividade.

meio complexo, vou acompanhar para conhecimento. rsrs
Responder

Gostei + 0

23/07/2014

Ronaldo Lanhellas

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" ?
Responder

Gostei + 0

23/07/2014

Robson Morais

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

Gostei + 0

23/07/2014

Robson Morais

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

Gostei + 0

23/07/2014

Marisiana Battistella

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 ;
Responder

Gostei + 0

23/07/2014

Ronaldo Lanhellas

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

Gostei + 0

23/07/2014

Robson Morais

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 ;
Responder

Gostei + 0

24/07/2014

Marisiana Battistella

Mas vc adaptou essa estrutura a tua base de dados?
Responder

Gostei + 0

24/07/2014

Robson Morais

sim o select eu montei de acordo com minha tabela
Responder

Gostei + 0

24/07/2014

Marisiana Battistella

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

Gostei + 0

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

Aceitar