62

我有一个带有 BOOLEAN 参数的 PL/SQL 函数:

function get_something(name in varchar2, ignore_notfound in boolean);

此功能是第 3 方工具的一部分,我无法更改。

我想在这样的 SELECT 语句中使用这个函数:

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

这不起作用,我得到这个异常:

ORA-00904: "TRUE": 无效标识符

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

我怎样才能使这项工作?

4

10 回答 10

53

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

于 2011-11-04T14:34:55.260 回答
31

您可以像这样构建一个包装函数:

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。

于 2009-09-23T11:32:24.140 回答
23

文档

您不能将值插入TRUEFALSE数据库列中。您不能选择列值或将列值提取到BOOLEAN变量中。从查询调用的函数SQL不能接受任何BOOLEAN参数。SQL诸如TO_CHAR;之类的内置函数也不能。要在输出中表示BOOLEAN值,您必须使用IF-THENorCASE构造将BOOLEAN值转换为其他类型,例如0or 1'Y'or 'N''true'or'false'等​​。

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

于 2009-09-23T11:32:40.737 回答
5

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

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

于 2009-09-23T11:35:13.360 回答
3
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;
于 2011-12-27T07:20:45.330 回答
2

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

注意:函数 get 是一个 varchar2 参数,所以一定要在你的语句中包含任何“字符串”。它将返回 1 表示真,0 表示假;

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;
/
于 2011-01-13T15:24:19.120 回答
2

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

当然,您也可以将辅助函数存储在架构中的某个位置,如this answer所示,但是通过使用WITH,您没有任何外部依赖项来运行此查询。我在这里更详细地介绍了这种技术

于 2019-04-16T13:01:33.000 回答
0

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

给使用 Oracle 数据源的 SSRS 报告开发人员的注意事项: 您可以使用 BOOLEAN 参数,但要小心您的实现方式。Oracle PL/SQL 不能很好地使用 BOOLEAN,但如果数据位于数据集中,您可以在 Tablix 过滤器中使用 BOOLEAN 值。这真的让我大吃一惊,因为我在 Oracle 数据源中使用了 BOOLEAN 参数。但在那种情况下,我过滤的是 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>
于 2018-08-14T15:41:20.367 回答
-2

使用计算结果为 TRUE(或 FALSE)的表达式怎么样?

select get_something('NAME', 1 = 1) from dual
于 2009-09-23T11:38:33.643 回答
-4

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

于 2009-09-23T11:32:18.290 回答