2010-10-21 3 views
5

Мне нужно принять только Y/N для переменной is_master, объявляющей ниже.Принимать только ограниченные символы, используя accept в oracle

Например, если я использую следующую инструкцию в SQL-скрипте, пользователь может ввести любой символ.

Я хочу, чтобы ограничить пользователю ввести только у Y п или N

Accept is_master prompt ' Is the user a Master user (Y/N) : ' 

ответ

1

Вы можете использовать ключевое слово format после accept для определения формата пользователю необходимо следовать, как это определено here. Однако я не вижу формат Y/N-like среди format models. С A1 format вы ограничиваете ввод только 1 символом.

В соответствии с this вы можете что-то сделать с форматом ключевого слова change, но у меня нет опыта с ним.

1

Выполнение чего-то подобного позволяет вам проверять значения и, возможно, запрашивать у пользователя достоверность/недействительность ввода.

PROMPT Enter the value to validate 
ACCEPT value PROMPT "Value: " 
SELECT 
    DECODE('&&value', 'Y', 'This input is OK', 
       'y', 'This input is OK', 
       'N', 'This input is OK', 
       'n', 'This input is OK', 
       'ERROR This input is invalid') as Result 
FROM DUAL; 

Однако, я должен признать, что с помощью этой проверки, чтобы выполнить дополнительную логику условно это то, что я считаю себя, чтобы быть поставлен в тупик в а.

Однако мои знания сценариев очень ограничены.

Возможно, это может привести к аккорду с кем-то, у кого больше знаний о переменных и как получить результат ниже в переменной, а затем использовать его для дальнейшей обработки.

4

Вдохновленного ранее answer Тони Эндрюс, если у вас есть внешний сценарий под названием accept_y_n.sql:

accept answer prompt '&question (Y/N): ' format A1 

set verify off 
set termout off 

column script new_value v_script 
select case 
    when '&answer' in ('Y','N') then '' 
    else 'accept_y_n' 
    end as script 
from dual; 

set termout on 

@&v_script. 

... то из реального сценария вы можете цикл, чтобы получить ответ в требуемом формате :

define question='Is the user a Master user' 
@accept_y_n 
define is_master=&answer 

select '&is_master' as is_master from dual; 

Он будет продолжать запрашивать, пока не получите Y или N, и вы можете использовать ответ позже.

Is the user a Master user (Y/N): A 
Is the user a Master user (Y/N): 1 
Is the user a Master user (Y/N): 
Is the user a Master user (Y/N): Y 

I 
- 
Y 
+0

+1 Мне нравится, как вы достигли цикла. Никогда не думал об этом! :-) – InSane

1

Мне нравится вариант цикла, что Алекс дал, но если вы хотите, чтобы сценарий, чтобы остановить, если недопустимое значение задано, вы должны быть в состоянии сделать что-то вроде этого (не проверено):

WHENEVER SQLERROR EXIT 
ACCEPT answer PROMPT 'OK? (Y/N): ' FORMAT A1 
BEGIN IF '&answer.' NOT IN ('Y','N','y','n') THEN RAISE VALUE_ERROR; END IF; END; 
/
WHENEVER SQLERROR CONTINUE 
+1

Я сделал это первым, но мыслительный цикл мог бы быть более полезным в простом случае Y/N, подобном этому (это когда я нашел оригинал Тони). Разумеется, в зависимости от ситуации в OP так хорошо, что оба подхода показаны. –

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