當前位置:首頁 » 服務存儲 » 存儲過程cursor什麼意思
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

存儲過程cursor什麼意思

發布時間: 2022-08-21 05:34:42

1. oracle 中的 cursor是什麼東東

1. 什幺是游標?

游標,也有人稱為游標。概括的講,它是基於記錄的。

過去,關系型資料庫沒有象現在這樣被廣泛的應用。那時候,人們大多使用 dBase 這樣的小型資料庫軟體。這類資料庫確切的說應為數據文件管理軟體。他們是面向記錄的。

不過,這種方式也許更符合人們的習慣。比如,我們在電話本中查找號碼,在學生檔案中查找檔案,最終都要歸結於其中的一個號碼,一個檔案,那就是一條記錄。現實生活中,我們在一張表格中尋找某一項時,可能會用手一條一條逐行的掃過,以幫助我們找到所需的那條記錄。對應於資料庫來說,這就是游標的模型。所以,你可以這樣想像:表格是資料庫中的表,而我們的手好比是游標。

所以,當你使用類似 .MoveNext,.MoveLast 這樣的語句時,覺得再自然不過了。

現在,你明白什幺是游標了吧。游標就是數據的 ' 定位系統 ' 。

這個 ' 定位系統 ' 粗分有兩種:伺服器游標和客戶游標。對應於 ADO 中的 CursorLocation 。舉例來說:

Set rs = Server.CreateObject("ADODB.RecordSet")
rs.CursorLocation = adUseServer '預設,使用伺服器游標
.....
rs.CursorLocation = adUseClient '使用客戶游標

2. 什幺是伺服器游標?

或者稱為 API 伺服器游標。

假設你要查詢有關編程語言的書,寫成 sql 語句就是:SELECT book_id,book_title FROM books WHERE book_catalog = '編程' ORDER BY book_title,同時你指定使用伺服器游標。

這條語句發送到伺服器,伺服器對數據進行檢索,將符合查詢條件的記錄集合放入臨時表(對某些游標類型是這樣)中。每當你進行 .MoveNext 操作,伺服器就會發送一條記錄到客戶端的緩沖區,然後你才可以使用它。

3. 什幺是 CacheSize ?

繼續上面的例子,假設符合查詢條件的記錄有100個,也就是說,用 .MoveNext 這種方法遍歷該結果集需要同伺服器交互100次。我們可以通過設置 CacheSize 使客戶與伺服器的通信變少。上面的例子其實就是 CacheSize=1 的情況,這是預設值。

假設 CacheSize=4,當 RecordSet 對象打開時,伺服器發送4條記錄到客戶端。前4次的 .MoveNext 操作實際上是在客戶緩沖區中得到數據,當第5次 .Movenext 時,伺服器才發送下一個4條記錄。由此,減少了客戶與伺服器間的網路通信。

那幺是不是說 CacheSize 越大越好呢?千萬不要想當然。萬事都有兩面性,CacheSize 也一樣。客戶端請求數據,伺服器發送數據,這個過程有點象交通管理。CacheSize 過高,會阻塞交通,甚至引起數據丟失(比如當 Cachesize 大於客戶端緩沖區時)。對於不同的應用,所取的值也不同。

另外要指出的是,使用任何形式的游標都不是最有效的訪問數據的方法,Cachesize 有的時候並不是瓶頸,盡量將使用游標的程序轉換為面向結果集的程序,性能會提高很多。

3. 什幺是客戶游標?

既然游標是數據的 ' 定位系統 ',那幺在客戶端也可以完成。

客戶游標的產生由來已久,當初是為了彌補伺服器的不足(有些資料庫引擎就不支持游標)。隨著伺服器游標的出現,客戶游標似乎已經過時了,不過還是那句話:萬事都有兩面性,在 internet 上,與資料庫的連接並不是永久的,使用客戶游標能使我們獲得同使用伺服器游標一樣的功能。

當 CursorLoction 屬性設成 adUseClient 時,微軟的游標服務( Cursor Service )創建 RecordSet 對象,用前向 / 只讀的游標方式從伺服器將所有查詢結果檢索出來,並且存儲在客戶緩沖區中。當應用程序通過 ADO 請求數據時,游標服務就從客戶緩沖區中檢取數據。這種方式在連接遠程伺服器時非常有用,它會提高應用程序的性能。如果你訪問的資料庫是 Jet 資料庫( Access ),而且在本地,那麼用客戶游標非但不提高性能,還會使性能下降。這時候,數據將被緩存兩次,資料庫一次,游標服務一次。

如果考慮應用的功能,客戶游標功能是很完善的,它能支持某些資料庫不能完成的操作( 視資料庫的情況而定 )。

4. 什幺是 DisConnected RecordSet ?

我們使用了客戶游標,就可以斷開與資料庫的連接,釋放 Connection 對象。這樣的結果集就是 DisConnected RecordSet。舉例說明:

