存储过程代码如下
delimiter//
create procedure test2(out b varchar(20))
begin
set b='CYL';
end//
delimiter;java代码如下
package SQL_Connection;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Properties;public class Test {

public static void main(String[] args) {
Properties properties=new Properties();
try {
properties.load(new FileInputStream("SQL_Connection/database.properties"));
System.setProperty("jdbc.drivers", properties.getProperty("jdbc.drivers"));
Connection con=DriverManager.getConnection(properties.getProperty("jdbc.url"));
Statement stat=con.createStatement();
String sql="use test";
stat.execute(sql);

sql="{call test2(?)}";
CallableStatement callAble=con.prepareCall(sql);
callAble.registerOutParameter(1, Types.VARCHAR);
callAble.execute();
System.out.println(callAble.getString(1));
con.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}但我运行的时候总是会出如下SQLException: [MySQL][ODBC 3.51 Driver][mysqld-5.0.51b-community-nt]OUT or INOUT argument 1 for routine test.test2 is not a variable or NEW pseudo-variable in BEFORE trigger
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLExecute(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(Unknown Source)
at SQL_Connection.Test.main(Test.java:29)
献上50分望高人解答

解决方案 »

  1.   

    test.test2 问题出在这里吧,sql="{call test2(?)}";
      

  2.   

    callAble.registerOutParameter(1, Types.VARCHAR改成
    callAble.registerOutParameter(1, Types.VARCHAR2)试一下
      

  3.   

    不行哦,Types没VARCHAR2这个常量的。不知道问题出在哪啊,我要抓狂了。
      

  4.   


    create procedure test2(out b varchar(20))
    begin                            
    set b='CYL';
    end//
    sql="{call test2(?)}";  //1
    CallableStatement callAble=con.prepareCall(sql);  //2
    callAble.registerOutParameter(1, Types.VARCHAR);  //3
       ......
    你最好用debug看一下执行的时候错误出现在第几句.我猜测是会出现在第3句,因为参数里面的1在sql中没有跟他相匹配的。
      

  5.   


    是callAble.execute();这句错了。
    但参数为什么没匹配我就想不通了。
      

  6.   

    过程的参数b是out类型的,只能用来输出,不能用来接收参数.
    改为outin吧,可出可入喵~~`
      

  7.   

    程序中也是输出参数啊。
    callAble.registerOutParameter(1, Types.VARCHAR);
    不就是吗?
      

  8.   


            sql="{call test2(?)}";
            callAble=con.prepareCall(sql);
            callAble.registerOutParameter(1, Types.VARCHAR);
            callAble.execute();
            System.out.println(callAble.getString(1));这个代码测试没问题!
      

  9.   


    public class GenerateSampleData {
    public void select() {

    String sql="";
    Connection con = null;
    CallableStatement callAble=null;

    try{
    Class.forName("com.mysql.jdbc.Driver");
    String url="jdbc:mysql://localhost:3306/test";
    con = DriverManager.getConnection(url, "abc", "abc");
    sql="{call test2(?)}";
                    callAble=con.prepareCall(sql);
                    callAble.registerOutParameter(1, Types.VARCHAR);
                    callAble.execute();
                    System.out.println(callAble.getString(1));
    }catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    }finally{
    try {
    callAble.close();
    con.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    } }
    /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    GenerateSampleData g = new GenerateSampleData();
    g.select(); }}测试正常,输出CYL
      

  10.   


    谢谢这位美女,我唯一与你不同的就是数据库驱动不同,我用的是"jdbc/odbc桥",你用的是mysql的"jdbc"驱动,可能是驱动的问题。我再观望下。