java - SQL "missing in or out parameter at index"

标签 java sql database oracle

我有这个代码用于创建查询并执行 sql 过程,但我捕获了丢失异常

public String generateQuery(Integer idAccount, Long[] phoneList, Date date){
    StringBuilder query=new StringBuilder();
    query.append("declare arr_pn owa_util.vc_arr;\n");
    query.append("begin\n");
    int idx = 1;
    for (Long p : phoneList)
    { query.append("arr_pn(" + idx + "):='" + String.valueOf(p) + "';\n"); idx++; }
    query.append("call LOC_MAINCLIENT.set_client_relations(");
    query.append("id_account_ => " + idAccount);
    query.append(", phone_number_list_ => arr_pn");
    query.append(", dt_ => " + date);
    query.append("); end;");

    return String.valueOf(query);
}

之后我收到这个查询

declare arr_pn owa_util.vc_arr;
begin
arr_pn(1):='12345';
arr_pn(2):='678970';
arr_pn(3):='5675675';
call LOC_MAINCLIENT.set_client_relations(id_account_ => 123, phone_number_list_ => arr_pn, dt_ => Sun Mar 24 21:54:00 NOVT 2013); end;

我做错了什么?

最佳答案

目前日期字符串没有被引用,所以它无论如何都是有效的,但是冒号将被解析器解释为绑定(bind)变量标记;具体来说,它将寻找绑定(bind)变量:54 和:00。

快速的答案是将日期字符串放入引号中。但是该日期格式不太可能与您的数据库( session )所期望的相匹配,因此您需要将日期格式化为它可以使用的字符串,并提供格式以避免歧义。

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    query.append(", dt_ => to_date('" + sdf.format(date)
        + "', 'YYYY-MM-DD HH24:MI:SS')");

您也不需要调用,所以摆脱它。这将产生一个像这样的字符串(添加换行符和缩进以使其更容易查看):

declare
  arr_pn owa_util.vc_arr;
begin
  arr_pn(1):='12345';
  arr_pn(2):='678970';
  arr_pn(3):='5675675';
  LOC_MAINCLIENT.set_client_relations(id_account_ => 123,
    phone_number_list_ => arr_pn,
    dt_ => to_date('2013-03-24 21:54:00', 'YYYY-MM-DD HH24:MI:SS'));
end;

假设您的包过程声明为:

procedure set_client_relations(id_account_ number,
    phone_number_list_ owa_util.vc_arr, dt_ date);

...这应该运行。当然,它是否达到您真正想要的效果是另一回事。

如果数据库与您的区域设置不匹配,您可能还需要对时区进行一些操作。

正确的方法是使用准备好的语句,提供所有值作为绑定(bind)变量,并传递正确的数据类型 - 将日期作为日期而不是字符串表示形式传递。对于数组来说,这有点复杂,但肯定是可行的。您已经说过这是遗留代码,您必须使用它,但您仍然应该研究切换到绑定(bind)变量。

关于java - SQL "missing in or out parameter at index",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24484709/

相关文章:

sql - SQL 中 CREATE NEW TABLE AS 中的 FOREIGN KEY

android - 删除多个项目与数据库的上下文操作模式

java - 如何在 Java Web 中返回下拉列表的名称和值?

java - 使用 ASM 重新排列 GOTO [JAVA]

mysql - SQL获取给定小时内金额最高的记录

php - 使用 PHP 从平面文件数据库中读取

mysql - 将数据从mssql迁移到mysql的问题

java - 如何从 JSON 文本中获取 url

java - 如何从jsp页面中删除List<>中的元素?

sql - 找到所有不是 parent 的 child