oracle存儲過程參數集合
① oracle 存儲過程參數的問題
方案1:
(1)傳入前將單位拼接為串,格式如下:『單位1,單位2,單位3',即'43,4301',用逗號分割數據。
(2)查詢條件修改如下:
where instr(傳入的串,單位所在列)>0;
(3)注意 單位這個列不能有空的情況,否則需要加上nvl(單位,『@』),字元可以自擬;
方案2:傳入前將復選後的單位放入PL/SQL表,再將PL/SQL表作為參數進行傳遞;
如果復選的不是很大,沒有超過varchar2(4000)的話,方案1能實現。注意對參數最好加限制substrb(單位串,1,你期望的限制),這個限制可依據性能而定,一般復選框也不會一頁顯式太多,所以不必擔心串的大小。
② WebService調用oracle存儲過程,傳入數組參數
你要在webservice中編寫相應的調用存儲過程的介面,具體看你應用的什麼語言技術。比如下面java調用存儲過程如下:
Session session = HibernateSessionFactory.getSession();
//連接對象
Connection conn = null;
//數據集對象
ResultSet rs = null;
//用來取得表列明的 對象
ResultSetMetaData rsmd = null;
CallableStatement proc = null;
conn = session.connection();
conn.setAutoCommit(false);
try {
if (conn != null) {
proc = conn.prepareCall("{call 存儲過程包名過程名(n個傳入參數對應n個問號,返回參數或游標?佔位) }");
// 如下過程PKG_GETDATA有4個傳入參數,所有在程序包是PKG_QUERY
//proc = conn.prepareCall("{call PKG_QUERY.PKG_GETDATA(?,?,?,?,?) }");
proc.setString(1, 參數);
//依次按照傳入參數順序與?問號位置傳入所有參數
//最後傳入n個參數後一位的返回遊標
//proc.registerOutParameter(n+1, oracle.jdbc.OracleTypes.CURSOR);
proc.execute();
rs = (ResultSet) proc.getObject(n+1);
conn.commit();
}
可以將上面代碼寫成一個公用的調用存儲過程的通用介面。
別人調用你的webservice 可以具體的參數個數及順序傳遞給你的介面,也可以傳遞一個object數組