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

kmynzznz  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(423)

我有一个带参数的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");

它给了我一个甲骨文错误,比如
ora-01008:并非所有变量都已绑定
我尽力做到诚实,但没有成功。

yzxexxkh

yzxexxkh1#

如果你正在传递你的字符串 plSqlQuery 作为您的 getData() 方法(例如,通过调用 getData(plSqlQuery) )然后您将遇到ora-01008“未绑定所有变量”错误,因为您没有为 ? 占位符。
你不能用普通的 Statement 对于占位符,必须使用 PreparedStatement 相反
试着换一条线

s.executeUpdate(sqlQuery);

具有

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

u2nhd7ah2#

我想出来了。它使用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();

相关问题