如何在SELECT语句中使用BOOLEAN类型

时间:2009-09-23 11:25:47

标签: sql oracle plsql oracle10g ora-00904

我在参数:

中有一个带有BOOLEAN的PL / SQL函数
function get_something(name in varchar2, ignore_notfound in boolean);

此功能是第三方工具的一部分,我无法改变它。

我想在SELECT语句中使用这个函数,如下所示:

 select get_something('NAME', TRUE) from dual;

这不起作用,我得到了这个例外:

  

ORA-00904:“TRUE”:标识符无效

据我了解,无法识别关键字TRUE

我该如何做到这一点?

9 个答案:

答案 0 :(得分:47)

您绝对可以从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

返回1(在Hibernate / Mybatis / etc 1中为真)。否则,您可以从SELECT获得可打印的布尔值。

SELECT CASE WHEN (10 > 0) THEN 'true' ELSE 'false' END AS MY_BOOLEAN_COLUMN
 FROM DUAL

返回字符串'true'

答案 1 :(得分:26)

您可以构建这样的包装函数:

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 :(得分:20)

来自documentation

  

您无法将值TRUEFALSE插入数据库列。您无法在BOOLEAN变量中选择或获取列值。从SQL查询调用的函数不能使用任何BOOLEAN个参数。内置SQL函数(例如TO_CHAR)也不能;要在输出中表示BOOLEAN值,您必须使用IF-THENCASE构造将BOOLEAN值转换为其他类型,例如0或{{1 }},1'Y''N''true',等等。

您需要创建一个包含'false'数据类型并使用它的包装函数。

答案 3 :(得分:5)

  

BOOLEAN数据类型是PL / SQL数据   类型。 Oracle没有提供   您可以使用等效的SQL数据类型(...)   创建一个映射a的包装函数   SQL类型为BOOLEAN类型。

请检查:http://forums.datadirect.com/ddforums/thread.jspa?threadID=1771&tstart=0&messageID=5284

答案 4 :(得分:2)

在您的数据库中编译它并在您的查询中开始使用布尔语句。

注意:函数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;
/

答案 5 :(得分:0)

这个问题的答案简单地说是:不要将BOOLEAN与Oracle一起使用-PL / SQL是愚蠢的,并且不起作用。使用其他数据类型运行您的进程。

带有Oracle数据源的SSRS报表开发人员注意事项:您可以使用BOOLEAN参数,但要小心实现。 Oracle PL / SQL在BOOLEAN上不能很好地发挥作用,但是如果数据位于数据集中,则可以在Tablix过滤器中使用BOOLEAN值。这真的让我感到震惊,因为我已经将BOOLEAN参数用于Oracle数据源。但是在那种情况下,我过滤的是Tablix数据,而不是SQL查询。

如果数据不在您的SSRS数据集字段中,则可以使用INTEGER参数来重写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数据集字段中,则可以使用带有BOOLEAN参数的tablix过滤器:

__

</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>

答案 6 :(得分:0)

在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;

当然,您也可以将辅助功能存储在模式as shown in this answer中的某个位置,但是通过使用WITH,您没有任何外部依赖项就可以运行此查询。 I've blogged about this technique more in detail here

答案 7 :(得分:-2)

如何使用计算结果为TRUE(或FALSE)的表达式?

select get_something('NAME', 1 = 1) from dual

答案 8 :(得分:-3)

PL / SQL抱怨TRUE不是有效的标识符或变量。设置局部变量,将其设置为TRUE,并将其传递给get_something函数。