2014-02-18 2 views
0

I 오류 코드 및 관련 오류 메시지 보유하고있는 다음과 같은 테이블 구조가 : 내 PLSQL 코드에서값을 가진 열의 자리를 채울 동적

ERR_CODE ERR_MESSAGE 
CN001  Invalid Username :USERNM 
CN002  Invalid Password :PWD 

, 나는 동적으로 사용자 이름과 암호에 대한 값을 대체하고 싶습니다 .

EXECUTE IMMEDIATE는 USING 절을 대체 할 수 있지만이 경우 쿼리는 정적이어야한다는 것을 알고 있습니다.

나는이 할 수있는 것을 특징으로 즉시 실행 비슷한 맛을 찾고 :

SIMILAR_EXECUTE_IMMDIATE q'{select ERR_MESSAGE from ERROR_MESSAGES where ERR_CODE = 'CN001'}' INTO l_err_msg USING l_curr_user; 

을 아니면 내가 2 단계로 그것을 분해 할 수 있습니다, 내가 노력하고 기본적으로

select ERR_MESSAGE into err_msg_var from ERROR_MESSAGES where ERR_CODE='CN001'; 

EXECUTE_IMMDIATE err_msg_var INTO l_err_msg USING l_curr_user; 

관련된 단계 수를 줄이거 나 더 나은 쿼리 또는 접근법을 얻을 수 있습니다.

미리 감사드립니다.

+1

어떤 상황에서도 사용자의 암호를 일반 텍스트로보고하려는 시스템이 있는지 확실하지 않습니다. 시스템은 암호를 처리 한 다음 암호를 기록하거나 오류 메시지에 표시하지 않고 암호를 버려야합니다. –

답변

2

아니요, execute immediate 문구가 도움이되지 않습니다. 그 외에도 실제로 사용할 필요가 없습니다. 모든 항목 (선택 목록, 테이블 이름)은 컴파일 타임에 알려지며 문자열 대체로 만 제공됩니다. 동적 쿼리가 아닌 정적 쿼리를 사용하십시오. 그것이 가능하면

Invalid Username new value 
  • :

    set serveroutput on; 
    clear screen; 
    
    declare 
        l_result varchar2(50); 
    begin 
        select err_message 
        into l_result 
        from error_messages 
        where err_code = 'CN001'; 
    
        dbms_output.put_line(replace(l_result, ':USERNM', 'new value')); 
    end; 
    

    결과 :

    1. 간단히 replace() 기능을 사용 : 당신은 적어도 두 가지 선택이 대체 (또는 문자열 서식)를 수행하기 위해 , error_messages 테이블의 err_message 열을 :USERNM:PWD으로 바꿔서 업데이트하고 다른 si 유사한 구성 하위 문자열 또는 %d (문자 리터럴에 대한 자리 표시 자) %s로 자리를 의미 thta (정수 자리 표시 자 문자 그대로 당신은 어떤이있는 경우) 및 utl_lms 패키지와 특히 format_message() 기능을 사용

      set serveroutput on; 
      clear screen; 
      
      declare 
          l_result varchar2(50); 
      begin 
          select err_message 
          into l_result 
          from error_messages 
          where err_code = 'CN001'; 
      
          dbms_output.put_line(
          utl_lms.format_message(l_result, 'new_value_goes_here') 
          ); 
      end; 
      

      결과 :

      Invalid Username new_value_goes_here 
      
  • +0

    감사합니다. Nicholas! 두 번째 접근 방식은 나에게 좋게 들린다. Java (MessageFormat.format())에서 비슷한 내용을 사용하고 DB에서 비슷한 내용을 알지 못했습니다. –

    0

    SELECT를 통해 테이블에서 ERR_MESSAGE를 가져 와서 userName 또는 PWD를 추가 할 수 있습니다. 아래는 발췌 문장입니다.

    select ERR_MESSAGE into err_msg_var from ERROR_MESSAGES where ERR_CODE='CN001'; 
    dbms_output.put_line(err_msg_var||l_curr_user) 
    

    이 값을 함수로 정의하려면 dbms_output 값을 반환 할 수 있습니다.

    관련 문제