如何在oracle中计算字符串的值?

时间:2009-08-12 15:43:37

标签: oracle

如果我有一个字符串说“3 * 2 + 24”怎么能在Oracle中计算它的值?在sql server中你可以执行exec('select 3 * 2 + 24')并返回30

由于

5 个答案:

答案 0 :(得分:3)

这是计算任意算术字符串的一个小函数:

SQL> CREATE OR REPLACE FUNCTION calc(pi_val VARCHAR2) RETURN NUMBER IS
  2  v_return NUMBER;
  3  BEGIN
  4    EXECUTE IMMEDIATE 'select '||pi_val||' from dual' INTO v_return;
  5    RETURN v_return;
  6  END;
  7  /

Function created
SQL> SELECT calc('2*6*10') FROM dual;

CALC('2*6*10')
--------------
           120

SQL> 

显然,出于生产目的,您需要一些错误处理......

答案 1 :(得分:3)

您可以使用DCookie的解决方案。

您可以通过创建没有权限的新用户来降低SQL注入攻击的可能性。

以系统身份登录并创建没有权限的新用户:

create user new_user identified by password_new_user;

在模式new_user中创建函数(作为系统)。

create or replace function new_user.calc(pi_val varchar2) return number
is
  v_return number;
begin
  execute immediate  'select '||pi_val||' from dual' INTO v_return;
  return v_return;
end;
/

接下来,将函数new_user.calc上的执行权限(作为系统)授予相关的Oracle用户(例如tuinstoel(就是我))。

grant execute on new_user.calc to tuinstoel;

以用户tuinstoel身份登录。

connect tuinstoel/cheese_and_cheese@ora11

SQL> select new_user.calc('2+3') from dual;

NEW_USER.CALC('2+3')
--------------------
                   5

调用函数new_user.calc的每个人在函数new_user内都具有new_user.calc(无)的权限,而不是调用者的权限(定义者的权限不是调用者的权限)。

如果您不想在每次调用calc中包含new_user.,请执行tuinstoel:

 create synonym calc for new_user.calc;

接下来你可以用以下方法测试:

SQL> select calc('2+3') from dual;

CALC('2+3')
-----------
          5

edit1:其他人已经考虑过这个解决方案,他们已经指出了一些(潜在的)问题:请参阅http://forums.oracle.com/forums/thread.jspa?forumID=75&threadID=943576

答案 2 :(得分:2)

在ORACLE中,您可以使用双重功能进行任何计算。例如

SELECT 3*3-(2+2) FROM DUAL

然而,你做不到

SELECT '3*3-(2+2)' FROM DUAL

因为它只返回'3 * 3-(2 + 2)'的字符串。如果您拥有的只是一个字符串,我可能会将其删除为数字函数,然后进行计算。

答案 3 :(得分:1)

您可以使用 xmlquery() 功能来实现它。以下是示例代码:

select xmlquery( replace( 'your variable', '/', ' div ') returning content ).getNumberVal() from dual;

例如下面的代码

SELECT
 XMLQUERY(
  REPLACE( '3/4', '/', ' div ')
    RETURNING CONTENT
 ).getNumberVal() FROM   DUAL;

返回0.75

答案 4 :(得分:0)

在Oracle中有点笨拙,但可以做到。

SQL> set serveroutput on
SQL> declare
  2     str varchar2(250) := '3*2+24';
  3     n number;
  4  begin
  5    execute immediate 'select '||str||' from dual' into n;
  6    dbms_output.put_line(str||' = '||to_char(n)||' !!');
  7  end;
  8  /

3*2+24 = 30 !!

PL/SQL procedure successfully completed.

SQL>