Как использовать логический тип в инструкции 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


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

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

Примечание: функция 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