简单地说,这个问题的答案是:不要将 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>