Как использовать тип BOOLEAN в инструкции SELECT
У меня есть PL/SQL-функция с BOOLEAN в параметре:
function get_something(name in varchar2, ignore_notfound in boolean);
Эта функция является частью стороннего инструмента, я не могу это изменить.
Я хотел бы использовать эту функцию внутри оператора SELECT следующим образом:
select get_something('NAME', TRUE) from dual;
Это не работает, я получаю это исключение:
ORA-00904: "TRUE": неверный идентификатор
Как я понимаю, ключевое слово TRUE
не распознается.
Как я могу сделать эту работу?
Ответы
Ответ 1
Вы можете создать такую обертку, как это:
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 означает TRUE, а что-то еще означает FALSE.
Ответ 2
Вы можете получить Boolean значение из запроса SELECT, вы просто не можете использовать тип данных типа Boolean.
Вы можете представлять логическое значение с 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'
.
Ответ 3
Из документация:
Вы не можете вставить значения TRUE
и FALSE
в столбец базы данных. Вы не можете выбрать или выбрать значения столбца в переменной BOOLEAN
. Функции, вызываемые из запроса SQL
, не могут принимать какие-либо параметры BOOLEAN
. Также нет встроенных функций SQL
, таких как TO_CHAR
; для представления значений BOOLEAN
на выходе вы должны использовать конструкции IF-THEN
или CASE
для перевода значений BOOLEAN
в какой-либо другой тип, например 0
или 1
, 'Y'
или 'N'
, 'true'
или 'false'
и т.д.
Вам нужно будет создать функцию-обертку, которая использует тип данных SQL
и вместо этого использовать.
Ответ 4
Тип данных BOOLEAN - это данные PL/SQL тип. Oracle не предоставляет эквивалентный тип данных SQL (...), вы можете создать функцию-оболочку, которая отображает SQL для типа BOOLEAN.
Проверьте это: http://forums.datadirect.com/ddforums/thread.jspa?threadID=1771&tstart=0&messageID=5284
Ответ 5
Скомпилируйте это в своей базе данных и начните использовать логические операторы в ваших запросах.
note: функция получает параметр 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;
/
Ответ 6
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;
Ответ 7
Ответ на этот вопрос прост: не используйте BOOLEAN с Oracle-- PL/SQL тупой и не работает. Используйте другой тип данных для запуска вашего процесса.
Примечание для разработчиков отчетов SSRS с источником данных Oracle: вы можете использовать параметры BOOLEAN, но будьте осторожны при реализации. Oracle PL/SQL плохо работает с BOOLEAN, но вы можете использовать значение BOOLEAN в фильтре Tablix, если данные находятся в вашем наборе данных. Это действительно сбило меня с толку, потому что я использовал параметр BOOLEAN с источником данных Oracle. Но в этом случае я фильтровал данные Tablix, а не SQL-запросы.
Если данные НЕ находятся в ваших полях набора данных SSRS, вы можете переписать SQL-код примерно так, используя параметр INTEGER:
__
<ReportParameter Name="paramPickupOrders">
<DataType>Integer</DataType>
<DefaultValue>
<Values>
<Value>0</Value>
</Values>
</DefaultValue>
<Prompt>Pickup orders?</Prompt>
<ValidValues>
<ParameterValues>
<ParameterValue>
<Value>0</Value>
<Label>NO</Label>
</ParameterValue>
<ParameterValue>
<Value>1</Value>
<Label>YES</Label>
</ParameterValue>
</ParameterValues>
</ValidValues>
</ReportParameter>
...
<Query>
<DataSourceName>Gmenu</DataSourceName>
<QueryParameters>
<QueryParameter Name=":paramPickupOrders">
<Value>=Parameters!paramPickupOrders.Value</Value>
</QueryParameter>
<CommandText>
where
(:paramPickupOrders = 0 AND ordh.PICKUP_FLAG = 'N'
OR :paramPickupOrders = 1 AND ordh.PICKUP_FLAG = 'Y' )
Если данные находятся в ваших полях набора данных SSRS, вы можете использовать фильтр табликса с параметром BOOLEAN:
__
</ReportParameter>
<ReportParameter Name="paramFilterOrdersWithNoLoad">
<DataType>Boolean</DataType>
<DefaultValue>
<Values>
<Value>false</Value>
</Values>
</DefaultValue>
<Prompt>Only orders with no load?</Prompt>
</ReportParameter>
...
<Tablix Name="tablix_dsMyData">
<Filters>
<Filter>
<FilterExpression>
=(Parameters!paramFilterOrdersWithNoLoad.Value=false)
or (Parameters!paramFilterOrdersWithNoLoad.Value=true and Fields!LOADNUMBER.Value=0)
</FilterExpression>
<Operator>Equal</Operator>
<FilterValues>
<FilterValue DataType="Boolean">=true</FilterValue>
</FilterValues>
</Filter>
</Filters>
Ответ 8
В Oracle 12 вы можете использовать предложение WITH
для объявления ваших вспомогательных функций. Я предполагаю, что ваш get_something
функция возвращает varchar2
:
with
function get_something_(name varchar2, ignore_notfound number)
return varchar2
is
begin
-- Actual function call here
return get_something(name, not ignore_notfound = 0);
end get_something_;
-- Call auxiliary function instead of actual function
select get_something_('NAME', 1) from dual;
Конечно, вы могли бы также сохранить свою вспомогательную функцию где-нибудь в схеме, как показано в этом ответе, но, используя WITH
, у вас нет внешних зависимостей только для запуска этого запроса. Я подробно писал об этой технике здесь.
Ответ 9
Как насчет использования выражения, которое оценивается как TRUE (или FALSE)?
select get_something('NAME', 1 = 1) from dual
Ответ 10
PL/SQL жалуется, что TRUE не является допустимым идентификатором или переменной. Настройте локальную переменную, установите ее в TRUE и передайте ее в функцию get_something.