2009-08-12 6 views

답변

2

를 반환합니다. 그냥 '3 * 3 (2 + 2)'의 문자열을 반환하기 때문에

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

그러나 예를 들어,

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

할 수 없습니다. 당신이 가지고있는 모든 것이 문자열이라면, 아마 그것을 수치 함수로 쪼개서 계산을 할 것입니다.

+0

무엇 0.75 아래의 코드 : 다음은 샘플 코드는? 나는 그것이 표현에 대해 작동 할 것인가에 대해 결정적으로 아무 것도 발견하지 못했고, 왜 이것이 대답이 아닌지를 발견하지 못했습니다. 그러나 SQL * Plus 또는 다른 환경에서 한 번 실행해볼 가치가 있습니다 : 이중 ' –

+0

SQL> SELECT to_number ('2 * 6 * 10 ')에서 select to_number ('3 * 3- (2 + 2) SELECT TO_NUMBER ('2 * 6 * 10') 듀얼 ORA-01722 FROM : 올바르지 않은 숫자 SQL> – DCookie

+0

감사합니다, northpole. 나는 아직 응답을 위해 투표 할 수 있도록 등록하지 않았지만 나중에 할 것입니다. 이중 선택에서 to_number ('3 * 3- (2 + 2)')를 시도했는데 오류가 발생했습니다. 잘못된 번호 –

0

오라클에서는 다소 까다 롭지 만 수행 할 수 있습니다.

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

물론, 생산 목적을 위해 일부 오류 처리 ...

+3

또한 프로덕션 논리에 대한 SQL 주입 공격에 매우 취약합니다. –

+0

SQL 주입 공격의 가능성에 대한 내 대답을 읽어보십시오. – tuinstoel

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에 (시스템으로) 실행 권한 (그 날의 (인스턴스 tuinstoel 용)).

grant execute on new_user.calc to tuinstoel; 

사용자로 로그인 tuinstoel. 기능 new_user.calc를 호출

connect tuinstoel/[email protected] 

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

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

모든 기능 new_user.calc 내부 new_user (없음)의 권한이 아닌 호출자의 권리 (정의 자의 권한이 없습니다 호출자의 권한).

당신이 CALC 모든 호출에 new_user.을 포함하지 않는 경우 tuinstoel으로 수행

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

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

이 EDIT1 : 기타 고려했다

create synonym calc for new_user.calc; 

다음 당신이 이것을 테스트 할 수 있습니다 이 솔루션에 관해서는 몇 가지 (잠재적 인) 문제점을 지적했습니다. http://forums.oracle.com/forums/thread.jspa?forumID=75&threadID=943576을 참조하십시오.

+0

은 "new_user (none) 권한을가집니다"Oracle의 PUBLIC에 얼마나 많은 권한이 부여되는지 놀랍습니다. 입력이 소독되지 않은 경우 (예 : 따옴표 나 알파벳 문자가 있으면 거부하십시오) 매우 위험합니다. –

+0

@Gary, 무엇이 잘못 될 수 있는지 보여주세요. – tuinstoel

1

xmlquery() 함수를 사용하여 구현할 수 있습니다.예를 들어

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

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

반환 TO_NUMBER에 대한

관련 문제