Java 使用JDBC在HANA中调用HANA存储过程时出现语法错误

Java 使用JDBC在HANA中调用HANA存储过程时出现语法错误,java,jdbc,hana,Java,Jdbc,Hana,调用HANA存储过程时出现语法错误。在Hana Studio的SQL编辑器中,它可以工作,但Java中的prepareCall的语法必须不同。我认为它是在包名后的正斜杠,但不确定该怎么做 是因为我在Content文件夹下创建了存储过程吗?它应该建在别的地方吗 这是转接电话。连接良好 Class.forName("com.sap.db.jdbc.Driver"); String url = "jdbc:sap://10.9.9.139:30015/

调用HANA存储过程时出现语法错误。在Hana Studio的SQL编辑器中,它可以工作,但Java中的prepareCall的语法必须不同。我认为它是在包名后的正斜杠,但不确定该怎么做

是因为我在Content文件夹下创建了存储过程吗?它应该建在别的地方吗

这是转接电话。连接良好

            Class.forName("com.sap.db.jdbc.Driver");

            String url = "jdbc:sap://10.9.9.139:30015/GL1";
            String user = "userid";
            String password = "password";

            cn = java.sql.DriverManager.getConnection(url, user, password);

            if (cn == null) {
                System.out.println("failed");
            }

            cs = cn.prepareCall("call '_SYS_BIC'.'myPackaged/ZMM_PR_MATERIALS_GET'"); <---- THROWS EXCEPTION BELOW
            rs = cs.executeQuery();
            while(rs.next()) {
                System.out.println(rs.getString(0));
            }
        } catch(Exception e) {
            e.printStackTrace();
        }

// this WORKS FINE... i get a connection and get some records.    
//          rs = cn.createStatement().executeQuery("SELECT * FROM MYSCHEMA.ORDERS");
//          int i = 0;
//          while (rs.next()) {
//              System.out.println(String.format("rec %2d: %s=%2s", ++i, "ORDER_ID", rs.getString("ORDER_ID")));
//          }



com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: [257]: sql syntax error: incorrect syntax near "_SYS_BIC": line 1 col 6 (at pos 6)
    at com.sap.db.jdbc.exceptions.SQLExceptionSapDB.createException(SQLExceptionSapDB.java:334)
    at com.sap.db.jdbc.exceptions.SQLExceptionSapDB.generateDatabaseException(SQLExceptionSapDB.java:174)
    at com.sap.db.jdbc.packet.ReplyPacket.buildExceptionChain(ReplyPacket.java:104)
    at com.sap.db.jdbc.ConnectionSapDB.execute(ConnectionSapDB.java:1106)
    at com.sap.db.jdbc.CallableStatementSapDB.sendCommand(CallableStatementSapDB.java:1961)
    at com.sap.db.jdbc.StatementSapDB.sendSQL(StatementSapDB.java:972)
    at com.sap.db.jdbc.CallableStatementSapDB.doParse(CallableStatementSapDB.java:253)
    at com.sap.db.jdbc.CallableStatementSapDB.constructor(CallableStatementSapDB.java:212)
    at com.sap.db.jdbc.CallableStatementSapDB.<init>(CallableStatementSapDB.java:123)
    at com.sap.db.jdbc.CallableStatementSapDBFinalize.<init>(CallableStatementSapDBFinalize.java:31)
    at com.sap.db.jdbc.ConnectionSapDB.prepareCall(ConnectionSapDB.java:1295)
    at com.sap.db.jdbc.trace.Connection.prepareCall(Connection.java:318)
    at com.glazers.hana.utils.HanaStoredProcedure.execute(HanaStoredProcedure.java:54)
    at com.glazers.hana.utils.HanaStoredProcedure.main(HanaStoredProcedure.java:20)
Class.forName(“com.sap.db.jdbc.Driver”);
String url=“jdbc:sap://10.9.9.139:30015/GL1";
字符串user=“userid”;
字符串password=“password”;
cn=java.sql.DriverManager.getConnection(url、用户、密码);
如果(cn==null){
System.out.println(“失败”);
}

cs=cn.prepareCall(“调用“\u SYS\u BIC.”“mypackated/ZMM\u PR\u MATERIALS\u GET”) 我的存储过程调用的问题是我没有逃逸双引号。语法仍然需要双引号才能正确处理包和正斜杠@马克·罗特维尔,你很接近。我不能用单引号代替双引号。这就是有效的方法:cn.prepareCall(“call\”\u SYS\u BIC\“\”myPackaged/ZMM\u PR\u MATERIALS\u GET\”)

您是否尝试过将其替换为
{call}
,因为这是驱动程序转换为服务器特定格式的JDBC转义。您还可以使用
'
作为标识符的引号,在大多数数据库实现中,被引用标识符的引号是双引号(
),有时是反勾(
`
)。通常为字符串文本保留一个引号。您好…是的..我已经尝试了100种方法..没有引号/是引号,没有包,是包..根本没有引号..没有模式,是模式..我能想到的每一个可能的是/否都是我尝试过的。thqt SAP不可能有一个调用存储过程的示例,该存储过程经过了解释并且可以工作吗?只有一个…我正在使用hana客户端jar,ng*.jar。我真的厌倦了SAP吹嘘他们的帮助之海。这是一个笑话。没什么。将存储过程调用到hana中应该很简单。我认为这是包语法的问题。那么,语法是什么?不幸的是,我不知道hana,所以我无法帮助你(谷歌搜索似乎没有找到有用的信息)。我感谢你的回复和努力。我会继续关注。有答案。当我回答时,我会返回并把它放在这里。能够通过Java调用访问Hana是一件很棒的事情。这是可以做到的,我也很想做到。再次感谢。我确信,这很简单。