将参数传递给 callableSatament - ORA-01008: 并非所有变量都绑定

Posted

技术标签:

【中文标题】将参数传递给 callableSatament - ORA-01008: 并非所有变量都绑定【英文标题】:Passing parameter to callableSatatement - ORA-01008: not all variables bound 【发布时间】:2021-07-03 19:58:46 【问题描述】:

我有一个带有参数的 PL/SQL 查询:

plSqlQuery =    "declare "
              + "  num integer := 1000;"
              + "  myStr varchar2(100):= ?;"
              + "begin "
              + "  dbms_output.put_line('abc');"
              + "  dbms_output.put_line('hello');"
              + "  dbms_output.put_line(myStr);"
              + "end;"

我的 Java 方法是这样的:

public static void getData(String sqlQuery) throws SQLException, IOException
    Statement s =conn.createStatement();
    try
    s.executeUpdate("begin dbms_output.enable();end;);
    s.executeUpdate(sqlQuery);
    
    try
    CallableStatement call = conn.prepareCall("declare num integer = 10000; begin dbms_output.get_lines(?, num); end;)
    
    call.registerOutParameter(1,Types.ARRAY, "DBMSOUTPUT_LINESARRAY");
    call.execute();
    
     Array array = null;
                    try 
                        array = call.getArray(1);
                        System.out.println(Arrays.asList((Object[]) 
                 array.getArray()));
                    
                    finally 
                        if (array != null)
                            array.free();
                    

现在有了以上两个,我想执行我的 getData 方法,但我不知道如何将参数传递给它 (myStr)。

您能告诉我应该在我的 Java 方法中的哪个位置设置字符串参数吗?

应该是这样的

s.setString(x, "abcdefg");

call.setString(2, "abcdefg");

它给了我一个类似的 Oracle 错误

ORA-01008:并非所有变量都绑定

说实话,我都试过了,但都没有成功。

【问题讨论】:

call.setString(x, "abcdefg"); 并更好地使用 executeQuery() 嗨@kofemann,我添加了 call.setString(2, "abcdefg"); call.executeQuery(): 但我收到类似“ORA-01008: not all variables bound”的错误 参考***.com/questions/47830370/…或许你也应该参考docs.oracle.com/javase/tutorial/jdbc/index.html 我做了,但是没有传递给 oracle pl/sql 的参数。没有参数它工作正常,我同意 【参考方案1】:

如果您将字符串 plSqlQuery 作为参数传递给您的 getData() 方法(例如,通过调用 getData(plSqlQuery)),那么您将遇到 ORA-01008 'not all variables bound' 错误,因为您正在未指定 ? 占位符的值。

您不能将普通的Statement 与占位符一起使用,而必须使用PreparedStatement

换行试试

    s.executeUpdate(sqlQuery);

    try (PreparedStatement pstmt = conn.prepareStatement(sqlQuery)) 
        pstmt.setString(1, "Some Value Here");
        pstmt.execute();
    

【讨论】:

【参考方案2】:

我想通了。 它适用于 3 种不同的语句:(

Statement s = conn.createStatement();
s.executeUpdate("begin dbms_output.enable();end;);

PreparedStatement ps = conn.prepareStatement(sqlQuery);
ps.setString(1, "abcdefg");

 CallableStatement call = conn.prepareCall("declare num integer = 10000; begin dbms_output.get_lines(?, num); end;)
 call.registerOutParameter(1,Types.ARRAY, "DBMSOUTPUT_LINESARRAY");
 call.execute();

【讨论】:

以上是关于将参数传递给 callableSatament - ORA-01008: 并非所有变量都绑定的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 Java 线程?

如何将参数传递给进程

如何通过反射将参数传递给方法

如何将参数传递给 erlang os:cmd()?

将 NSDictionary 作为参数传递给 UITapGestureRecognizer

如何将两个参数传递给 Pool.starmap()?