Получение недопустимой ошибки типа данных при передаче параметра в функцию [duplicate]

Я думаю, что это лучше справится с этим:

my_dict = {0: "c", 1: "d", 2: "e", 3: "f"}

def validate(x, y, z):
    for ele in [x, y, z]:
        if ele in my_dict.keys():
            return my_dict[ele]

Выход:

print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
46
задан AHiggins 2 December 2015 в 18:21
поделиться

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.

26
ответ дан Tony Andrews 25 August 2018 в 00:33
поделиться

Вы можете получить 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'.

41
ответ дан Ben 25 August 2018 в 00:33
поделиться

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

-1
ответ дан David Andres 25 August 2018 в 00:33
поделиться

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

select get_something('NAME', 1 = 1) from dual
-1
ответ дан Gart 25 August 2018 в 00:33
поделиться

Из документации :

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

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

19
ответ дан gerardnico 25 August 2018 в 00:33
поделиться

Тип данных BOOLEAN - это тип данных PL / SQL. Oracle не предоставляет эквивалентный тип данных SQL (...), вы можете создать функцию-оболочку, которая отображает тип SQL в тип BOOLEAN.

Проверьте это: http: / /forums.datadirect.com/ddforums/thread.jspa?threadID=1771&tstart=0&messageID=5284

5
ответ дан JuanZe 25 August 2018 в 00:33
поделиться

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

note: функция 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;
/
2
ответ дан Lunc 25 August 2018 в 00:33
поделиться

Ответ на этот вопрос просто поставлен: Не используйте BOOLEAN с Oracle - PL / SQL немой, и он не работает. Для запуска процесса используйте другой тип данных.

Замечание для разработчиков отчетов SSRS с использованием Oracle datasource: вы можете использовать параметры BOOLEAN, но будьте осторожны с тем, как вы реализуете. Oracle PL / SQL отлично не работает с BOOLEAN, но вы можете использовать значение BOOLEAN в Tablix Filter, если данные находятся в вашем наборе данных. Это действительно сработало, потому что я использовал параметр BOOLEAN с источником данных Oracle. Но в этом случае я фильтровал данные Tablix, а не SQL-запрос.

Если данные НЕ находятся в ваших полях SSRS Dataset, вы можете переписать 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 Dataset Fields, вы можете использовать фильтр tablix с параметром 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>
0
ответ дан SherlockSpreadsheets 25 August 2018 в 00:33
поделиться
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;
2
ответ дан user527987 25 August 2018 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: