T SQL 游標名稱的作用域

2022-09-17 09:30:16 字數 2849 閱讀 8228

microsoft® sql server™ 2000 支援 declare cursor 語句上的 global 和 local 關鍵字以定義游標名稱的作用域。global 指定游標名稱對連線是全域性性的。local 指定游標名稱對含有 declare cursor 語句的儲存過程、觸發器或批處理是區域性性的。

在 microsoft® sql server™ 7.0 版之前的版本中,transact-sql 游標的名稱對連線而言是全域性的。可以執行乙個建立游標的儲存過程,然後呼叫另乙個儲存過程從此游標中提取行:

use pubs

gocreate procedure opencrsr as

declare samplecrsr cursor for

select au_lname

from authors

where au_lname like 's%'

open samplecrsr

gocreate procedure readcrsr as

fetch next from samplecrsr

while (@@fetch_status <> -1)

begin

fetch next from samplecrsr

endgo

exec opencrsr /* declares and opens samplecrsr. */

goexec readcrsr /* fetches the rows from samplecrsr. */

goclose samplecrsr

godeallocate samplecrsr

go

區域性游標為儲存過程和觸發器中執行的游標提供了重要的保護作用。全域性游標可以在宣告它們的儲存過程或觸發器的外部被引用。因此,儲存過程或觸發器的外部語句可能會在無意中更改它們。因為不能在儲存過程以外引用區域性游標,因此區域性游標比全域性游標更安全,除非故意將區域性游標作為游標輸出引數返**用方。

因為可以在儲存過程或觸發器的外部引用全域性游標,所以全域性游標可能會在無意中影響其它語句。例如,在儲存過程中建立了乙個名為xyz的全域性游標,在儲存過程結束時此游標是開啟的。當此儲存過程完成後若要使用xyz來宣告另乙個全域性游標,則會因為使用重複的名稱錯誤而導致失敗。

全域性游標和區域性游標有各自的命名空間,因此可以同時有相同名稱的全域性游標和區域性游標。接受游標命名引數的transact-sql 語句也支援 global 關鍵字來標識名稱的作用域。如果沒有指定 global,且在游標名稱引數中同時有指定了此名稱的全域性游標和區域性游標,則引用此區域性游標。

如果 local和 global 都沒有指定,則資料庫選項default to local cursor控制由 declare cursor 語句使用的預設值。如果default to local cursortrue,transact-sql 游標預設為是區域性的。如果此選項為false,transact-sql 游標預設為是全域性游標。在 sql server 2000版中,default to local cursors選項預設為 false,以便與 sql server 早期版本中的內容匹配。

使用 declare 和 open 區域性游標的儲存過程可以將游標傳遞出去以供要求呼叫的儲存過程、觸發器或批處理使用。這可以通過使用由新的 cursor varying 資料型別定義的 output 引數來實現。游標變數只能用作 output 引數。不能將它們用於輸入引數。當儲存過程完成時游標必須是開啟的,以便將游標返回 output 引數。也可以通過新的 cursor 資料型別來宣告區域性變數以包含對區域性游標的引用。

use pubs

go/* create a procedure with a cursor output parameter. */

create procedure opencrsr @outcrsr cursor varying output as

set @outcrsr = cursor for

select au_lname

from authors

where au_lname like 's%'

open @outcrsr

go/* allocate a cursor variable. */

declare @crsrvar cursor

/* execute the procedure created earlier to fill

the variable. */

exec opencrsr @outcrsr = @crsrvar output

/* use the variable to fetch the rows from the cursor. */

fetch next from @crsrvar

while (@@fetch_status <> -1)

begin

fetch next from @crsrvar

endclose @crsrvar

deallocate @crsrvar

go

資料庫 api 不支援儲存過程中的游標輸出引數。不能直接從資料庫 api 函式執行包含游標輸出引數的儲存過程。而只能從另乙個儲存過程、觸發器、transact-sql 批處理或指令碼執行這些儲存過程。

只有在明確釋放時或關閉連線時 global 游標才可用。建立 local 游標的儲存過程、觸發器或批處理終止時將隱性釋放 local 游標,除非游標已作為引數返回。當呼叫過程的**中引用游標的引數或變數超出作用域時,將隱性地釋放 local 游標。

**

名稱查詢,確定作用域,覆蓋

訪問乙個屬性時,直譯器必須在三個命名空間中的乙個找到他。首先從區域性命名空間開始,如果沒有找到,直譯器將繼續查詢全域性命名空間。如果這也失敗了,它將在內建空間名稱裡查詢。如果最後的嘗試也失敗了,將會報nameerror。區域性空間名稱中找到的名字會隱藏全域性或內建命名空間的對應物件。這就相當於覆蓋了...

Javascript的作用域域作用域鏈的理解

如何解析一段可執行 分了兩個階段 解析 和執行 其中解析 可以理解為記名字,就是先把關鍵字var和function定義的變數名登記了下來,這也就有了變數提公升這一說。在執行 階段才是真正的執行賦值,運算等操作。暫不解析這幾個名詞,先來看乙個例子。var scope global function f...

作用域 的作用

1 作用域符號 的前面一般是類名稱,後面一般是該類的成員名稱,c 為例避免不同的類有名稱相同的成員而採用作用域的方式進行區分 如 a,b表示兩個類,在a,b中都有成員member。那麼 a member就表示類a中的成員member b member就表示類b中的成員member 2 全域性作用域符...