2013-02-06 13 views
8

Ho bisogno di risolvere un'equazione matematica/funzione in pl/sql.
Che tipo di operazioni matematiche sono disponibili in Oracle PL/SQL/funzioni che potrebbe aiutare a risolvere una funzione matematica come questo:Risolvi le funzioni matematiche PL/SQL

(3.5/(1+x))+(3.5/(1+x)^2)+(3.5/(1+x)^3)+(3.5/(1+x)^4)+(100/(1+x)^4)=101.55

Voglio una funzione per risolvere questa dichiarazione e scoprire il valore di x.

Something like this is what I am looking for

Qualsiasi aiuto? Grazie.

+0

Suppongo, dal momento che stai usando SQL, che il database fornirà il valore di 'x', è corretto? –

+0

No, in realtà intendo scoprire quale sia il valore di x xD –

+1

se non è una funzione incorporata, si dovrebbe usare la forza bruta o scrivere alcune funzioni personalizzate. A seconda di cosa vuoi fare, cercherò di usare Mathematica (http://www.wolfram.com/mathematica) – tbone

risposta

7

Purtroppo il database Oracle non è uno strumento matematico. Ha un sacco di arithmetical and statistical functions ma non ha funzionalità incorporate in grado di interpretare le equazioni. Scusate.


Per pura coincidenza Marc (AKA Odie_63) ha recentemente pubblicato un Reverse Polish Notation calcolatrice che ha scritto in PL/SQL. Non fa esattamente quello che vuoi ma sto includendo un link a beneficio di tutti i cercatori che potrebbero incappare in questo thread in futuro. Find out more.

4

Come affermato da APC, non è disponibile alcuna funzionalità integrata. Ma è possibile utilizzare il WolframAlpha API da PL/SQL:

declare 
    v_equation varchar2(32767) := 
     '(3.5/(1+x))+(3.5/(1+x)^2)+(3.5/(1+x)^3)+(3.5/(1+x)^4)+(100/(1+x)^4)=101.55'; 
    v_escaped_url varchar2(32767); 
    v_uri httpuritype; 
    v_xml xmltype; 
    v_count number := 1; 
begin 
    --Escape the URL. 
    --I used chr(38) for ampersand, in case your IDE think it's a substitution variable 
    v_escaped_url := 
     'http://api.wolframalpha.com/v2/query?appid=EQGHLV-UYUEYY9ARU'||chr(38)||'input=' 
     ||utl_url.escape(v_equation, escape_reserved_chars => true) 
     ||chr(38)||'format=plaintext'; 

    --Create an HTTPURIType, and get the XML 
    v_uri := httpuritype.createUri(v_escaped_url); 
    v_xml := v_uri.getXML; 

    --Complex solutions 
    while v_xml.existsNode('/queryresult/pod[@title="Complex solutions"]/subpod['||v_count||']') = 1 loop 
     dbms_output.put_line(v_xml.extract('/queryresult/pod[@title="Complex solutions"]/subpod['||v_count||']/plaintext/text()').getStringVal()); 
     v_count := v_count + 1; 
    end loop; 

    --Real solutions 
    v_count := 1; 
    while v_xml.existsNode('/queryresult/pod[@title="Real solutions"]/subpod['||v_count||']') = 1 loop 
     dbms_output.put_line(v_xml.extract('/queryresult/pod[@title="Real solutions"]/subpod['||v_count||']/plaintext/text()').getStringVal()); 
     v_count := v_count + 1; 
    end loop; 
end; 
/

Risultati:

x = -1.00006-0.996229 i 
x = -1.00006+0.996229 i 
x = -1.99623 
x = 0.0308219 

Ci sono un sacco di potenziali aspetti negativi di questo approccio. Sarà molto lento e l'API non è gratuita. Il mio esempio funziona perché ho utilizzato il mio appid per sviluppatori gratuito, ma è valido solo per un numero limitato di chiamate.

+0

Scusate ma sto cercando un approccio "standalone" –

+0

+1 Questo è un trucco da party, e uno pulito. Ma molti sistemi di produzione non consentono al database di connettersi a un altro sito come questo. Anche la tua domanda dipende dalla disponibilità di una terza parte. Naturalmente molti sistemi aziendali sono costruiti di servizi Web in questi giorni, ma molto raramente li chiamano dal database. – APC

Problemi correlati