達夢遊標使用

2021-10-19 11:02:37 字數 4721 閱讀 1243

dmsql 程式為使用者提供了游標,供使用者對查詢到的多行資料進行逐條處理。游標可以從多條資料記錄的結果集中每次提取一條記錄供使用者訪問處理,通過迴圈控制,遍歷結果集中的所有記錄。

達成夢資料庫中的游標分為靜態游標和動態游標,其中靜態游標又可分為顯式游標和隱式游標。

靜態游標是唯讀游標,它總是按照開啟游標時的原樣顯示結果集,在編譯時就能確定靜態游標使用的查詢。

1.隱式游標

每當使用者在 dmsql 程式中執行乙個dml語句(insert、update、delete)或者 select …into 語句時,dmsql 程式都會自動宣告乙個隱式游標並管理這個游標。

隱式游標不必專門去宣告,資料庫自動為我們做好了後台工作,如定義、開啟、取值及關閉操作,由達夢資料庫自動完成,使用者通過隱式游標的相關屬性,來完成相應的操作。隱式游標的名稱為「sql」,使用者可以通過隱式游標獲取語句執行的一些資訊。dmsql 程式中的每個游標都有%found、%notfound、%isopen 和%rowcount 四個屬性,對於 隱式游標,這四個屬性的意義如下:

例如:

總共1個語句正依次執行...

[執行語句1

]:declare

v_name varchar

; v_date date

;begin

select employee_name, hire_date into v_name, v_date from

dmhr.employee;

ifsql

%found then

print v_name||

','||v_date;

endif

;

exception

when no_data_found

then

print

'no data found!'

;when too_many_rows

then

print

'too many rows!'

;end

;執行成功, 執行耗時0毫秒. 執行號:86

too many rows

!影響了0條記錄

1條語句執行成功

在上面例子中我們可以看到,通過直接利用%found屬性,判斷游標中集合各字段值是否存在。同時,可以看到,select …into主要是單行結果集的處理,對於多行結果查詢異常處理模組捕獲到了異常。下面是查詢為空時捕獲異常的例子:

總共1個語句正依次執行...

[執行語句1

]:declare

v_name varchar

; v_date date

;begin

select employee_name, hire_date into v_name, v_date from

dmhr.employee where employee_id=

'100001';if

sql%found then

print v_name||

','||v_date;

endif

;

exception

when no_data_found

then

print

'no data found!'

;when too_many_rows

then

print

'too many rows!'

;end

;執行成功, 執行耗時0毫秒. 執行號:88

nodata found!

影響了0條記錄

1條語句執行成功

這段過程中,查詢結果集是為空,sql%found屬性判斷後跳過列印,最終通過異常處理模組正常捕獲到。

下面是模組正常執行時,未出現異常的例子:

總共1個語句正依次執行...

[執行語句1

]:declare

v_name varchar

; v_date date

;begin

select employee_name, hire_date into v_name, v_date from

dmhr.employee where employee_id=

'1001';if

sql%found then

print v_name||

','||v_date;

endif

;

exception

when no_data_found

then

print

'no data found!'

;when too_many_rows

then

print

'too many rows!'

;end

;執行成功, 執行耗時0毫秒. 執行號:89

馬學銘,

2008-05

-30影響了1條記錄

1條語句執行成功

上面這段處理過程,查詢只有一條匹配結果,正常列印了記錄中的指定字段內容。

通過上面的例子,可以看到,隱式游標使用上較為方便,省去了游標定義、開啟、關閉等操作,但使用場景上有侷限性,程式中限於insert、update、delete、select …into 等語句。

2.顯式游標

顯式游標指向乙個查詢語句執行後的結果集區域。當需要處理返回多條記錄的查詢時,應顯式地定義游標以處理結果集地每一行。

使用顯式游標一般包括四個步驟:

(1)定義游標:在 dmsql 程式的宣告部分定義游標,宣告游標及其關聯的查詢語句;

(2)開啟游標:執行游標關聯的語句,將查詢結果裝入游標工作區,將游標定位到結果集的第一行之前;

(3)撥動游標:根據應用需要將游標位置移動到結果集的合適位置;

(4)關閉游標:游標使用完後應關閉,以釋放其占有的資源。

下面的程式則是乙個顯式游標使用的例子。

declare 

v_name varchar(50

); v_phone varchar(50

);c1 cursor

;begin

open c1 for

select name,phone from person.person a,resources.employee b

where a.personid=b.personid;

loop

fetch c1 into v_name,v_phone;

exit

when c1%notfound;

print

'name:'

|| v_name ||

' phone number: '

||v_phone;

endloop

;close c1;

end;

/

動態游標在宣告部分只是先宣告乙個游標型別的變數,並不指定其關聯的查詢語句,在執行部分開啟游標時才指定查詢語句。動態游標的使用主要在定義和開啟時與顯式游標不同。

下面的例子則是乙個動態游標使用的過程。

declare

my_ename char(10

);my_empno numeric(4

);my_sal numeric(7

,2);

c1 cursor

;begin

open c1 for

select

*from other.empsalary;

loop

fetch c1 into my_ename, my_empno, my_sal;

exit

when c1%notfound;

print

'姓名:'

||my_ename ||

'工號:'

|| my_empno ||

' 薪水:'

|| my_sal;

endloop

;close c1;

end;

/

動態游標關聯的查詢語句還可以帶有引數,引數以「?」指定,同時在開啟游標語句中使用 using 子句指定引數,且引數的個數和型別與語句中的「?」必須一一匹配。下面的例子說明了如何使用關聯的語句中帶有引數的動態游標。

declare 

str varchar

;cursor csr;

begin

open csr for

'select loginid from resources.employee where title =? or

title =?'

using

'銷售經理'

,'總經理'

;loop

fetch csr into str;

exit

when csr%notfound;

print str;

endloop

;close csr;

end;

/

達夢資料庫中游標為我們提供了一種便捷處理結果集的方法,允許應用程式對查詢語句返回的結果集中每一行進行相同或不同的操作,而不是一次對整個結果集進行同一種操作,它還提供對基於游標位置而對錶中資料進行刪除或更新的能力,展示了資料庫強大的運算處理能力。

英偉達顯示卡的使用

先讓我興奮的大笑三聲 哈!哈!哈!終於有了1080ti來跑程式了,終於不用等好久才能調一次引數了。回歸正題,使用nvidia顯示卡的時候要注意一些什麼呢?在這裡主要檢視的就是視訊記憶體的使用情況,因為顯示卡記憶體常常會不足,這裡就要時刻注意千萬不要超出視訊記憶體。可能礦卡就是這麼來的。猜的 這裡既然...

達夢資料庫使用

1 修改最大連線數 先檢視當前的最大連線數 select sf get para value 2,max sessions 修改最大連線數 alter system set max sessions 1000 spfile 重啟資料庫 su dmdba cd dmdbms dmservicedmse...

達夢資料庫簡單使用

groupadd dinstall useradd g dinstall dmdba passwd dmdba 修改dmdba的密碼 mkdir p dm8 chown r dmdba dinstall dm8 dmdba執行 cd dm8 tool dbca.sh 圖形介面建立 dm8 bin d...