我试图从我的 .xsjs文件中调用java中的存储过程。该过程获得2个输入参数并返回一个。我可以通过编写SQL控制台来调用它:
call "MYSCHEMA"."MyPackage.procedures::addUserC50" ('name', 'lastname', ?)
这是我的 .xsjs文件中的代码,我认为它在 prepareCall 语句中失败了。我尝试了不同的组合(有和没有双引号,有和没有架构/包的名称,有和没有“(?,?,?)”,有和没有“{}”....但没有当我尝试执行它时,我总是得到500内部服务器错误。
有人知道错误的位置或 prepareCall 方法的确切语法是什么?
var output = 0,
query = "";
var conn;
var cstmt;
try {
conn = $.db.getConnection();
query = "{ call \"MYSCHEMA\".\"MyPackage.procedures/addUserC50\"(?,?,?) }";
cstmt = conn.prepareCall(query); // <-- Fails
cstmt.setString(1, userName);
cstmt.setString(2, userLastname);
cstmt.execute();
output = cstmt.getInteger(3);
conn.commit();
$.response.status = $.net.http.OK;
$.response.setBody("Successfully created: " + output);
}
catch (e) {
$.response.status = $.net.http.BAD_REQUEST;
$.response.setBody("0");
}
finally {
if (cstmt !== null)
cstmt.close();
if (conn !== null)
conn.close();
}
这是给出的错误:InternalError:dberror(Connection.prepareCall):328 - 函数或过程的名称无效:MyPackage.procedures / addUserC50:第1行第18行(位于第17位)ptime / query / checker /check_call.cc:21
根据这个documentation,它应该是
var myCallableStatement = myconnection.prepareCall("{call myprocedure(?)}");
谢谢
答案 0 :(得分:3)
我设法让它运行,这是有效的语法:
query = "call \"MyPackage.procedures::addUserC50\"(?, ?, ?)";
感谢您的帮助@shofmn
答案 1 :(得分:2)
呼叫失败可能有不同的原因。如果在HTTP响应中返回错误消息,则可以更轻松地调查错误。你可以很容易地做到这一点:
try {
// Your code execution here
}
catch (e) {
$.response.contentType = "text/html";
$.response.setBody(e.name + ": " + e.message));
}
如果错误消息无法帮助您解决问题,请在此处粘贴错误消息,以便我们更容易进行调查。