2

我正在尝试从我的.xsjs 文件中调用 java 中的存储过程。该过程获取 2 个输入参数并返回一个。我可以通过以下方式从 SQL 控制台毫无问题地调用它:

call "MYSCHEMA"."MyPackage.procedures::addUserC50" ('name', 'lastname', ?)

这是我的.xsjs 文件中的代码,我认为它在prepareCall语句中失败。我尝试了不同的组合(带和不带双引号,带和不带模式/包的名称,带和不带“(?,?,?)”,带和不带“{}”......但什么都没有工作,当我尝试执行它时,我总是得到 500 Internal server error。

有谁知道错误在哪里或者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 - invalid name of function or procedure: MyPackage.procedures/addUserC50: line 1 col 18 (at pos 17) at ptime/query/checker/check_call。抄送:21

根据此文档,它应该类似于

var myCallableStatement = myconnection.prepareCall("{call myprocedure(?)}");

谢谢

4

2 回答 2

3

我设法让它运行,这是有效的语法:

query = "call \"MyPackage.procedures::addUserC50\"(?, ?, ?)";

感谢您的帮助@shofmn

于 2014-05-01T13:38:57.183 回答
2

呼叫失败可能有不同的原因。如果您在 HTTP 响应中返回错误消息,则可以更轻松地调查您的错误。您可以轻松地做到这一点:

try {
   // Your code execution here
}
catch (e) {
   $.response.contentType = "text/html";
   $.response.setBody(e.name + ": " +  e.message));
}

如果错误消息不能帮助您解决问题,请将错误消息粘贴到此处,以便我们也更容易调查。

于 2014-04-30T16:40:08.103 回答