我有一个在参数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
不被认可。
我怎样才能使这项工作?
Answer 1:
你可以建立一个像这样的包装函数:
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”意味着真别的意思FALSE。
Answer 2:
你绝对可以从一个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(在休眠/ MyBatis的/等1为真)。 否则,你可以从一个SELECT获取打印布尔值。
SELECT CASE WHEN (10 > 0) THEN 'true' ELSE 'false' END AS MY_BOOLEAN_COLUMN
FROM DUAL
这将返回字符串'true'
。
Answer 3:
从文档 :
你可以不插入值TRUE
和FALSE
到数据库列。 你不能选择或取列值转换为BOOLEAN
变量。 从调用函数SQL
查询不能采取任何BOOLEAN
参数。 也不能内置SQL
功能,如TO_CHAR
; 代表BOOLEAN
在输出值,则必须使用IF-THEN
或CASE
构建翻译BOOLEAN
值插入一些其它类型的,如0
或1
, 'Y'
或'N'
, 'true'
或'false'
,等。
你需要做一个包装函数,它的SQL
数据类型,并用它来代替。
Answer 4:
布尔数据类型是一个PL / SQL数据类型。 Oracle不提供等效的SQL数据类型(......),你可以创建其中SQL类型布尔类型映射的包装功能。
检查: http://forums.datadirect.com/ddforums/thread.jspa?threadID=1771&tstart=0&messageID=5284
Answer 5:
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;
Answer 6:
在你的数据库编译这一点,并开始在querys使用布尔语句。
注意:该功能GET是一个VARCHAR2 PARAM,所以一定要在你的语句来包装任何“线”。 这将返回FALSE 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;
/
Answer 7:
回答这个问题,简单的说就是:不要使用布尔与Oracle-- PL / SQL是愚蠢的,它不工作。 使用另一种数据类型来运行您的程序。
一个注SSRS报表开发人员使用Oracle数据源:您可以使用布尔参数,但要小心你如何实现。 甲骨文的PL / SQL不布尔发挥很好,但如果数据驻留在你的数据集,你可以使用Tablix中的布尔值过滤器。 这真的绊倒了我,因为我已经使用布尔参数与Oracle数据源。 但在这种情况下,我对过滤Tablix数据,而不是SQL查询。
如果数据是不是在你的SSRS数据集字段,你可以使用整数参数重写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数据集字段,你可以使用带有一个布尔参数表矩阵过滤器:
__
</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>
Answer 8:
随着甲骨文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;
当然,你可能还存储在您的辅助功能某处架构如图这个答案 ,但是通过使用WITH
,你没有任何外部的依赖只是为了运行此查询。 我在这里的博客上讲述这个技术更详细 。
Answer 9:
如何有关使用其评估为TRUE(或FALSE)的表达式?
select get_something('NAME', 1 = 1) from dual
Answer 10:
PL / SQL抱怨并TRUE是不是一个有效标识符,或可变的。 设置一个局部变量,将其设置为TRUE,并把它传递到get_something功能。
文章来源: How to use BOOLEAN type in SELECT statement