1. 程式人生 > >SQL中 exec和call的使用

SQL中 exec和call的使用

今天在讀取資料庫的時候,搞了一上午,遇到個坑,歸根結底還是術業不精!  由於對執行命令 CALL和EXEC的無知,資料庫的無知,以前學過,忘記了。
還得加強學習啊。

從開發小姐姐那兒得到的是這麼一句SQL語句(開發程式碼裡面的如下):

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

可是在之前我想開發要的時候給我的是這麼個語句:

exec DB***..balabalaTable

可能是開發好心的將call改成了exec,為了方便我在資料庫中直接查詢, 怕我不知道。於是我就懵逼了,查了半天才知道是儲存過程等等,也沒弄明白。就一直在那寫程式碼call。

最後弄明白
在資料庫裡面可以直接這樣執行CALL,但是要加{}:



也就是在資料庫中直接查詢以下是等價的:

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初學,若有錯誤  感謝你能告知。謝謝。