當前位置:首頁 » 數據倉庫 » 資料庫游標過程
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫游標過程

發布時間: 2023-04-04 05:15:13

資料庫游標如何使用

java中沒有,但可以用Types.OTHER來代替
另外如果用的是Oracle資料庫,則很方便的用OracleTypes.CURSOR來獲取游標 (需要class12.jar驅動程序)

㈡ 快速掌握Oracle資料庫游標的使用方法

顯式游標

當查詢返回結果超過一行時 就需要一個顯式游標 此時叢氏消用戶不能使用select into語句 PL/sql管理隱式游標 當查詢開始時隱式游標打開 查詢結束時隱式游標自動關閉 顯式游標在PL/SQL塊的聲明部分聲明 在執行部分或異常處理部分打開 取出數據 關閉

使用游標

這里要做一個聲明 我們所說的游標通常是指顯式游標 因此從現在起沒有特別指明的情況 我們所說的游標都是指顯式游標 要在程序中使用游標 必須首先聲明游標

聲明游標

語法

CURSOR cursor_name IS select_statement;

在PL/SQL中游標名是一個未聲明變數 不能給游標名賦值或用於表達式中

DELCARE CURSOR C_EMP IS SELECT empno ename salary FROM emp WHERE salary> ORDER BY ename; BEGIN

在游標定義中SELECT語句中不一定非要表可以是視圖 也可核態以從多個表或視圖中選擇的列 甚至可以使用*來選擇所有的列

打開游標

使用游標中的值之前應該首先打開游標 打開游標初始化查詢處理 打開游標的語法是

OPEN cursor_name

cursor_name是在聲明部分定義的游標名

OPEN C_EMP; 關閉游標

語法

CLOSE cursor_name

CLOSE C_EMP; 從游標提取數據 從游標得到一行數據使用FETCH命令 每一次提取數據後 游標都指向結果集的下一行 語法如下

FETCH cursor_name INTO variable[ variable ]

對於SELECT定義的游標的每一列 FETCH變數列表都應該有一個變數與之相對應 變數的類型也要相同

SET SERVERIUTPUT ON DECLARE v_ename EMP ENAME%TYPE; v_salary EMP SALARY%TYPE; CURSOR c_emp IS SELECT ename salary FROM emp; BEGIN OPEN c_emp; FETCH c_emp INTO v_ename v_salary; DBMS_OUTPUT PUT_LINE( Salary of Employee || v_ename || is || v_salary); FETCH c_emp INTO v_ename v_salary; DBMS_OUTPUT PUT_LINE( Salary of Employee || v_ename || is || v_salary); FETCH c_emp INTO v_ename v_salary; DBMS_OUTPUT PUT_LINE( Salary of Employee || v_ename || is || v_salary); CLOSE c_emp; END

這段代碼無疑是非常麻煩的 如果有多行返回結果 可以使用循環並用游標屬性為結束循環的條件 以這種方式提取數據 程序的可讀性和簡潔性都大滲知為提高 下面我們使用循環重新寫上面的程序

SET SERVERIUTPUT ON DECLARE v_ename EMP ENAME%TYPE; v_salary EMP SALARY%TYPE; CURSOR c_emp IS SELECT ename salary FROM emp; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO v_ename v_salary; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT PUT_LINE( Salary of Employee || v_ename || is || v_salary); END

記錄變數

定義一個記錄變數使用TYPE命令和%ROWTYPE 關於%ROWsTYPE的更多信息請參閱相關資料

記錄變數用於從游標中提取數據行 當游標選擇很多列的時候 那麼使用記錄比為每列聲明一個變數要方便得多

當在表上使用%ROWTYPE並將從游標中取出的值放入記錄中時 如果要選擇表中所有列 那麼在SELECT子句中使用*比將所有列名列出來要得多

SET SERVERIUTPUT ON DECLARE R_emp EMP%ROWTYPE; CURSOR c_emp IS SELECT * FROM emp; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO r_emp; EXIT WHEN c_emp%NOTFOUND; DBMS_OUT PUT PUT_LINE( Salary of Employee ||r_emp ename|| is || r_emp salary); END LOOP; CLOSE c_emp; END;

%ROWTYPE也可以用游標名來定義 這樣的話就必須要首先聲明游標

