2013-02-06 16 views
8

Potrzebuję rozwiązać równanie/funkcję matematyczną w pl/sql.
Jaki rodzaj operacji matematycznych są dostępne w Oracle PL/SQL/funkcje, które mogłyby mi pomóc rozwiązać funkcję matematyczną takiego:Rozwiązuj funkcje matematyczne 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

chcę funkcję do rozwiązania tego oświadczenia i dowiedzieć się wartość x.

Something like this is what I am looking for

Każda pomoc? Dzięki.

+0

Zakładam, że skoro używasz języka SQL, baza danych dostarczy wartość 'x', czy to prawda? –

+0

Nie, tak naprawdę chodzi mi o to, aby dowiedzieć się, jaka jest wartość x xD –

+1

, jeśli nie jest to funkcja wbudowana, możesz użyć brutalnej siły lub napisać jakąś niestandardową funkcję. Zależnie od tego, co chcesz zrobić, zagłębiłbym się w Mathematica (http://www.wolfram.com/mathematica) – tbone

Odpowiedz

7

Niestety baza danych Oracle nie jest narzędziem matematycznym. Ma wiele arithmetical and statistical functions, ale nie ma wbudowanej funkcji umożliwiającej interpretację równań. Przepraszam.


Przez zwykły zbieg okoliczności Marc (AKA Odie_63) opublikowała niedawno Reverse Polish Notation kalkulatora który został napisany w języku PL/SQL. Nie robi dokładnie tego, czego oczekujesz, ale umieszczam link dla korzyści wszystkich poszukiwaczy, którzy mogą natknąć się na ten wątek w przyszłości. Find out more.

4

Jak powiedział APC, nie ma w tym wbudowanej funkcjonalności. Ale można użyć WolframAlpha API z 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; 
/

Wyniki:

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

Istnieje wiele potencjalnych downsides do tego podejścia. Będzie bardzo powolny, a interfejs API nie jest darmowy. Mój przykład działa, ponieważ korzystałem z mojego bezpłatnego oprogramowania deweloperskiego, ale jest ono dobre tylko dla niewielkiej liczby połączeń.

+0

Przepraszam, ale szukam "samodzielnego" podejścia. –

+0

+1 To jest trik na przyjęciu, a schludny. Ale wiele systemów produkcyjnych nie pozwoliłoby na połączenie bazy danych z inną witryną, taką jak ta. Również twoja aplikacja staje się zależna od dostępności strony trzeciej. Oczywiście wiele systemów dla przedsiębiorstw składa się obecnie z usług sieciowych, ale bardzo rzadko wywołuje je z bazy danych. – APC

Powiązane problemy