2009-09-23 3 views
39

У меня есть функция PL/SQL с булевым в параметре:Как использовать логический тип в ЗЕЬЕСТЕ

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

Эта функция является частью 3-й инструмента партии, я не могу это изменить.

Я хотел бы использовать эту функцию внутри ЗЕЬЕСТА, как это:

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

Это не работает, я получаю это исключение:

ORA-00904: "TRUE": недопустимый идентификатор

Как я понимаю, ключевое слово TRUE не распознается.

Как это сделать?

ответ

24

Вы можете создать функцию-оболочку, как это:

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

тогда звоните:

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

Это до вас, что действительные значения ignore_notfound в вашей версии, я предположил, что «ИСТИНА 'означает TRUE, а что-то еще означает FALSE.

+11

оторвать, это действительно немое ограничение – craigrs84

+8

Мне любопытно, как Oracle это обосновывает технически. –

-1

PL/SQL жалуется, что ИСТИНА не является допустимым идентификатором или переменной. Настройте локальную переменную, установите ее в TRUE и передайте ее в функцию get_something.

+4

Нет, Oracle SQL просто не может обрабатывать логические значения :-( –

+0

Plus, я хочу, чтобы использовать эту функцию в определении представления, а не внутри сценария –

+0

@Ula, Тони:. Тогда я думаю, оберточную функцию является самый подходящий способ. –

19

От documentation:

Вы не можете вставить значения TRUE и FALSE в столбец базы данных. Вы не можете выбрать или выбрать значения столбца в переменной BOOLEAN. Функции, вызванные из запроса SQL, не могут принимать никаких параметров BOOLEAN. Также нет встроенных функций SQL, таких как TO_CHAR; представлять BOOLEAN значения в объемах производства, вы должны использовать IF-THEN или CASE конструкции перевести BOOLEAN значения в какой-либо другой тип, например, 0 или 1, 'Y' или 'N', 'true' или 'false', и так далее.

Вам понадобится сделать функцию-обертку, которая использует тип данных SQL и использовать его вместо этого.

-1

Как об использовании выражение, которое приводится к TRUE (или FALSE)?

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

Это не работает, я получаю синтаксическую ошибку. –

+1

Не работает ... – GabrielOshiro

2

Скомпилируйте это в своей базе данных и приступите к использованию булевых операторов в ваших запросах.

примечание: функция get является параметром varchar2, поэтому не забудьте обернуть любые «строки» в вашем заявлении. Он вернет 1 для true и 0 для 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

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

Вы можете представлять булево значение с 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 

Возврат, 1 (в Hibernate/Mybatis/etc 1). В противном случае вы можете получить печатные логические значения из SELECT.

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

Это возвращает строку 'true'.

+1

Точно, что Я искал. Спасибо! – Baxter

+2

Полностью не имеет значения для вопроса. Вопрос не в том, «как использовать числа вместо логических». – cartbeforehorse

3
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;