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

问题描述 投票:49回答:10

我在参数中有一个带有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无法识别。

我怎样才能做到这一点?

sql oracle plsql oracle10g ora-00904
10个回答
27
投票

你可以构建一个这样的包装器函数:

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。


-4
投票

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


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'


20
投票

来自documentation

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

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


5
投票

BOOLEAN数据类型是PL / SQL数据类型。 Oracle不提供等效的SQL数据类型(...),您可以创建一个将SQL类型映射到BOOLEAN类型的包装函数。

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


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

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

0
投票

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

SSRS报告开发人员使用Oracle数据源的注释:您可以使用BOOLEAN参数,但要小心如何实现。 Oracle PL / SQL与BOOLEAN不能很好地协作,但如果数据位于数据集中,则可以在Tablix Filter中使用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>

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


-2
投票

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

select get_something('NAME', 1 = 1) from dual
© www.soinside.com 2019 - 2024. All rights reserved.