有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在JavaJDBC中运行SQL(MYSQL)存储过程?

我是MySQL用户,在MySQL Workbench中使用了以下语句: (这些语句基于Select column names whose entries are not null

SET group_concat_max_len = 4294967295;

SELECT GROUP_CONCAT(
 ' SELECT ',QUOTE(COLUMN_NAME),
 ' FROM   ( select * from table_name where s3_01 = ', coloumn1,' ) abc',
 ' WHERE `',REPLACE(COLUMN_NAME, '`', '``'),'` IS NOT NULL',
 ' HAVING COUNT(*)'
SEPARATOR ' UNION ALL ')
INTO   @sql
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_SCHEMA = DATABASE()
   AND TABLE_NAME = 'table_name';

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

虽然它在我的工作台上工作,但我不知道如何使它在java中工作。 例如,我编写了以下代码:

String sql1 = "SET group_concat_max_len = 4294967295;";
String sql2 = " SELECT GROUP_CONCAT(' SELECT ',QUOTE(COLUMN_NAME), ' FROM   ( select * from ptc_weight where s3_01 = ',column1,' ) abc', ' WHERE `',REPLACE(COLUMN_NAME, '`', '``'),'` IS NOT NULL', ' HAVING COUNT(*)' SEPARATOR ' UNION ALL ') INTO   @sql FROM   INFORMATION_SCHEMA.COLUMNS WHERE  TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ptc_weight'; ";
String sql3 = " PREPARE stmt FROM @sql; ";
String sql4 = " EXECUTE stmt;"; 
String sql5 = " DEALLOCATE PREPARE stmt;";

String[] result = getResult(sql1+sql2+sql3+sql4+sql5);

public static String[][] getResult(String sql) {
        System.out.println(sql);
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String[][] resultTable = null;
        try {
            con = getCon();
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            ResultSetMetaData result = rs.getMetaData();
            int rowNum=0;
            // Go to the last row 
            rs.last(); 
            rowNum = rs.getRow(); 
        // Reset row before iterating to get data 
            rs.beforeFirst();
            int colNum = result.getColumnCount();

            resultTable = new String[rowNum][colNum];
            for(int itr1=0; itr1<rowNum; itr1++){
                rs.next();
                for(int itr2=0; itr2<colNum; itr2++){
                    resultTable[itr1][itr2] =     rs.getObject(itr2+1).toString();
                }
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            dbclose(con, ps, rs);
        }// finally
        return resultTable;
    }

但是,它不起作用。我猜我在使用存储过程时编写了一个错误的代码,但我不知道如何处理这个问题


共 (1) 个答案

  1. # 1 楼答案

    CallableStatement callableStatement = null;
    
    String getDBUSERByUserIdSql = "{call getDBUSERByUserId(?,?,?,?)}";
    callableStatement.setInt(1, 10);
    callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR);
    callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
    callableStatement.registerOutParameter(4, java.sql.Types.DATE);
    
    // execute getDBUSERByUserId store procedure
    callableStatement.executeUpdate();
    
    String userName = callableStatement.getString(2);
    String createdBy = callableStatement.getString(3);
    Date createdDate = callableStatement.getDate(4);
    
    System.out.println("UserName : " + userName);
    System.out.println("CreatedBy : " + createdBy);
    System.out.println("CreatedDate : " + createdDate);
    

    Here Is Full Example。您可以根据需要修改代码

    具有较少参数和resultset的简单示例:

    CallableStatement cstmt = con.prepareCall("{call getEmployeeDetails(?, ?)}");
    cstmt.setInt("employeeId", 123);
    cstmt.setInt("companyId", 456);
    ResultSet rs = cstmt.executeQuery();