SQL中 exec和call的使用

今天在读取数据库的时候,搞了一上午,遇到个坑,归根结底还是术业不精!  由于对执行命令 CALL和EXEC的无知,数据库的无知,以前学过,忘记了。
还得加强学习啊。

从开发小姐姐那儿得到的是这么一句SQL语句(开发代码里面的如下):

String spSQL = "{call DB***..balabalaTable}";

可是在之前我想开发要的时候给我的是这么个语句:

exec DB***..balabalaTable

可能是开发好心的将call改成了exec,为了方便我在数据库中直接查询, 怕我不知道。于是我就懵逼了,查了半天才知道是存储过程等等,也没弄明白。就一直在那写代码call。

最后弄明白
在数据库里面可以直接这样执行CALL,但是要加{}:
SQL中 exec和call的使用_第1张图片

也就是在数据库中直接查询以下是等价的:

exec DataIndex..balabalaReport
等价于
{call DataIndex..PDF_getListOfStocksForERReport}

就一句话:

exec是sqlplus的命令,只能在sqlplus(查了下 应该是 客户端操作)中使用;
call是sql命令,任何工具都可以使用,call必须有括号,即使没有参数 。

而写在代码中是下面这样的:

	public static void getconnectionDB(String spSQL)
			throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
		String dbURL = "jdbc:jtds:sqlserver://balabala.balabala.com:1433/balabala;balabala=balabala";
		String dbUser = "UserName";
		String dbPswd = "PassWord";
		String dbDriver = "net.sourceforge.jtds.jdbc.Driver";
		ResultSet resultSet = null;
		CallableStatement csStmt = null;
		Connection dbConn = null;
		System.out.println("Start connection to DB");
		try {
			Class.forName(dbDriver).newInstance();
			dbConn = DriverManager.getConnection(dbURL, dbUser, dbPswd);
			csStmt = dbConn.prepareCall(spSQL);//String sql="{call DB***}";sql语句需要{}
			csStmt.execute();//String sql="{call DB***}"; sql语句需要{}
			boolean result = csStmt.execute();//String sql="{call DB***}";sql语句需要{}
			
			//正常的查询语句String sql = "SELECT ****";
			//java.sql.Statement stmt = dbConn.createStatement();			
			//boolean result = stmt.execute(spSQL);
			if (result) {
				resultSet = csStmt.getResultSet();
				java.sql.ResultSetMetaData rsmd = resultSet.getMetaData();
				int columnCount = rsmd.getColumnCount();
				while (resultSet.next()) {
					for (int i = 0; i < columnCount; i++) {
						System.out.print(rs.getString(i + 1) + "\t");
						//做一些相关的操作处理
					}
				}
				//做一些相关的处理
			}
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("Connection to database failed");
		}finally {
            //注意关闭SQL的顺序
            DbUtils.close(resultSet);
            DbUtils.close(csStmt);
            DbUtils.close(dbConn);
		}
	}

在代码中执行时:
call DB***语句与正常的SELECT DISTINCT *** from ***是不一样的,正如上面代码中注释的部分和下面两行的代码。

我也不确定对不对,对于SQL初学,若有错误  感谢你能告知。谢谢。

你可能感兴趣的:(SQL)