2010-05-27 3 views
2

Oracle 10g를 사용하여 응용 프로그램을 작성했습니다.Oracle 프로 시저의 문자열에서 함수 호출 호출

현재이 문제에 직면하고 있습니다. 나는 "filename"을 varchar2 유형의 매개 변수로 사용합니다.

파일 이름에 포함될 수있는 샘플 값은 'TEST || to_char (sysdate, 'DDD') '입니다.

이 절차에서 TEST147과 같이이 파일 이름의 값을 가져 오려고합니다. 는 내가 쓸 때 :

select filename 
into ffilename 
from dual; 

내가 값 ffilename = TEST를 얻을 || to_char (sysdate, 'DDD') 윅 (whick)은 의미가 있습니다. 하지만이 문제를 해결하고 문자열 값에서 함수를 호출하려면 어떻게해야합니까?

감사합니다. 감사합니다. .

답변

1

그것은 동적으로 문자열을 실행할 수있을만큼 쉽게 ...

create or replace function fmt_fname (p_dyn_string in varchar2) 
    return varchar2 
is 
    return_value varchar2(128); 
begin 
    execute immediate 'select '||p_dyn_string||' from dual' 
     into return_value; 
    return return_value; 
end fmt_fname; 
/

당신의 문자열이 무시 무시한 따옴표, 리터럴을 포함하는 경우 문제가 발생 ...

SQL> select fmt_fname('TEST||to_char(sysdate, 'DDD')') from dual 
    2/
select fmt_fname('TEST||to_char(sysdate, 'DDD')') from dual 
              * 
ERROR at line 1: 
ORA-00907: missing right parenthesis 


SQL> 

그래서 우리는 탈출해야 아포스트로피, 게시 된 문자열에 포함되지 않은 것을 포함하여 모두 포함 :

SQL> select * from t34 
    2/

     ID FILENAME 
---------- ------------------------------ 
     1 APC001 
     2 XYZ213 
     3 TEST147 


SQL> select * from t34 
    2 where filename = fmt_fname('''TEST''||to_char(sysdate, ''DDD'')') 
    3/

     ID FILENAME 
---------- ------------------------------ 
     3 TEST147 

SQL> 

편집 그냥 내가 토니의 솔루션은 단지뿐만 아니라 작동한다는 점을 지적한다고 생각 공정성을 위해서

:

SQL> create or replace function fmt_fname (p_dyn_string in varchar2) 
    2  return varchar2 
    3 is 
    4  return_value varchar2(128); 
    5 begin 
    6  execute immediate 'begin :result := ' || p_dyn_string || '; end;' 
    7   using out return_value; 
    8  return return_value; 
    9 end; 
10/

Function created. 

SQL> select fmt_fname('''TEST''||to_char(sysdate, ''DDD'')') from dual 
    2/

FMT_FNAME('''TEST''||TO_CHAR(SYSDATE,''DDD'')') 
-------------------------------------------------------------------------------- 
TEST147 

SQL> 

사실, DUAL에 SELECT를 피함으로써 아마 더 좋다.

+0

SQL을 통해 유효성이 검증되지 않은 사용자 입력을 실행하면 SQL 주입 공격이 발생할 수 있습니다. SELECT를 사용하면 함수가 수행 할 수있는 작업을 제한하기 때문에 최소한 보호 기능을 제공합니다. PL/SQL 주입을 허용하면 모든 종류의 불쾌 함이 발생할 수 있습니다. –

2

예제의 문자열 값이 잘못된 표현입니다. 그것이어야한다 : '시험'|| TO_CHAR (SYSDATE, 'DDD')

는이 작업을 수행 할 수 있다는 평가하기 :

execute immediate 'begin :result := ' || filename || '; end;' 
    using out v_string; 

v_string 다음 'TEST147'가 포함됩니다.

+0

도움 주셔서 감사합니다. 'TEST147'값을 생성 중입니다. 아직 오류를 반환합니다. dbms_output.put_line ('Result :'|| v_string); 오류 : PLS-00201 : 식별자 'TEST147'을 선언해야합니다. – DMS

+0

이해가 안됩니다. dbms_output.put_line (filename)을 실행 즉시 실행하기 전에 무엇을 얻습니까? –

+0

execute immediate statment가 발생하면 오류가 발생합니다. APC에서 제공하는 다른 방법이 작동합니다. 시간 내 줘서 고마워. – DMS