SET SERVERIUTPUT ON DECLARE CURSOR c_emp IS SELECT ename salary FROM emp; R_emp c_emp%ROWTYPE; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO r_emp; EXIT WHEN c_emp%NOTFOUND; DBMS_OUT PUT PUT_LINE( Salary of Employee ||r_emp ename|| is || r_emp salary); END LOOP; CLOSE c_emp; END;

帶參數的游標

存儲過程和函數相似 可以將參數傳遞給游標並在查詢中使用 這對於處理在某種條件下打開游標的情況非常有用 它的語法如下

CURSOR cursor_name[(parameter[ parameter] )] IS select_statement;

定義參數的語法如下

Parameter_name [IN] data_type[{:=|DEFAULT} value]

與存儲過程不同的是 游標只能接受傳遞的值 而不能返回值 參數只定義數據類型 沒有大小

另外可以給參數設定一個預設值 當沒有參數值傳遞給游標時 就使用預設值 游標中定義的參數只是一個佔位符 在別處引用該參數不一定可靠

在打開游標時給參數賦值 語法如下

OPEN cursor_name[value[ value] ];

參數值可以是文字或變數

DECALRE CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno; CURSOR c_emp (p_dept VARACHAR ) IS SELECT ename salary FROM emp WHERE deptno=p_dept ORDER BY ename r_dept DEPT%ROWTYPE; v_ename EMP ENAME%TYPE; v_salary EMP SALARY%TYPE; v_tot_salary EMP SALARY%TYPE; BEGIN OPEN c_dept; LOOP FETCH c_dept INTO r_dept; EXIT WHEN c_dept%NOTFOUND; DBMS_OUTPUT PUT_LINE ( Department: || r_dept deptno|| ||r_dept dname); v_tot_salary:= ; OPEN c_emp(r_dept deptno); LOOP FETCH c_emp INTO v_ename v_salary; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT PUT_LINE ( Name: || v_ename|| salary: ||v_salary); v_tot_salary:=v_tot_salary+v_salary; END LOOP; CLOSE c_emp; DBMS_OUTPUT PUT_LINE ( Toltal Salary for dept: || v_tot_salary); END LOOP; CLOSE c_dept; END;

游標FOR循環

在大多數時候我們在設計程序的時候都遵循下面的步驟

打開游標

開始循環

從游標中取值

那一行被返回

處理

關閉循環

關閉游標

可以簡單的把這一類代碼稱為游標用於循環 但還有一種循環與這種類型不相同 這就是FOR循環 用於FOR循環的游標按照正常的聲明方式聲明 它的優點在於不需要顯式的打開 關閉 取數據 測試數據的存在 定義存放數據的變數等等 游標FOR循環的語法如下

