解析数学函数PL / SQL

时间:2013-02-06 11:05:27

标签: sql oracle math plsql

我需要在pl / sql中解析数​​学方程式/函数 oracle 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

我想要一个函数来解析这个语句并找出x的值。

Something like this is what I am looking for

有任何帮助吗?感谢。

2 个答案:

答案 0 :(得分:7)

唉,Oracle数据库不是一个数学工具。它有很多arithmetical and statistical functions但它没有能够解释方程的内置功能。抱歉。


纯粹巧合Marc(AKA Odie_63)最近发表了一个用PL / SQL编写的反向波兰表示法计算器。它并没有完全符合你的要求,但我包含了一个链接,以便将来可能偶然发现这个主题的任何寻求者。 Find out more.

答案 1 :(得分:4)

正如APC所说,没有内置功能可以做到这一点。但您可以使用PL / SQL中的WolframAlpha API

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

结果:

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

这种方法有很多潜在的缺点。它会非常慢,而且API不是免费的。我的例子很有效,因为我使用了我的免费开发者appid,但这只适用于少量的电话。