"3 * 2 + 24"라는 문자열이 있으면 어떻게 Oracle에서 그 값을 계산할 수 있습니까? SQL Server의이 간부을 수행 할 수 있습니다 ('선택 3 * 2 + 24')과 30 개oracle에서 string의 값을 계산하는 방법은 무엇입니까?
감사합니다 당신이 이중 기능을 사용하여 원하는 계산을 할 수있는 ORACLE에서
"3 * 2 + 24"라는 문자열이 있으면 어떻게 Oracle에서 그 값을 계산할 수 있습니까? SQL Server의이 간부을 수행 할 수 있습니다 ('선택 3 * 2 + 24')과 30 개oracle에서 string의 값을 계산하는 방법은 무엇입니까?
감사합니다 당신이 이중 기능을 사용하여 원하는 계산을 할 수있는 ORACLE에서
를 반환합니다. 그냥 '3 * 3 (2 + 2)'의 문자열을 반환하기 때문에
SELECT 3*3-(2+2) FROM DUAL
그러나 예를 들어,
SELECT '3*3-(2+2)' FROM DUAL
할 수 없습니다. 당신이 가지고있는 모든 것이 문자열이라면, 아마 그것을 수치 함수로 쪼개서 계산을 할 것입니다.
오라클에서는 다소 까다 롭지 만 수행 할 수 있습니다.
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>
여기 연산의 임의의 문자열을 계산하기 위해 약간의 기능입니다 :
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>
물론, 생산 목적을 위해 일부 오류 처리 ...
또한 프로덕션 논리에 대한 SQL 주입 공격에 매우 취약합니다. –
SQL 주입 공격의 가능성에 대한 내 대답을 읽어보십시오. – tuinstoel
당신은 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을 참조하십시오.
은 "new_user (none) 권한을가집니다"Oracle의 PUBLIC에 얼마나 많은 권한이 부여되는지 놀랍습니다. 입력이 소독되지 않은 경우 (예 : 따옴표 나 알파벳 문자가 있으면 거부하십시오) 매우 위험합니다. –
@Gary, 무엇이 잘못 될 수 있는지 보여주세요. – tuinstoel
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에 대한
무엇 0.75 아래의 코드 : 다음은 샘플 코드는? 나는 그것이 표현에 대해 작동 할 것인가에 대해 결정적으로 아무 것도 발견하지 못했고, 왜 이것이 대답이 아닌지를 발견하지 못했습니다. 그러나 SQL * Plus 또는 다른 환경에서 한 번 실행해볼 가치가 있습니다 : 이중 ' –
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
감사합니다, northpole. 나는 아직 응답을 위해 투표 할 수 있도록 등록하지 않았지만 나중에 할 것입니다. 이중 선택에서 to_number ('3 * 3- (2 + 2)')를 시도했는데 오류가 발생했습니다. 잘못된 번호 –