[RESOLVIDO] Function Mysql com substituição no select

Opa,

fala drsmachado. Foi mal cara, não prestei atenção nas suas respostas. Erro meu! :oops:

Poxa Renata, realmente é um problema não trivial. Talvez se criasse esse mesmo post no MySQL Forums.

Mesmo assim, qualquer novidade tento novamente.

Abs!

[quote=newbcc] Olá Renata,

eu não tenho alternativa, realmente a substituição não é válida e não faria sentido.

O quê eu estou pensando nesse momento é se existe a possibilidade de você, ao invés de usar essa expressão toda ‘10.00 - 4.50…’, enviar o resultado direto dela para a sua função, pois assim você estaria trabalhando direto com o double.

Se você entendeu a minha intenção, é possível para você fazer essa implementação?

Abs![/quote]

Não tenho… veja só, minha função que monta a tal fórmula. O que chega pra minha função é uma fórmula assim por ex: "CAMPO1 + CAMPO2 / (CAMPO3 * CAMPO4) + CAMPO5 / CAMPO6 * 7 / 3.45"
Ou seja, chega uma fórmula qq.

Eu substituo nessas fórmulas cada um desses campos pelos valores que terei que usar e no final, chego a um varchar com a a expressão a ser resolvida. É a minha tal var_formula.
Tendeu?

Na verdade, o que eu queria era simplesmente macro-substituição. Os mais velhos sabem do que estou falando.
Seria por ex, igual qdo no iReport invés de usar $P usamos $P!, ou seja, invés de concatenar uma variável, concatenamos só o conteúdo dela.
Pensei que nos banco de dados teríamos algo similar.

À todos os interessados no assunto… eis o desfecho:

A única forma de fazer o que preciso seria através do que o MySQL chama de SQL Dinâmico (Dynamic SQL), ou seja, colocar numa variável um varchar com o comando do select e depois executar essa variável. Igual fazemos no fonte do java.

Pra fazer isso usando MySQL, teria que ser da seguinte forma (seguindo o meu exemplinho de antes…):

[code] SET var_formula = ‘(15.0-13.5)’; – uma fórmula qualquer
SET @sql = CONCAT(‘select CAST(’, var_formula, ’ as decimal(13,3)) as preco’);

PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;[/code]

O comando acima funciona bem, exceto por um detalhe: o MySQL, por suas limitações que eu não sei explicar o motivo, não permite o uso de SQLs dinâmicos em functions ou triggers. Ou seja, só pode ser usado em stored procedures.

Eu inclusive testei em SP e realmente funciona. Pra poder ver o resultado (já que SPs não retornam valor), eu invés de “select” usei um comando de “update” pra que fosse atualizado um campo de uma tabela e eu poder ver o resultado. E deu certo.

Porém, pra mim, uma SP no caso não serve pra nada. E nem vou ficar entrando em detalhes do pq já que não quero mais polêmicas nesse post.

Eu passei por muitos sites, dicas, tutoriais, etc, etc… não compensa listar tudo aqui e nem vou lembrar e achar todos.
Dois mais simples e resumidos que posso listar são: http://forums.mysql.com/read.php?60,27979,30437#msg-30437 e http://forums.mysql.com/read.php?10,398743,398743#msg-398743

Eu precisava fazer essa alteração pra mais de um BD, trabalho com MySQL, SQL Server e Oracle.

Pro MySQL o desfecho foi esse dai. Pro SQL Server, pelo que fui lendo enquanto pesquisava pro MySQL, parece ser totalmente possível e simples de ser feito (veja bem, eu disse que “parece”, pq eu não testei). Já sobre o Oracle eu não encontrei nada (mas tb, eu não estava procurando né…).

Obrigada à todos que ajudaram.
Renata

Só um detalhe…é possível retornar valores via procedure sim. utilizando nos parametros :

(in entrada varchar(5), out saida varchar(5))

Garota chata paracaralho!

Qual a função deste comentário?
O que isto contribui para a comunidade?

Contribui tanto quanto as suas tentativas de ajuda para com a dúvida dela.

:wink: