Подтвердить что ты не робот

Как использовать тип 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 не распознается.

Как я могу сделать эту работу?

4b9b3361

Ответ 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 и вместо этого использовать.

Ответ 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.