FOR record_name IN (corsor_name[(parameter[ parameter] )] | (query_difinition) LOOP statements END LOOP;

下面我們用for循環重寫上面的例子

DECALRE CURSOR c_dept IS SELECT deptno dname FROM dept ORDER BY deptno; CURSOR c_emp (p_dept VARACHAR ) IS SELECT ename salary FROM emp WHERE deptno=p_dept ORDER BY ename v_tot_salary EMP SALARY%TYPE; BEGIN FOR r_dept IN c_dept LOOP DBMS_OUTPUT PUT_LINE ( Department: || r_dept deptno|| ||r_dept dname); v_tot_salary:= ; FOR r_emp IN c_emp(r_dept deptno) LOOP DBMS_OUTPUT PUT_LINE ( Name: || v_ename || salary: || v_salary); v_tot_salary:=v_tot_salary+v_salary; END LOOP; DBMS_OUTPUT PUT_LINE ( Toltal Salary for dept: || v_tot_salary); END LOOP; END;

在游標FOR循環中使用查詢

在游標FOR循環中可以定義查詢 由於沒有顯式聲明所以游標沒有名字 記錄名通過游標查詢來定義

DECALRE v_tot_salary EMP SALARY%TYPE; BEGIN FOR r_dept IN (SELECT deptno dname FROM dept ORDER BY deptno) LOOP DBMS_OUTPUT PUT_LINE( Department: || r_dept deptno|| ||r_dept dname); v_tot_salary:= ; FOR r_emp IN (SELECT ename salary FROM emp WHERE deptno=p_dept ORDER BY ename) LOOP DBMS_OUTPUT PUT_LINE( Name: || v_ename|| salary: ||v_salary); v_tot_salary:=v_tot_salary+v_salary; END LOOP; DBMS_OUTPUT PUT_LINE( Toltal Salary for dept: || v_tot_salary); END LOOP; END;

游標中的子查詢

語法如下

CURSOR C IS SELECT * FROM emp WHERE deptno NOT IN (SELECT deptno FROM dept WHERE dname!= ACCOUNTING );

可以看出與SQL中的子查詢沒有什麼區別

游標中的更新和刪除

在PL/SQL中依然可以使用UPDATE和DELETE語句更新或刪除數據行 顯式游標只有在需要獲得多行數據的情況下使用 PL/SQL提供了僅僅使用游標就可以執行刪除或更新記錄的方法

UPDATE或DELETE語句中的WHERE CURRENT OF子串專門處理要執行UPDATE或DELETE操作的表中取出的最近的數據 要使用這個方法 在聲明游標時必須使用FOR UPDATE子串 當對話使用FOR UPDATE子串打開一個游標時 所有返回集中的數據行都將處於行級(ROW LEVEL)獨占式鎖定 其他對象只能查詢這些數據行 不能進行UPDATE DELETE或SELECT FOR UPDATE操作

語法

FOR UPDATE [OF [schema ]lumn[ [schema ]lumn] [nowait]

在多表查詢中 使用OF子句來鎖定特定的表 如果忽略了OF子句 那麼所有表中選擇的數據行都將被鎖定 如果這些數據行已經被其他會話鎖定 那麼正常情況下ORACLE將等待 直到數據行解鎖

在UPDATE和DELETE中使用WHERE CURRENT OF子串的語法如下

WHERE{CURRENT OF cursor_name|search_condition}

DELCARE CURSOR c IS SELECT empno salary FROM emp WHERE m IS NULL FOR UPDATE OF m; v_m NUMBER( ); BEGIN FOR r IN c LOOP IF r salary< THEN v_m:=r salary* ; ELSEIF r salary< THEN v_m:=r salary* ; ELSEIF r salary< THEN v_m:=r salary* ; ELSE v_m:=r salary* ; END IF; UPDATE emp; SET m=v_m WHERE CURRENT OF c l; END LOOP; END

lishixin/Article/program/Oracle/201311/16865

㈢ 資料庫系統裡面,什麼是存儲過程、游標、觸發器

存儲過程(Stored Procere)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,經編譯後存儲在資料庫中,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是資料庫中的一個重要對象,任何一個設計良好的資料庫應用程序都應該用到存儲過程。

游標(cursor)是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果。每個游標區都有一個名字,用戶可以用SQL語句逐一從游標中獲取記錄,並賦給主變數,交由主語言進一步處理。
觸發器(trigger)是SQL server 提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。

㈣ SQL中什麼時候需要使用游標使用游標的步驟

游標一般用於把通過腳本得到的結果集的內容在用於其它的SQL語句中。但是游標執行會影響腳本執行速度,所以使用時請慎重。 在存儲過程或觸發器中使用 SQL 游標的典型過程為: 聲明SQL 變數包含游標返回的數據。為每個結果集列聲明一個變數。聲明足夠大的變數來保存列返回的值,並聲明變數的類型為可從列數據類型隱式轉換得到的數據類型。

使用 DECLARE CURSOR 語句將 SQL 游標與 SELECT 語句相關聯。另外,DECLARE CURSOR 語句還定義游標的特性,例如游標名稱以及游標是只讀還是只進。

使用 OPEN 語句執行 SELECT 語句並填充游標。

使用 FETCH INTO 語句提取單個行,並將每列中的數據移至指定的變數中。然後,其他 SQL 語句可以引用那些變數來訪問提取的數據值。SQL 游標不支持提取行塊。

使用 CLOSE 語句結束游標的使用。關閉游標可以釋放某些資源,例如游標結果集及其對當前行的鎖定,但如果重新發出一個 OPEN 語句,則該游標結構仍可用於處理。由於游標仍然存在,此時還不能重新使用該游標的名稱。DEALLOCATE 語句則完全釋放分配給游標的資源,包括游標名稱。釋放游標後,必須使用 DECLARE 語句來重新生成游標。

㈤ 資料庫游標

游標包含兩方面的內容:
●游標結果集:執行其中的Select語句所得到的結果集;
●游標位置:一個指向游標結果集內的某一條記錄的指針
利用游標可以單獨操縱結果集中的每一行。游標在定義以後存在兩種狀態:關閉和打開。當游標關閉時,其查詢結果集不存在;只有當游標打開時,才能按行讀取或修改結果集中的數據。
使用游標
一個應用程序可以使用兩種類型的游標:前端(客戶)游標和後端(伺服器)游標,它們是兩個不同的概念。
無論使用哪一種游標,都需要經過如下幾個步驟:
●定義游標
●打開游標
●從游標中操作數據
●關閉游標

㈥ 資料庫的游標的作用是什麼,如何編寫

游標是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果。每個游標區都有一個名字。用戶可以用SQL語句逐一從游標中獲取記錄,並賦給主變數,交由主語言進一步處理。主語言是面向記錄的,一組主變數一次只能存放一條記錄。僅使用主變數並不能完全滿足SQL語句向應用程序輸出數據的要求。嵌入式SQL引入了游標的概念,用來協調這兩種不同的處理方式。在資料庫開發過程中,當你檢索的數據只是一條記錄時,你所編寫的事務語句代碼往往使用SELECT INSERT 語句。但是我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?這時我們就會使用游標。
-----------------------------------------------------------
使用游標會降低執行效率,平時盡可能不要用
declare @column1 varchar(10)
declare @column2 varchar(10)
declare cursor1 cursor for select column1, column2 from tablename --聲明游標(用select語句,可以通過where等語句限定游標取的結果集)
open cursor1 --打開游標
fetch next from cursor1 into @column1, @column2 --取游標的值到變數
while (@@fetch_status=0) --有記錄的話
begin
--處理
fetch next from cursor1 into @column1, @column2 --取下一個
end
close cursor1 --關閉游標
deallocate cursor1 --釋放游標

㈦ oracle資料庫的游標和存儲過程怎麼寫

Oracle游標,從字面理解就是游動的游標。用資料庫語言來描述就是:游標是映射在結果集中一行數據上的位置實體,有了游標,用戶就可以訪問結果集中的任意一行數據了,將游標放置到某行後,即可對該行數據進行操作,例如提取當前行的數據等。

游標分為顯示游標和隱式游標。

要使用顯示游標分為四步:
1.聲名游標。
cursor sel_names is select * from names;
2.打開游標。
open sel_names;
3.讀取數據。
fetch sel_name into RowTypeVariable;
4.關閉游標。
close sel_name;

Oracle游標的屬性:
1.%ISOPEN判斷游標是否被打開,如果打開%ISOPEN等於true,否則等於false;
2.%FOUND判斷游標所在的行是否有效,如果有效,則%FOUND等於true,否則等於false;
3.%ROWCOUNT返回當前位置為止游標讀取的記錄行數。
例子:
set serveroutput on;

declare
temp_name varchar2(32);

cursor sel_name
is
select * from names;

begin
if sel_names%isopen = false then
open sel_names;
end if;

fetch sel_names into temp_name;
while sel_names%found loop
dbms_output.put_line('name: '||temp_name);
if sel_names%rowcount=200 then
exit;
end if;
fetch sel_names into temp_name;
end loop;

close sel_names;
end;
/

㈧ 資料庫基礎詳解:存儲過程、視圖、游標、SQL語句優化以及索引

寫在文章前:本系列文章用於博主自己歸納復習一些基礎知識,同時也分享給可能需要的人,因為水平有限,肯定存在諸多不足以及技術性錯誤,請大佬們及時指正。

存儲過程 是事先經過編譯並存儲在資料庫中的一段SQL語句的集合。想要實現相應的功能時,只需要調用這個存儲過程就行了(類似於函數,輸入具有輸出參數)。

優點

缺點

Delete用來刪除表的全部或者部分數據,執行delete之後,用戶需要提交之後才會執行,會觸發表上的DELETE觸發器(包含一個OLD的虛擬表,可以只讀訪問被刪除的數據),DELETE之後表結構還在,刪除很慢,一行一行地刪,因為會記錄日誌,可以利用日誌還原數據;

Truncate刪除表中的所有數據,這個操作不能回滾,也不會觸發這個表上的觸發器。操作比DELETE快很多(直接把表drop掉,再創建一個新表,刪除的數據不能找回)。如果表中有自增(AUTO_INCREMENT)列,則重置為1。

Drop命令從資料庫中刪除表,所有的數據行,索引和約束都會被刪除。不能回滾,不會觸發觸發器。

觸發器(TRIGGER)是由事件(比如INSERT/UPDATE/DELETE)來觸發運行的操作(不能被直接調用,不能接收參數)。在資料庫里以獨立的對象存儲,用於保證數據完整性(比如可以檢驗或轉換數據)。

約束(Constraint)類型:

從資料庫的基本表中通過查詢選取出來的數據組成的虛擬表(資料庫中只存放視圖的定義,而不存放視圖的數據)。可以對其進行增/刪/改/查等操作。視圖是對若干張基本表的引用,一張虛表,查詢語句執行的結果,不存儲具體的數據(基本表數據發生了改變,視圖也會跟著改變)。

可以跟基本表一樣,進行增刪改查操作( 增刪改操作有條件限制,一般視圖只允許查詢操作 ),對視圖的增刪改也會影響原表的數據。 它就像一個窗口,透過它可以看到資料庫中自己感興趣的數據並且操作它們。 好處:

用於定位在查詢返回的結果集的特定行,以對特定行進行操作。使用游標可以方便地對結果集進行移動遍歷,根據需要滾動或對瀏覽/修改任意行中的數據。主要用於互動式應用。它是一段私有的SQL工作區,也就是一段內存區域,用於暫時存放受SQL語句影響的數據,簡單來說,就是將受影響的數據暫時放到了一個內存區域的虛表當中,這個虛表就是游標。

游標是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。即游標用來逐行讀取結果集。游標充當指針的作用。盡管游標能遍歷結果中的所有行,但他一次只指向一行。

游標的一個常見用途就是保存查詢結果,以便以後使用。游標的結果集是由SELECT語句產生,如果處理過程需要重復使用一個記錄集,那麼創建一次游標而重復使用若干次,比重復查詢資料庫要快的多。通俗來說,游標就是能在sql的查詢結果中,顯示某一行(或某多行)數據,其查詢的結果不是數據表,而是已經查詢出來的結果集。

簡單來說:游標就是在查詢出的結果集中進行選擇性操作的工具。

緩存更高效。對於連接查詢,如果其中一個表發生變化,那麼整個查詢緩存就無法使用。而分解後的多個查詢,即使其中一個表發生變化,對其它表的查詢緩存依然可以使用。分解成多個單表查詢,這些單表查詢的緩存結果更可能被其它查詢使用到,從而減少冗餘的查詢。減少鎖競爭。

索引是對資料庫表中一列或多列的值進行排序的一種結構(說明是在列上建立的),使用索引可快速訪問資料庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取信息。索引的一個主要目的就是加快檢索表中數據,亦即能協助信息搜索者盡快的找到符合限制條件的記錄ID的輔助數據結構。

當表中有大量記錄時,若要對表進行查詢,第一種搜索信息方式是全表搜索,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,這樣做會消耗大量資料庫系統時間,並造成大量磁碟I/O操作。第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過保存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄。

例如這樣一個查詢:select * from table1 where id=10000。如果沒有索引,必須遍歷整個表,直到ID等於10000的這一行被找到為止。有了索引之後(必須是在ID這一列上建立的索引),即可在索引中查找。由於索引是經過某種演算法優化過的,因而查找次數要少的多。可見,索引是用來定位的。

從應用上分, 主鍵索引(聚集) 唯一索引(聚集/非聚集) 普通索引 組合索引 單列索引和全文索引

㈨ 什麼是游標使用游標的基本步驟是什麼

游標(cursor)是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果。每個游標區都有一個名字,用戶可以用SQL語句逐一從游標中獲取記錄,並賦給主變數,交由主語言進一步處理。游標提供了一種對從表中檢索出的數據進行操作的靈活手段。
使用游標的基本步驟:
1、聲明游標。把游標與T-SQL語句的結果集聯系起來。
2、打開游標。
3、使用游標操作數據。
4、關閉游標。
功能:
1、游標提供了一種對從表中檢索出的數據進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。
2、游標能夠實現按與傳統程序讀取平面文件類似的方式處理來自基礎表的結果集,從而把表中數據以平面文件的形式呈現給程序。
3、游標把作為面向集合的資料庫管理系統和面向行的程序設計兩者聯系起來,使兩個數據處理方式能夠進行溝通。
種類:
1、Transact_SQL游標
Transact_SQL游標是由DECLARECURSOR語法定義、主要用在Transact_SQL腳本、存儲過程和觸發器中。Transact_SQL游標主要用在伺服器上,由從客戶端發送給伺服器的Transact_SQL語句或是批處理、存儲過程、觸發器中的Transact_SQL進行管理。Transact_SQL游標不支持提取數據塊或多行數據。
2、API游標
API游標支持在OLEDB,ODBC以及DB_library中使用游標函數,主要用在伺服器上。每一次客戶端應用程序調用API游標函數,MSSQLSEVER的OLEDB提供者、ODBC驅動器或DB_library的動態鏈接庫(DLL)都會將這些客戶請求傳送給伺服器以對API游標進行處理。
3、客戶游標
客戶游標主要是當在客戶機上緩存結果集時才使用。在客戶游標中,有一個預設的結果集被用來在客戶機上緩存整個結果集。客戶游標僅支持靜態游標而非動態游標。由於伺服器游標並不支持所有的Transact-SQL語句或批處理,所以客戶游標常常僅被用作伺服器游標的輔助。因為在一般情況下,伺服器游標能支持絕大多數的游標操作。由於API游標和Transact-SQL游標使用在伺服器端,所以被稱為伺服器游標,也被稱為後台游標,而客戶端游標被稱為前台游標。

㈩ oracle資料庫的游標和存儲過程怎麼寫

--創建存儲

CREATE
OR
REPLACE
PROCEDURE
xxxxxxxxxxx_p
(
--參數IN表示輸入參數
OUT表示輸入參數
類型
使用任意Oracle

類型
is_ym
IN
CHAR
)
AS
--定義變數
vs_msg
VARCHAR2(4000);
--錯誤信息變數
vs_ym_beg
CHAR(6);
--起始月份
vs_ym_end
CHAR(6);
--終止月份
vs_ym_sn_beg
CHAR(6);
--同期起始月份
vs_ym_sn_end
CHAR(6);
--同期終止月份
--定義游標(簡單

遍歷

集)
CURSOR
cur_1
IS
SELECT
area_code,CMCODE,SUM(rmb_amt)/10000
rmb_amt_sn,SUM(usd_amt)/10000
usd_amt_sn
FROM
BGD_AREA_CM_M_BASE_T
WHERE
ym
>=
vs_ym_sn_beg
AND
ym
<=
vs_ym_sn_end
GROUP
BY
area_code,CMCODE;BEGIN
--用輸入參數給變數賦初值

Oralce
SUBSTR
TO_CHAR
ADD_MONTHS
TO_DATE


函數
vs_ym_beg
:=
SUBSTR(is_ym,1,6);
vs_ym_end
:=
SUBSTR(is_ym,7,6);
vs_ym_sn_beg
:=
TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'),
-12),'yyyymm');
vs_ym_sn_end
:=
TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'),
-12),'yyyymm');
--先刪除表
特定條件
數據
DELETE
FROM
xxxxxxxxxxx_T
WHERE
ym
=
is_ym;
--
用內置
DBMS_OUTPUT