Dim c As New ADODB.Connection
Dim r As New ADODB.Recordset
On Error GoTo handler

c.ConnectionString = connectStr
c.CursorLocation = adUseClient
c.Open
Set r.ActiveConnection = c
r.Open SqlText, , adOpenKeyset, adLockBatchOptimistic, -1
Set r.ActiveConnection = Nothing ' This disconnects the recordset.
c.Close
Set c = Nothing
......
......
' Recordset is now in disconnected state; do something with it.
r.Close
Set r = Nothing
......

2. 6、什麼是存儲過程什麼是游標,何時使用、何時不用游標

存儲過程是一組命名了的SQL語句集合,是為了完成特定功能匯集而成的。該集合編譯後存放在資料庫中,可根據實際情況重新編譯,可直接運行,也可遠程運行且存儲過程直接在伺服器端運行。

游標實際上是一種能從包括多條數據記錄的結果集(結果集是select查詢之後返回的所有行數據的集合)中每次提取一條記錄的機制充當指針的作用,遍歷結果中的所有行,但他一次只指向一行。

游標在循環處理欄位的時候使用

建議:盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該考慮改寫;使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效;與臨時表一樣,游標並不是不可使用。

3. 存儲過程的游標是什麼 有什麼作用

ALTER proc [dbo].[存儲過程名]
as
begin
declare 游標名字 cursor for select 列名 from 表名 where 條件--先申明游標指向查詢出的結果,一列,或者多列都可以,條件自定
declare 變數名 varchar(400)--存儲取到的值
open 游標名 --開啟游標
while @@FETCH_STATUS=0--取值
begin
fetch next FROM 游標名 into 變數名--這樣就將游標指向下一行,得到的第一行值就傳給變數了
-------------------------------------------
--需要執行的操作,例如修改某表中的欄位
update 表名
set 列名=值
where (修改表中的列)=變數名
-------------------------------------------
end
close 游標名--關閉游標

deallocate 游標名--釋放游標
end

4. 寫存儲過程時候「type cur is ref cursor」這句話是什麼意思

整體的意思是「創建一個類型變數cur,它引用游標」,除了cur外,其餘全是關鍵字。
TYPE cur:定義類型變數
is ref cursor:相當於數據類型,不過是引用游標的數據類型。
這種變數通常用於存儲過程和函數返回結果集時使用,因為PL/SQL不允許存儲過程或函數直接返回結果集,但可以返回類型變數,於是引用游標的類型變數作為輸出參數或返回值就應運而生了。

5. 存儲過程中游標是怎麼用的

CREATE PROCEDURE sp_BuildIndexes
AS
DECLARE @TableName sysname,@msg varchar(100),@cmd varchar(100)
DECLARE table_cur CURSOR FOR
SELECT name FROM sysobjects WHERE TYPE='U' --在sysobjects表中'u'表示用戶創建的表
OPEN table_cur
FETCH NEXT FROM table_cur INTO @TableName
WHILE @@fetch_status=0
BEGIN
IF @@fetch_status=-2
CONTINUE
SELECT @msg='Building indexes for table'+@TableName+'_'
PRINT @msg
SELECT @cmd='DBCC DBREINDEX('+@TableName+')'
EXEC (@cmd)
PRINT ''
FETCH NEXT FROM table_cur INTO @TableName
END
DEALLOCATE table_cur
GO

EXEC sp_BuildIndexes
EXEC('DBCC DBREINDEX(authors)') --許多 DBCC 語句能夠對檢測到的問題進行修復。
--重建索引(dbcc dbreindex)

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

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

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

7. 資料庫裡面游標CURSOR

你的CURSOR是什麼資料庫的。sqlserver還是oracle?
游標的定義說不好,不過我理解的是,選出一堆數據放到一個游標里
在後續的任務里循環調出每一行數據去匹配並得到所要的結果,oracle的游標例子可以提供,sqlserver提供不了,需要的話說一聲,給你發個例子。

游標一般定義於存儲過程或者函數中;
--定義游標:
CURSOR cur_cursor_name
IS
SELECT 欄位1,欄位2(可定義多個欄位)

from table_name
WHERE 條件;
--在後續中,要打開游標:
open cur_cursor_name;
loop
fetch cur_cursor_name into v_cursor_name;--把游標取出的數據放到一個變數,v_cursor_name為定義的變數名
EXIT WHEN cur_cursor_name%NOTFOUND;--當取再沒有數據可取時退出遊標

再然後你就可以根據游標取出的數據進行你需要的操作

8. 資料庫中cursor是什麼

cursor 是游標, 對按條件查詢出來的結果集進行逐條遍歷操作

你編寫過和資料庫操作的程序沒,還有你知道資料庫里的存儲過程沒,如果要你在存儲過程裡面進行一些復雜的操作改怎麼辦,查詢出來的可能是多條數據,然後對每條數據進行操作該怎麼辦,游標在這就有用了

