2010-10-21 37 views

Trả lời

1

Bạn có thể sử dụng từ khóa format sau accept để xác định định dạng người sử dụng cần làm theo vì nó được định nghĩa here. Tuy nhiên, tôi không thấy định dạng Y/N trong số format models. Với A1 format, bạn hạn chế đầu vào chỉ có 1 ký tự.

Theo this bạn có thể làm điều gì đó với các định dạng của từ khóa thay đổi nhưng tôi không có kinh nghiệm với nó.

1

Làm điều gì đó như thế này cho phép bạn kiểm tra các giá trị và có thể nhắc người dùng về tính hợp lệ/không hợp lệ của đầu vào.

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; 

Tuy nhiên, tôi phải thừa nhận rằng việc sử dụng séc này để thực hiện thêm logic có điều kiện là điều tôi thấy mình cũng bị mắc kẹt.

Tuy nhiên, kiến ​​thức về tập lệnh của tôi rất hạn chế.

Có thể thấy điều này có thể gây ra một cuộc trò chuyện với người có hiểu biết về biến và cách nhận kết quả dưới đây thành biến và sau đó sử dụng để xử lý tiếp.

4

Lấy cảm hứng từ một sớm answer từ Tony Andrews, nếu bạn có một kịch bản bên ngoài gọi là 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. 

... sau đó từ một kịch bản thực sự bạn có thể lặp để có được những câu trả lời trong các định dạng cần thiết :

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

select '&is_master' as is_master from dual; 

Nó sẽ tiếp tục nhắc cho đến khi bạn nhận được Y hoặc chữ N và bạn có thể sử dụng phản hồi sau.

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 Tôi thích cách bạn đã đạt được vòng lặp. Không bao giờ nghĩ về điều đó! :-) – InSane

1

Tôi thích lựa chọn loop rằng Alex đã, nhưng nếu bạn muốn kịch bản để ngăn chặn nếu một giá trị không hợp lệ được đưa ra, bạn sẽ có thể làm điều gì đó như thế này (không kiểm tra):

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

Tôi đã làm nó theo cách đó đầu tiên nhưng suy nghĩ looping có thể hữu ích hơn trong một trường hợp Y/N đơn giản như thế này (đó là khi tôi tìm thấy bản gốc của Tony). Phụ thuộc vào tình hình của khóa học OP rất tốt để có cả hai cách tiếp cận được hiển thị. –

Các vấn đề liên quan