2010-11-02 47 views
8

Tôi biết rằng Oracle không có kiểu boolean để sử dụng cho các tham số và hiện đang tham gia vào một loại NUMBER có 1/0 cho True/False (thay vì Cách tiếp cận 'Y'/'N' CHAR (1)).Tham số "Boolean" cho thủ tục lưu sẵn Oracle

Tôi không phải là một lập trình viên Oracle rất tiên tiến, nhưng sau khi làm một số digging và đọc một số bài viết ASKTOM, nó có vẻ như bạn có thể hạn chế một lĩnh vực sử dụng một định dạng cho các cột như:

MyBool NUMBER(1) CHECK (MyBool IN (0,1))

Có cách nào để áp dụng cùng một loại ràng buộc kiểm tra cho một tham số đầu vào cho một thủ tục lưu sẵn không? Tôi muốn hạn chế các đầu vào có thể là 0 hoặc 1, thay vì kiểm tra nó một cách rõ ràng sau khi nhận được đầu vào.

Trả lời

25

Bạn thể Booleans sử dụng như tham số cho thủ tục lưu trữ:

procedure p (p_bool in boolean) is... 

Tuy nhiên bạn không thể sử dụng Booleans trong SQL, ví dụ chọn báo cáo:

select my_function(TRUE) from dual; -- NOT allowed 

Đối với thông số số không có cách nào để thêm "ràng buộc kiểm tra" vào khai báo, bạn sẽ phải mã xác thực một số, ví dụ:

procedure p (p_num in number) is 
begin 
    if p_num not in (0,1) then 
     raise_application_error(-20001,'p_num out of range'); 
    end if; 
    ... 
+0

Hi Tony, tha thứ cho sự thiếu hiểu biết của tôi về loại 'boolean'. Tôi phải hiểu sai ý kiến ​​tôi đã thấy về nó. Tôi đã nghĩ Oracle đã không hỗ trợ nó, nhưng có lẽ đó chỉ là cho các kiểu trường. Chỉ cần kiểm tra kỹ, những điều sau đây có phù hợp với loại đó không? NẾU (p_bool) THEN v_MyDisplayString = 'Tôi đã thành công!'; END IF; –

+1

Có, PL/SQL đó sẽ hoạt động. Boolean KHÔNG được hỗ trợ cho các kiểu dữ liệu của các cột trong cơ sở dữ liệu và không thể được sử dụng trong tất cả các truy vấn SQL. –

2

Có và không. Bạn có thể làm ..

create or replace package t_bool is 
    subtype t_bool_num IS PLS_INTEGER RANGE 0..1; 
    function f_test (i_bool_num t_bool_num) return varchar2; 
end t_bool; 
/

create or replace package body t_bool is 
    function f_test (i_bool_num t_bool_num) return varchar2 is 
    begin 
    if i_bool_num = 0 then 
     return 'false'; 
    elsif i_bool_num = 1 then 
     return 'true'; 
    elsif i_bool_num is null then 
     return 'null'; 
    else 
     return to_char(i_bool_num); 
    end if; 
    end; 
end t_bool; 
/

Các tin tốt là, nếu bạn làm

exec dbms_output.put_line(t_bool.f_test(5)); 

nó báo cáo một lỗi.

Tin xấu là nếu bạn làm

select t_bool.f_test(5) from dual; 

sau đó bạn không nhận được một lỗi

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