Как использовать логический тип в инструкции 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
не признала.
как я могу сделать эта работа?
9 ответов
Вы можете создать функцию-обертку так:
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.
вы можете определенно получить логическое значение из запроса 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
Returns, 1 (в Hibernate/Mybatis/etc 1 истинно). В противном случае можно получить логические значения для печати из SELECT.
SELECT CASE WHEN (10 > 0) THEN 'true' ELSE 'false' END AS MY_BOOLEAN_COLUMN
FROM DUAL
Это возвращает строку 'true'
.
С документация:
вы не можете вставить значения
TRUE
иFALSE
в столбец базы данных. Вы не можете выбрать или получить значения столбцов вBOOLEAN
переменной. Функции, вызываемые изSQL
запрос не может принимать какие-либоBOOLEAN
параметры. Ни один не может встроенныйSQL
функции, такие какTO_CHAR
; представлятьBOOLEAN
значения в выходных данных, вы должны использоватьIF-THEN
илиCASE
конструкции для переводаBOOLEAN
значения в какой-то другой тип, например0
или1
,'Y'
или'N'
,'true'
или'false'
и так далее.
вам нужно будет сделать функцию-обертку, которая принимает SQL
тип данных и использовать его вместо.
булевым типом данных являются данные PL / SQL тип. Oracle не даст эквивалентный тип данных SQL (...) вы можете создайте функцию-оболочку, которая отображает В SQL типа В тип boolean.
проверьте это: http://forums.datadirect.com/ddforums/thread.jspa?threadID=1771&tstart=0&messageID=5284
скомпилируйте это в своей базе данных и начните использовать логические операторы в своих запросах.
Примечание: функция 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;
/
ответ на этот вопрос проще говоря: не используйте BOOLEAN с Oracle-- PL / SQL немой, и он не работает. Используйте другой тип данных для запуска процесса.
Примечание Для разработчиков отчетов SSRS с Oracle datasource: вы можете использовать логические параметры, но будьте осторожны при реализации. Oracle PL / SQL не очень хорошо играет с BOOLEAN, но вы можете использовать логическое значение в фильтре Табликса, если данные находятся в вашем наборе данных. Это действительно сбило меня с толку., потому что я использовал логический параметр с источником данных Oracle. Но в этом случае я фильтровал данные Табликса, а не SQL-запрос.
Если данных нет в Ваших полях набора данных SSRS, вы можете переписать SQL что-то вроде этого, используя целочисленный параметр:
__
<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, можно использовать фильтр табликса с логическим параметром:
__
</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>
PL / SQL жалуется, что TRUE не является допустимым идентификатором или переменной. Настройте локальную переменную, установите для нее значение TRUE и передайте ее в функцию get_something.
Как насчет использования выражения, которое оценивается как TRUE (или FALSE)?
select get_something('NAME', 1 = 1) from dual