
Oracle?需要通過?返回一個游標(biāo)來處理。

創(chuàng)新互聯(lián)服務(wù)項目包括商州網(wǎng)站建設(shè)、商州網(wǎng)站制作、商州網(wǎng)頁制作以及商州網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,商州網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到商州省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
--?測試表數(shù)據(jù)。
select?*?from?test_main;
ID?VALUE
----------?--------------------
1?ONE
3?THREE
2?TWO
--?返回結(jié)果集的函數(shù).
CREATE?OR?REPLACE?FUNCTION?Get_Test_Main_All
RETURN?SYS_REFCURSOR
IS
return_cursor?SYS_REFCURSOR;
BEGIN
OPEN?return_cursor?FOR?'SELECT?*?FROM?test_main';
RETURN?return_cursor;
END;
/
--?普通的查詢,來查看結(jié)果.
SELECT?Get_Test_Main_All()?FROM?dual;
GET_TEST_MAIN_ALL()
--------------------
CURSOR?STATEMENT?:?1
CURSOR?STATEMENT?:?1
ID?VALUE
----------?--------------------
1?ONE
3?THREE
2?TWO
--?存儲過程調(diào)用,?來獲取結(jié)果.
DECLARE?
--?調(diào)用函數(shù)的返回值.
testCursor?SYS_REFCURSOR;
--?存儲單行數(shù)據(jù).
testRec??test_main%ROWTYPE;
BEGIN
--?調(diào)用返回結(jié)果集的函數(shù).
testCursor?:=?Get_Test_Main_All();
--?循環(huán),遍歷結(jié)果.
LOOP
--?游標(biāo)向前.
FETCH?testCursor?INTO?testRec;
--?無數(shù)據(jù)的情況下,退出循環(huán).
EXIT?WHEN?testCursor%NOTFOUND;
--?輸出調(diào)試信息.
dbms_output.put_line(?TO_CHAR(testRec.id)?||?'?'?||?testRec.value);
END?LOOP;
END;
/
1?ONE
3?THREE
2?TWO
PL/SQL?過程已成功完成。
--------------------------------------------------------------------------------
上面的是使用動態(tài)SQL處理的。
下面是正常SQL處理的。
CREATE?OR?REPLACE?FUNCTION?Get_Test_Main?
RETURN?SYS_REFCURSOR
IS
return_cursor?SYS_REFCURSOR;
BEGIN
OPEN?return_cursor?FOR?SELECT?*?FROM?test_main;
RETURN?return_cursor;
END;
/
SQL?SELECT?Get_Test_Main()?FROM?dual;
GET_TEST_MAIN()
--------------------
CURSOR?STATEMENT?:?1
CURSOR?STATEMENT?:?1
ID?VALUE
----------?--------------------
2?TWO
--------------------------------------------------------------------------------
上面的是沒有參數(shù)的
下面是有參數(shù)的
CREATE?OR?REPLACE?FUNCTION?Get_Test_Main?(
p_id??INT
)
RETURN?SYS_REFCURSOR
IS
return_cursor?SYS_REFCURSOR;
BEGIN
OPEN?return_cursor?FOR?SELECT?*?FROM?test_main?WHERE?id?=?p_id;
RETURN?return_cursor;
END;
/
SQL?SELECT?Get_Test_Main(2)?FROM?dual;
GET_TEST_MAIN(2)
--------------------
CURSOR?STATEMENT?:?1
CURSOR?STATEMENT?:?1
ID?VALUE
----------?--------------------
2?TWO
返回游標(biāo)的函數(shù),不是?“表值函數(shù)”
SQL?SELECT?*?FROM?Get_Test_Main(2);
SELECT?*?FROM?Get_Test_Main(2)
*
ERROR?位于第?1?行:
ORA-00933:?SQL?命令未正確結(jié)束
備份一張表一般用create 備份表 as select * from 原表;
如果不想要這個備份,直接運行
drop table 備份表;
就可以,沒有回退的說法。
execute執(zhí)行后
可以回滾
commit提交后
不可以回滾
其實Oracle提交數(shù)據(jù)是分兩步操作的,第一步execute執(zhí)行,第二步commit提交。對應(yīng)的PL\SQL也是要先點execute執(zhí)行,執(zhí)行后再點commit提交。
但是
commit提交后
可以用閃回查詢恢復(fù)原來的數(shù)據(jù)
因為oracle會將近期的數(shù)據(jù)保存到快照中
如:
SELECT
*
FROM
TABLE_1
AS
OF
TIMESTAMP
TO_TIMESTAMP('20080606
20:00:00','YYYYMMDD
HH24:MI:SS');
這里'20080606
20:00:00'就是你想恢復(fù)數(shù)據(jù)到哪個時間狀態(tài)
TABLE_1是數(shù)據(jù)庫的表名
這樣查詢到的數(shù)據(jù)就是執(zhí)行更新操作之前的數(shù)據(jù)
刪除表后,可以采用如下操作:
在 user_recyclebin中找到最近操作過的表名稱,然后用閃回(只能用于10G及以上版本)。
FLASH BACK TABLE TABLE_NAME TO BEFORE DROP;
如果是刪了或修改里面的數(shù)據(jù),可以先建立一個快表將刪除修改之前狀態(tài)的數(shù)據(jù)找回到這個表中:
CREATE TABLE QUICK_TABLE AS
SELECT * FROM TABLE_NAME AS OF TIMESTAMP SYSTEM-1/24 (一小時前的),減去的時間可以自己定。如樓上F_253那位老兄的寫法就不錯,能自由定制時間