从 JAVA 代码中的 ORACLE 表函数中选择多行

Posted

技术标签:

【中文标题】从 JAVA 代码中的 ORACLE 表函数中选择多行【英文标题】:Select multirows from ORACLE table function in JAVA code 【发布时间】:2018-02-03 16:11:54 【问题描述】:

在 ORACLE(11g) 中,在某些包中我有一个返回表的函数:

SELECT * FROM TABLE( my_PKG.fnc_myList());

因此它可以完美地在 Oracle SQL Developer 工具中运行,例如。我在 SQL DeveloperQuery Result 中从目标表中获取了行。 问题: 它可以从 JAVA (8) 代码中工作吗? 我尝试了以下代码:

        con = DriverManager.getConnection(...);
        String SQLQ = "SELECT * FROM TABLE( my_PKG.fnc_myList());";
        Statement st =con.createStatement();
        rs=st.executeQuery(SQLQ);
        while (rs.next()) 
            int id = rs.getInt(0);
            String name = rs.getString(1);
            ....
        

但得到了错误:

java.sql.SQLSyntaxErrorException: ORA-00900: 无效的 SQL 语句

是不是我错了,或者它根本无法通过 JDBC 驱动程序工作?

【问题讨论】:

TABLE( my_PKG.fnc_myList()) 替换为DUAL不更改任何其他内容,看看会发生什么。祝你好运。 为什么要将语句包装在 JDBC 转义中? JDBC 转义仅适用于 JDBC 规范中定义的那些。 【参考方案1】:

您不应使用大括号或分号。如果只调用存储过程,有时会使用大括号。但是你有一个 SELECT 语句(即使它包含一个函数)。而分号仅用于 PL/SQL 或 SQL developer 等工具中用于分隔语句:

con = DriverManager.getConnection(...);
    String SQLQ = "SELECT * FROM TABLE( my_PKG.fnc_myList())";
    Statement st =con.createStatement();
    rs=st.executeQuery(SQLQ);
    while (rs.next()) 
        int id = rs.getInt(0);
        String name = rs.getString(1);
        ....
    

【讨论】:

Ringo Store,您的解决方案按我的预期工作。我的 """;" 是“匆忙”的错误。感谢您的帮助,我已经对答案投了赞成票。

以上是关于从 JAVA 代码中的 ORACLE 表函数中选择多行的主要内容,如果未能解决你的问题,请参考以下文章

从 Spring JAVA 中的 oracle PLSQL 函数获取结果集时出错

如果存在则从表中选择,否则从oracle中的另一个表中选择

Oracle 过程不是按函数分组的错误 00979

oracle group by 性能优化

从数据库系统表中选择所有索引,根据Oracle中的索引聚合数据

Oracle过程 - 选择所有表,然后循环遍历这些表的记录