2009-09-23 33 views
39

Tôi có một hàm PL/SQL với BOOLEAN trong tham số:Làm thế nào để sử dụng loại BOOLEAN trong SELECT tuyên bố

function get_something(name in varchar2, ignore_notfound in boolean); 

Chức năng này là một phần của công cụ của bên thứ 3, tôi không thể thay đổi điều này.

Tôi muốn sử dụng chức năng này bên trong một câu lệnh SELECT như sau:

select get_something('NAME', TRUE) from dual; 

này không làm việc, tôi nhận được ngoại lệ này:

ORA-00.904: "TRUE": không hợp lệ số nhận dạng

Như tôi đã hiểu, từ khóa TRUE không được nhận dạng.

Tôi làm cách nào để thực hiện công việc này?

Trả lời

24

Bạn có thể xây dựng một chức năng bao bọc như thế này:

function get_something(name in varchar2, 
        ignore_notfound in varchar2) return varchar2 
is 
begin 
    return get_something (name, (upper(ignore_notfound) = 'TRUE')); 
end; 

sau đó gọi:

select get_something('NAME', 'TRUE') from dual; 

Đó là tùy thuộc vào bạn những gì các giá trị hợp lệ của ignore_notfound là trong phiên bản của bạn, tôi đã giả định 'TRUE 'có nghĩa là TRUE và bất cứ điều gì khác có nghĩa là FALSE.

+11

đến trên oracle, đây là một giới hạn thực sự ngu ngốc – craigrs84

+8

Tôi tò mò về cách Oracle biện minh về mặt kỹ thuật này –

-1

PL/SQL phàn nàn rằng TRUE không phải là số nhận dạng hợp lệ hoặc biến. Thiết lập một biến cục bộ, đặt nó thành TRUE và chuyển nó vào hàm get_something.

+4

Không, Oracle SQL đơn giản là không thể xử lý các giá trị boolean :-( –

+0

Thêm vào đó, tôi muốn sử dụng chức năng này trong một định nghĩa xem, không phải bên trong một kịch bản –

+0

@Ula, Tony:. Sau đó, tôi đoán gói các chức năng là theo cách thích hợp nhất –

19

Từ documentation:

Bạn không thể chèn các giá trị TRUEFALSE vào một cột cơ sở dữ liệu. Bạn không thể chọn hoặc tìm nạp giá trị cột vào biến số BOOLEAN. Các hàm được gọi từ truy vấn SQL không được nhận bất kỳ tham số BOOLEAN nào. Không thể tích hợp chức năng SQL như TO_CHAR; để đại diện cho BOOLEAN giá trị sản lượng, bạn phải sử dụng IF-THEN hoặc CASE cấu trúc dịch BOOLEAN giá trị vào một số loại khác, chẳng hạn như 0 hoặc 1, 'Y' hoặc 'N', 'true' hoặc 'false', và vân vân.

Bạn sẽ cần tạo hàm bao gồm một kiểu dữ liệu SQL và sử dụng nó thay thế.

-1

Làm thế nào về việc sử dụng một biểu thức mà đánh giá là TRUE (hoặc FALSE)?

select get_something('NAME', 1 = 1) from dual 
+0

Điều này không hoạt động, tôi nhận được lỗi cú pháp –

+1

Không hoạt động ... – GabrielOshiro

2

Biên dịch điều này trong cơ sở dữ liệu của bạn và bắt đầu sử dụng câu lệnh boolean trong truy vấn của bạn.

lưu ý: hàm nhận được tham số varchar2, vì vậy hãy chắc chắn bao bọc bất kỳ "chuỗi" nào trong câu lệnh của bạn. Nó sẽ trả về 1 cho true và 0 cho false;

select bool('''abc''<''bfg''') from dual; 

CREATE OR REPLACE function bool(p_str in varchar2) return varchar2 
is 
begin 

execute immediate ' begin if '||P_str||' then 
      :v_res := 1; 
     else 
      :v_res := 0; 
     end if; end;' using out v_res; 

     return v_res; 

exception 
    when others then 
    return '"'||p_str||'" is not a boolean expr.'; 
end; 
/
38

Bạn chắc chắn có thể nhận giá trị Boolean từ truy vấn SELECT, bạn không thể sử dụng loại dữ liệu Boolean.

Bạn có thể biểu diễn Boolean bằng 1/0.

CASE WHEN (10 > 0) THEN 1 ELSE 0 END (It can be used in SELECT QUERY) 

SELECT CASE WHEN (10 > 0) THEN 1 ELSE 0 END AS MY_BOOLEAN_COLUMN 
    FROM DUAL 

Trả về, 1 (trong Hibernate/Mybatis/etc 1 là đúng). Nếu không, bạn có thể nhận các giá trị Boolean có thể in từ một SELECT.

SELECT CASE WHEN (10 > 0) THEN 'true' ELSE 'false' END AS MY_BOOLEAN_COLUMN 
FROM DUAL 

Điều này trả về chuỗi 'true'.

+1

Chính xác những gì Tôi đã tìm kiếm. Cảm ơn! – Baxter

+2

Hoàn toàn không liên quan đến câu hỏi mặc dù câu hỏi không phải là "làm thế nào để tôi sử dụng số thay vì booleans". – cartbeforehorse

3
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual; 
Các vấn đề liên quan