put_line
列印
影響
記錄行數


系統變數SQL%rowcount
DBMS_OUTPUT.put_line('del
月記錄='||SQL%rowcount||'條');
INSERT
INTO
xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt)
SELECT
area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000
FROM
BGD_AREA_CM_M_BASE_T
WHERE
ym
>=
vs_ym_beg
AND
ym
<=
vs_ym_end
GROUP
BY
area_code,CMCODE;
DBMS_OUTPUT.put_line('ins
月記錄='||SQL%rowcount||'條');
--遍歷游標處理
更新

遍歷游標
幾種
用for語句

比較直觀

FOR
rec
IN
cur_1
LOOP
UPDATE
xxxxxxxxxxx_T
SET
rmb_amt_sn
=
rec.rmb_amt_sn,usd_amt_sn
=
rec.usd_amt_sn
WHERE
area_code
=
rec.area_code
AND
CMCODE
=
rec.CMCODE
AND
ym
=
is_ym;
END
LOOP;
COMMIT;
--錯誤處理部
OTHERS表示除
聲明外
任意錯誤
SQLERRM
系統內置變數保存
前錯誤
詳細信息
EXCEPTION
WHEN
OTHERS
THEN
vs_msg
:=
'ERROR
IN
xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500);
ROLLBACK;
--
前錯誤記錄進
志表
INSERT
INTO
LOG_INFO(proc_name,error_info,op_date)
VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE);
COMMIT;
RETURN;
END;