2014-02-18 4 views
0

У меня есть следующая структура таблицы, которая содержит коды ошибок и соответствующие сообщения об ошибках:заполнение заполнителей для столбца со значениями динамически

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

В моем PLSQL коде, я хотел бы динамически подставлять значение имени пользователя и пароль ,

Я понимаю, что 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 Заявление не поможет в этой ситуации. Кроме того, нет необходимости использовать его - все (выбрать список, имена таблиц) известно во время компиляции, оно сводится к замене строк. Используйте статический запрос, а не динамический. Для того, чтобы сделать замену (или форматирования строк) у вас есть по крайней мере два варианта:

  1. Просто используйте replace() функцию:

    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; 
    

    Результат:

    Invalid Username new value 
    
  2. Если возможно , обновите err_message столбик вашего стола error_messages, заменив :USERNM и :PWD и другими si Milar подстрока thta обозначает заполнители %s (заполнитель для символьного литерала) или %d (заполнителя для целого буквального, если у вас есть) и использовать 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

Спасибо Николаю! Второй подход звучит хорошо для меня. Я использовал подобный материал в Java (MessageFormat.format()), никогда не знал, что у них аналогичный в БД. –

0

Вы можете просто получить ERR_MESSAGE из своей таблицы через SELECT и добавить к нему имя пользователя или 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, если вы хотите, чтобы определить это как функция.

Смежные вопросы