9. 資料庫存儲過程語法

CREATE PROC [ EDURE ] procere_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]

[ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS sql_statement [ ...n ]
參數:procere_name存儲過程的名稱。過程名必須符合標識符規則,且對於資料庫及其所有者必須唯一。
要創建局部臨時過程,可以在 procere_name 前面加一個編號符 (#),要創建全局臨時過程,可以加兩個編號符 (##)。完整的名稱(包括 # 或 ##)不能超過 128 個字元。指定過程所有者的名稱是可選的。;number是可選的整數,用來對同名的過程分組,以便用一條 DROP PROCEDURE 語句即可將同組的過程一起除去。例如,名為 orders 的應用程序使用的過程可以命名為 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 語句將除去整個組。如果名稱中包含定界標識符,則數字不應包含在標識符中,只應在 procere_name 前後使用適當的定界符。@parameter過程中的參數。在 CREATE PROCEDURE 語句中可以聲明一個或多個參數。用戶必須在執行過程時提供每個所聲明參數的值(除非定義了該參數的默認值)。存儲過程最多可以有 2.100 個參數。使用 @ 符號作為第一個字元來指定參數名稱。參數名稱必須符合標識符的規則。每個過程的參數僅用於該過程本身;相同的參數名稱可以用在其它過程中。默認情況下,參數只能代替常量,而不能用於代替表名、列名或其它資料庫對象的名稱。有關更多信息,請參見 EXECUTE。 data_type參數的數據類型。所有數據類型(包括 text、ntext 和 image)均可以用作存儲過程的參數。不過,cursor 數據類型只能用於 OUTPUT 參數。如果指定的數據類型為 cursor,也必須同時指定 VARYING 和 OUTPUT 關鍵字。說明 對於可以是 cursor 數據類型的輸出參數,沒有最大數目的限制。VARYING指定作為輸出參數支持的結果集(由存儲過程動態構造,內容可以變化)。僅適用於游標參數。default參數的默認值。如果定義了默認值,不必指定該參數的值即可執行過程。默認值必須是常量或 NULL。如果過程將對該參數使用 LIKE 關鍵字,那麼默認值中可以包含通配符(%、_、[] 和 [^])。OUTPUT表明參數是返回參數。該選項的值可以返回給 EXEC[UTE]。使用 OUTPUT 參數可將信息返回給調用過程。Text、ntext 和 image 參數可用作 OUTPUT 參數。使用 OUTPUT 關鍵字的輸出參數可以是游標佔位符。n表示最多可以指定 2.100 個參數的佔位符。{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}RECOMPILE 表明 SQL Server 不會緩存該過程的計劃,該過程將在運行時重新編譯。在使用非典型值或臨時值而不希望覆蓋緩存在內存中的執行計劃時,請使用 RECOMPILE 選項。ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 語句文本的條目。使用 ENCRYPTION 可防止將過程作為 SQL Server 復制的一部分發布。說明 在升級過程中,SQL Server 利用存儲在 syscomments 中的加密注釋來重新創建加密過程。 FOR REPLICATION指定不能在訂閱伺服器上執行為復制創建的存儲過程。.使用 FOR REPLICATION 選項創建的存儲過程可用作存儲過程篩選,且只能在復制過程中執行。本選項不能和 WITH RECOMPILE 選項一起使用。AS指定過程要執行的操作。sql_statement過程中要包含的任意數目和類型的 Transact-SQL 語句。但有一些限制。n是表示此過程可以包含多條 Transact-SQL 語句的佔位符。默認情況下,參數可為空。如果傳遞 NULL 參數值並且該參數在 CREATE 或 ALTER TABLE 語句中使用,而該語句中引用的列又不允許使用 NULL,則 SQL Server 會產生一條錯誤信息。為了防止向不允許使用 NULL 的列傳遞 NULL 參數值,應向過程中添加編程邏輯或為該列使用默認值(使用 CREATE 或 ALTER TABLE 的 DEFAULT 關鍵字)。建議在存儲過程的任何 CREATE TABLE 或 ALTER TABLE 語句中都為每列顯式指定 NULL 或 NOT NULL,例如在創建臨時表時。ANSI_DFLT_ON 和 ANSI_DFLT_OFF 選項控制 SQL Server 為列指派 NULL 或 NOT NULL 特性的方式(如果在 CREATE TABLE 或 ALTER TABLE 語句中沒有指定的話)。如果某個連接執行的存儲過程對這些選項的設置與創建該過程的連接的設置不同,則為第二個連接創建的表列可能會有不同的為空性,並且表現出不同的行為方式。如果為每個列顯式聲明了 NULL 或 NOT NULL,那麼將對所有執行該存儲過程的連接使用相同的為空性創建臨時表。在創建或更改存儲過程時,SQL Server 將保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的設置。執行存儲過程時,將使用這些原始設置。