如果我有一个字符串说“3 * 2 + 24”怎么能在Oracle中计算它的值?在sql server中你可以执行exec('select 3 * 2 + 24')并返回30
由于
答案 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>