java - 如何在JAVA jdbc中运行SQL(MYSQL)存储过程?

标签 java mysql sql jdbc mysql-workbench

我是 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;
    }

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

最佳答案

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 。您可以根据需要修改代码。

参数较少且带有结果集的简单方法:

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

关于java - 如何在JAVA jdbc中运行SQL(MYSQL)存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23340768/

相关文章:

mysql - 为什么 column = upper(column) 在 Oracle 中有效而在 MySQL 中无效?

java - JDateChooser setDate 调用意外结束执行

java - 显示 Hibernate 属性值

c# - 在一个数据库中合并 MVC4 和 Symfony2 用户

mysql - 如何在 mysql 中选择 min 从 cast varchar 到 int

mysql - 导入 CSV 从现有表中提取一列字段

sql - Oracle 中的确定性 stats_mode

JavaFX 获取单个调整大小事件

Java - 日期时区转换

mysql - 在mysql中为用户授予自定义权限