三元运算符导致索引处缺少 IN 或 OUT 参数

Ternary operator causing Missing IN or OUT parameter at index

我在 Jasper 报告中的 <queryString> 标记中编写了一个简单的查询

select s.BOARD_NUMBER, s.LOCATION_NAME, s.SHELF_NO, s.REGION_NAME, s.SERIAL_NUMBER, s.CARD_DISPLAYTYPE, s.CITY_NAME, s.PLUGGED_DATE, s.ROUTER_NAME
                $P{searchMainCardType} == "CPM" ? from TM_PROCESSOR_CARD_INFO_VIEW s : from TM_DAUGHTER_CARD_INFO_VIEW

此查询在 iReport 中 运行 连接到 Oracle 数据库。我已经测试了查询

select s.BOARD_NUMBER, s.LOCATION_NAME, s.SHELF_NO, s.REGION_NAME, s.SERIAL_NUMBER, s.CARD_DISPLAYTYPE, s.CITY_NAME, s.PLUGGED_DATE, s.ROUTER_NAME
                from TM_PROCESSOR_CARD_INFO_VIEW s

它运行良好,但是当我在第一个查询中使用三元运算符时出现错误

Error filling print... Error executing SQL statement for : unpluggedSwitchesHaes 
net.sf.jasperreports.engine.JRException: Error executing SQL statement for : unpluggedSwitchesHaes      at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:240)      at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:1114)      at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:691)      at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:1314)      at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:931)      at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:873)      at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:87)      at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:287)      at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:760)      at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:891)      at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)      at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997)  Caused by: java.sql.SQLException: Missing IN or OUT parameter at index:: 2      at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2076)      at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4790)      at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:4845)      at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1501)      at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:233)      ... 11 more

我做错了什么?


编辑:经过更多研究后发现参数值没有被正确获取:

<parameter name="searchMainCardType" class="java.lang.String"/>
    <queryString>
        <![CDATA[select s.BOARD_NUMBER, s.LOCATION_NAME, s.SHELF_NO, s.REGION_NAME, s.SERIAL_NUMBER, s.CARD_DISPLAYTYPE, s.CITY_NAME, s.PLUGGED_DATE, s.ROUTER_NAME
                from $P{searchMainCardType} s]]>
    </queryString>

它被评估为“?”

有谁知道原因吗? 谢谢。

您不能在查询字符串中混用多种语言。但是,如果您使用以下默认值表达式声明 cardTable 参数:

( “CPM”.equals($P{searchMainCardType}) 
? “TM_PROCESSOR_CARD_INFO_VIEW”
: “TM_DAUGHTER_CARD_INFO_VIEW”
) + “ a”

因此您可以在查询字符串中使用:

SELECT s.BOARD_NUMBER
  FROM $P!{cardTable}

注意感叹号 !,这将强制字符串替换包括 table 别名 s 而不是值转义和占位。