存儲過程調用游標
A. 6、什麼是存儲過程什麼是游標,何時使用、何時不用游標
存儲過程是一組命名了的sql語句集合,是為了完成特定功能匯集而成的。該集合編譯後存放在資料庫中,可根據實際情況重新編譯,可直接運行,也可遠程運行且存儲過程直接在伺服器端運行。
游標實際上是一種能從包括多條數據記錄的結果集(結果集是select查詢之後返回的所有行數據的集合)中每次提取一條記錄的機制充當指針的作用,遍歷結果中的所有行,但他一次只指向一行。
游標在循環處理欄位的時候使用
建議:盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該考慮改寫;使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效;與臨時表一樣,游標並不是不可使用。
B. java調用的存儲過程,能否傳入游標參數
java調用的存儲過程,不能傳入游標參數,但是存儲過程調用的內部存儲過程,可以存入游標參數。未完待續
C. ORACLE存儲過程中游標作為輸出參數調用時怎麼報錯
你的意思是不是要獲取到「當前用戶:user_id」這個的內容,如果是,兩個方式可以解決:
1.通過存儲過程的出參,將「當前用戶:user_id」連接串返回;
比如:
假設你的過程叫,prc_test,在參數列表中增加出參。
create or replace procere prc_test(入參 in 類型, 出參 out 類型) is
begin
-- 邏輯實現
end;
出參就是你要把內容放進去,用來傳值的變數。
2.在過程中保存一張臨時表,然後在java中查出這個臨時表中保存的數據。
定義臨時表table_temp
在過程中
insert into table_temp(msg) values ('當前用戶:' || user_id);
D. Oracle調用存儲過程輸出的游標問題
不知道你那裡。
是不是可以把那個 存儲過程 (參數是游標)的。
修改為 函數, 返回遊標。
如果可以修改的話, 那麼你參考一下 下面這個例子代碼
--測試表數據。
select*fromtest_main;
IDVALUE
------------------------------
1ONE
3THREE
2TWO
--返回結果集的函數.
CREATEORREPLACEFUNCTIONGet_Test_Main_All
RETURNSYS_REFCURSOR
IS
return_cursorSYS_REFCURSOR;
BEGIN
OPENreturn_cursorFOR'SELECT*FROMtest_main';
RETURNreturn_cursor;
END;
/
--普通的查詢,來查看結果.
SELECTGet_Test_Main_All()FROMal;
GET_TEST_MAIN_ALL()
--------------------
CURSORSTATEMENT:1
CURSORSTATEMENT:1
IDVALUE
------------------------------
1ONE
3THREE
2TWO
--存儲過程調用,來獲取結果.
DECLARE
--調用函數的返回值.
testCursorSYS_REFCURSOR;
--存儲單行數據.
testRectest_main%ROWTYPE;
BEGIN
--調用返回結果集的函數.
testCursor:=Get_Test_Main_All();
--循環,遍歷結果.
LOOP
--游標向前.
FETCHtestCursorINTOtestRec;
--無數據的情況下,退出循環.
EXITWHENtestCursor%NOTFOUND;
--輸出調試信息.
dbms_output.put_line(TO_CHAR(testRec.id)||''||testRec.value);
ENDLOOP;
END;
/
1ONE
3THREE
2TWO
PL/SQL過程已成功完成。
E. MySQL 存儲過程,獲取使用游標查詢的結果集
MySQL 存儲過程中,使用游標查詢,返回的是結果集時,如何查看調用存儲過程輸出結果呢?
解決方案:存儲過程不返回數據,但它能創建和填充另一個表。所以在存儲過程運行中創建臨時表。該臨時表將保存存儲過程中生成的結果集,在遍歷游標時,用insert保存每條數據到臨時表中。後續調用時可以用select語句查詢臨時表中的存儲過程運行結果。
以下有 三種方式 使用游標創建一個存儲過程,統計某一部門下的員工信息
方法一:Loop循環
調用存儲過程:
方法二:While 循環
調用存儲過程:
方法三:REPEAT 循環
調用存儲過程:
上述三種實現方法在測試過程中遇到下述問題。
調用存儲過程查詢臨時表輸出結果時,會發現多循環了一次,像這樣:
解決方法:
在遍歷游標查詢結果時,先判斷游標的結束標志(done) 是否是為1,如果不是1,則向臨時表中插入數據。
F. c#中如何調用一個返回遊標的存儲過程
下面是我以前用的,應該還有好方法,只是我用了這一種。
這個為oracle的,其他的應該類似,把oracleClient這個東西換換,就可以看見說明了。
存儲過程名:ProGetBookList
參數:s_Barcode(varchar),ResultCursor(游標)
-----
System.Data.OracleClient.OracleCommand Com = new System.Data.OracleClient.OracleCommand("ProGetBookList", connORCL );
Com.CommandType = CommandType.StoredProcere;
//創建存儲過程參數
OracleParameter pBarcode=new OracleParameter("s_Barcode",OracleType.VarChar,50);
OracleParameter pCursor=new OracleParameter("ResultCursor",OracleType.Cursor,50);
//設置輸出參數
pCursor.Direction=System.Data.ParameterDirection.Output;
//給輸入參數賦值
pBarcode.Value=s_Barcode;
//添加參數
Com.Parameters.Add(pBarcode);
Com.Parameters.Add(pCursor);
//執行存儲過程
Com.ExecuteNonQuery();
//為cousor類型返回參數創建讀取器
OracleDataReader dr=(OracleDataReader)pCursor.Value;
string[] errorString;
//從讀取器里將數據集得值取出,添加到集合(字元串類型)
System.Collections.ArrayList al_BookList=new ArrayList();
while (dr.Read()) //循環讀取,從第一行開始,直到返回假結束
{
errorString=new string[16];
errorString[1]=dr.GetString(0).Trim(); //讀第一個欄位,取字元類型
//dr.GetBoolean(0); //bool類型
//dr.GetData(0); //日期類型
//其他的自己用查看OracleDataReader
}
G. 如何調用一個Oracle存儲過程返回一個或多個REF游標,使用ADO從C
代碼如下:
CREATE OR REPLACE PROCEDURE P_TESTB
AS
VARCURSOR SYS_REFCURSOR;
R USERS%ROWTYPE;
BEGIN
P_TESTA(VARCURSOR);
LOOP
FETCH VARCURSOR INTO R;
EXIT WHEN
VARCURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(R.NAME);
END LOOP;
END
P_TESTB;