我已经在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>
它被评估为'?'
有人知道原因吗? 谢谢。
答案 0 :(得分:1)
您不能在查询字符串中混用语言。但是,如果您使用以下默认值表达式声明cardTable
参数:
( “CPM”.equals($P{searchMainCardType})
? “TM_PROCESSOR_CARD_INFO_VIEW”
: “TM_DAUGHTER_CARD_INFO_VIEW”
) + “ a”
因此您可以在查询字符串中使用
SELECT s.BOARD_NUMBER
FROM $P!{cardTable}
请注意感叹号!
,这将强制进行字符串替换,包括表别名s
,而不是值的转义和占位。