我在参数:
中有一个带有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
。
我该如何做到这一点?
答案 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)
您无法将值
TRUE
和FALSE
插入数据库列。您无法在BOOLEAN
变量中选择或获取列值。从SQL
查询调用的函数不能使用任何BOOLEAN
个参数。内置SQL
函数(例如TO_CHAR
)也不能;要在输出中表示BOOLEAN
值,您必须使用IF-THEN
或CASE
构造将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函数。