Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQL";索引“处缺少输入或输出参数”;_Java_Sql_Database_Oracle - Fatal编程技术网

Java SQL";索引“处缺少输入或输出参数”;

Java SQL";索引“处缺少输入或输出参数”;,java,sql,database,oracle,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 =

我有用于创建查询和执行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;

我做错了什么?

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

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

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    query.append(", dt_ => to_date('" + sdf.format(date)
        + "', 'YYYY-MM-DD HH24:MI:SS')");
您也不需要
调用
,因此请摆脱它。这将产生如下字符串(添加了换行符和缩进,使其更易于查看):

假设您的包过程声明为:

procedure set_client_relations(id_account_ number,
    phone_number_list_ owa_util.vc_arr, dt_ date);
。。。这个应该运行。当然,它是否能满足你的实际需求是另一回事

如果数据库与您的区域设置不匹配,您可能还需要对时区进行处理


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

过程是如何定义的-尤其是它的签名,除非从其中调用异常?传递给dt的日期字符串用单引号括起来。@vishad我很笨。请告诉我为什么不使用JDBCAPI调用或方法有什么特殊原因?遗留代码。我必须用这个=(
procedure set_client_relations(id_account_ number,
    phone_number_list_ owa_util.vc_arr, dt_ date);