當前位置:首頁 » 編程語言 » 執行sql語句游標不能共享原因
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

執行sql語句游標不能共享原因

發布時間: 2022-05-30 08:24:57

sql游標怎麼用

例子
table1結構如下
id int
name varchar(50)

declare @id int
declare @name varchar(50)
declare cursor1 cursor for --定義游標cursor1
select * from table1 --使用游標的對象(跟據需要填入select文)
open cursor1 --打開游標

fetch next from cursor1 into @id,@name --將游標向下移1行,獲取的數據放入之前定義的變數@id,@name中

while @@fetch_status=0 --判斷是否成功獲取數據
begin
update table1 set name=name+'1'
where id=@id --進行相應處理(跟據需要填入SQL文)

fetch next from cursor1 into @id,@name --將游標向下移1行
end

close cursor1 --關閉游標
deallocate cursor1

㈡ 關於SQL SERVER 的游標問題

你這段程序真的很有問題
第一,UPDATE S SET SDEPT='計算機' WHERE @NATION='東陽' 這里@NATION是變數不是欄位,當@NATION='東陽'就把表裡面的數據全部都改了
第二,要實現你的要求只需要一條Update語句就可以了:
UPDATE S SET SDEPT='計算機' WHERE NATION='東陽'
根本不需要使用游標

㈢ 失敗原因:執行SQL失敗,失敗原因:批處理中出現錯誤: ORA-00911: invalid character

  1. 應該是錯誤輸入了全形字元,輸入半形字元就行了。

  2. 錯誤信息ORA-00911: invalid character說明了在執行的SQL語句中出現了無效字元,所在SQL語句無法通過語法分析過程導致了錯誤結果。

  3. 可能出現的原因有:錯誤地輸入了全形字元,比如輸入了全形逗號。

  4. 如果使用C++、Java、C#等編程時,總會習慣在語句最後加分號,而這個符號在SQL中是無效字元。

  5. 實際語句和列類型不匹配,比如將數值列賦值為字元串。

  6. 與display函數不同,display_cursor顯示的為真實的執行計劃。

  7. 對於format參數,使用與display函數的各個值,同樣適用於display_cursor函數。

  8. 當statistics_level為all或使用gather_plan_statistics提示可以獲得執行時的統計信息。

  9. 根據真實與預估的統計信息可以初步判斷SQL效率低下的原因,如統計信息的准確性、主要的開銷位於那些步驟等。

  10. 看你的sql語句最後是否有分號,有的話去掉就行 看你Oracle伺服器端字元集是否和Oracle客戶端字元集匹配。

  11. 查詢oracle server端的字元集:SQL>select userenv(『language』) from al。

  12. 查詢oracle client端的字元集。在windows平台下,就是注冊表裡面相應OracleHome的NLS_LANG。

  13. 還可以在dos窗口裡面自己設置,比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK。

㈣ SQL資料庫區域網共享

可以用ODBC來解決。
ODBC(Open Database Connectivity,開放資料庫互連)是微軟公司開發的一套開放資料庫系統應用程序介面規范,目前它已成為一種工業標准,它提供了統一的資料庫應用程序編程介面(API)。這些API利用SQL來完成其大部分任務。ODBC本身也提供了對SQL語言的支持,用戶可以直接將SQL語句送給ODBC。

SQL語言提供了兩種不同的使用方式。一種是在終端互動式方式下使用,另一種是將SQL語言嵌入到某種高級語言如PL/1、COBOL、FORTRAN、C中使用,利用高級語言的過程性結構來彌補SQL語言在實現復雜應用方面的不足,這種方式下使用的SQL語言稱為嵌入式SQL(Embedded SQL),而嵌入SQL的高級語言稱為主語言或宿主語言。

對宿主型資料庫語言SQL,DBMS可採用兩種方法處理,一種是預編譯,另一種是修改和擴充主語言使之能處理SQL語句。目前採用較多的是預編譯的方法。即由DBMS的預處理程序對源程序進行掃描,識別出SQL語句,把它們轉換成主語言調用語句,以使主語言編譯程序能識別它,最後由主語言的編譯程序將整個源程序編譯成目標碼。

三、 實驗內容:

一個基於ODBC的應用程序對資料庫的操作不依賴任何DBMS,不直接與DBMS打交道,所有的資料庫操作由對應的DBMS的ODBC驅動程序完成。

一個完整的ODBC由下列幾個部件組成:應用程序、ODBC管理器、驅動程序管理器(Driver Manager)、ODBC API、ODBC 驅動程序、數據源。

下面我們在前面實驗建立的資料庫的基礎上,配置相應的ODBC數據源。具體步驟如下:

1、通過程序—>設置—>控制面板—>管理工具—>點擊數據源圖標,出現ODBC數據源管理器對話框,點擊系統DSN選項卡,添加系統數據源。

2、選擇SQL SERVER的驅動

3、建立一個數據源名為ds,伺服器:HP或(202.201.224.123)的數據源。

4、SQL SERVER登錄驗證方式採用輸入登錄ID和密碼的SQL SERVER驗證

登錄ID和密碼均為:你的登錄名和密碼

5、默認資料庫指定為你所在班級的資料庫名

6、如下圖,這里使用默認選項,不做改動

7、出現如下圖所示:點擊測試數據源,驗證是否成功。

8、測試結果會出現在下圖所示的對話框中:

如測試成功,點擊確定,名為ds的數據源就建立好了。

這里將結合配置好的數據源,給出一個用Visual Basic連接SQL SERVER2000的實例:即創建一個客戶或前端資料庫應用程序,並在窗體中添加 ADO Data 控制項,以及其它所需要的任何 Visual Basic 控制項。可以根據您的需要在窗體中放置多個 ADO Data 控制項。

這里先介紹一下有關ADO Data 控制項的內容:

ADO Data 控制項使用 Microsoft ActiveX 數據對象(ADO) 來快速建立數據綁定的控制項和數據提供者之間的連接。數據綁定控制項是任何具有「數據源」屬性的控制項。數據提供者可以是任何符合 OLE DB 規范的數據源。使用Visual Basic 的類模塊也可以很方便地創建子集的數據提供者。盡管可以在應用程序中直接使用 ActiveX 數據對象,但 ADO Data 控制項有作為一個圖形控制項的優勢(具有「向前」和「向後」按鈕),以及一個易於使用的界面,使您可以用最少的代碼創建資料庫應用程序。在 Visual Basic 的「工具箱」中,不少控制項都可以作為數據綁定的控制項,包括復選框、組合框、圖像、標簽、列表框、圖片框以及文本框控制項等。此外,Visual Basic 還包括了若干種數據綁定的 ActiveX 控制項,諸如DataGrid、DataCombo、Chart以及 DataList 控制項等。用戶也可以創建自己的數據綁定的 ActiveX 控制項,或從其他開發商購買控制項。

Visual Basic以前的版本提供了內在的 Data 控制項和 Remote Data 控制項(RDC) 來進行數據訪問。這兩種控制項仍包括在 Visual Basic 中,以提供向後兼容。不過,因為 ADO 的適應性更廣,因此建議用戶使用 ADO Data 控制項來創建新的資料庫應用程序。

ADO DATA可能的用法

l 連接一個本地資料庫或遠程資料庫。

l 打開一個指定的資料庫表,或定義一個基於結構化查詢語言 (SQL) 的查詢、或存儲過程、或該資料庫中的表的視圖的記錄集合。

l 將數據欄位的數值傳遞給數據綁定的控制項,可以在這些控制項中顯示或更改這些數值。

l 添加新的記錄,或根據對顯示在綁定的控制項中的數據的任何更改來更新一個資料庫。

創建一個簡單的前端資料庫應用程序:

1、打開Visual Basic,創建一個標准工程(standard exe)。

2、在窗體上放置一個 ADO Data 控制項 (該圖標的工具提示為 "ADODC"),如果該控制項不在「工具箱」中,請按 CTRL+T 鍵,顯示「部件」對話框。在這個「部件」對話框中,單擊「Microsoft ADO Data Control」,再單擊「應用」。

2. 在「工具箱」中,單擊選定「ADO Data控制項」。就建立了一個名為Adodc1的ADO Data控制項,然後按 F4 鍵顯示「屬性」窗口。

3. 在「屬性」窗口中,單擊「ConnectionString」,在它的有側將顯示 圖標。

4. 在「屬性」窗口中,將「RecordSource」屬性設置為一個 SQL 語句。例如:SELECT * FROM Departemnt .

ADO Data控制項屬性設置:

屬性
屬性值

ConnectionString
DSN=ds

CommandType
8-adCmdUnknown

RecordSource
SELECT * FROM Department

5.在窗體上放置一個「標簽」控制項,顯示說明內容。

6.在窗體上再放置一個「文本框」控制項,用來顯示資料庫信息。

7. 在其「屬性」窗口中,將 Text1 的「DataSource」屬性設為 ADO Data 控制項的名稱 (ADODC1)。這樣就將這個文本框和 ADO Data 控制項綁定在一起。

8. 在其「屬性」窗口中,單擊「DataField」將下拉得到一個可用的欄位列表。單擊所要顯示的欄位的名稱。

控制項名
屬性
屬性值

Text1
DataSource
Adodc1

DataField
要顯示的欄位名

9. 對希望訪問的其它每個欄位重復第 5、6、7、8 步。

10.按 F5 鍵運行該應用程序。用戶可以在 ADO Data 控制項中使用四個箭頭按鈕,從而允許用戶到達數據的開始、記錄的末尾或在數據內從一個記錄移動到另一個記錄。

SQL語言與主語言具有不同數據處理方式。SQL語言是面向集合的,一條SQL語句原則上可以產生或處理多條記錄。而主語言是面向記錄的,一組主變數一次只能存放一條記錄。所以僅使用主變數並不能完全滿足SQL語句向應用程序輸出數據的要求,為此嵌入式SQL引入了游標的概念,用游標來協調這兩種不同的處理方式。游標是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果。每個游標區都有一個名字。用戶可以用SQL語句逐一從游標中獲取記錄,並賦給主變數,交由主語言進一步處理。

使用游標在需要一行一行處理時,游標十分有用。游標可以打開一個結果集合,並提供在結果集中一行一行處理的功能。下面的例子給出了一個利用游標來查詢指定學號的學生所選修的課程成績。

引自:http://www.nx5127.com/863.html

㈤ Delphi執行SQL游標的奇怪問題!

delphi 一般是給 sql server 下的指令,然後sql 進行執行,然後獲取你想要的結果,你用的是BDE還是ADO 建議你用下ADO試試!

㈥ 這個存儲過程游標為什麼不能執行sql語句

用dbms_sql實現吧,參考下面語句
declare
v_cursorid number;
v_selectrecords varchar2(500);
v_numrows integer;
v_mynum integer;
v_mytext varchar(50);
begin
v_cursorid := dbms_sql.open_cursor;
v_selectrecords := 'select * from mytable';
dbms_sql.parse(v_cursorid,v_selectrecords,dbms_sql.native);
dbms_sql.define_column(v_cursorid,1,v_mynum);
dbms_sql.define_column(v_cursorid,2,v_mytext,50);
v_numrows := dbms_sql.execute(v_cursorid);
loop
if dbms_sql.fetch_rows(v_cursorid)=0 then exit;
end if;
dbms_sql.column_value(v_cursorid,1,v_mynum);
dbms_sql.column_value(v_cursorid,2,v_mytext);
dbms_output.put_line(v_mynum||' '||v_mytext);
end loop;

dbms_sql.close_cursor(v_cursorid);
end;

㈦ sql server 新建查詢創建游標後,為什麼再次新建查詢打開游標,提示名為 'x' 的游標不存在

游標的作用域最高為連接級:在同一個連接上,可以共用游標,連接斷開,游標清除。
如果建立游標時指定【local】關鍵字,則在定義它的代碼段(或過程/函數/觸發器)執行完後釋放。
在SSMS中,每一個查詢窗口,都是獨立的連接,所以不能共用同一個游標。

㈧ SQL中的指針和游標怎麼理解

windows或DOS的「游標」不同,MS-SQL的游標是一種臨時的資料庫對象,既對可用來旋轉儲存在系統永久表中的數據行的副本,也可以指向儲存在系統永久表中的數據行的指針。
游標為您提供了在逐行的基礎上而不是一次處理整個結果集為基礎的操作表中數據的方法。 1.如何使用游標 1)定義游標語句 Declare <游標名> Cursor For
2)創建游標語句 Open <游標名>
3)提取游標列值、移動記錄指針 Fetch <列名列表> From <游標名> [Into <變數列表>]
4)使用@@Fetch_Status利用While循環處理游標中的行
5)刪除游標並釋放語句 Close <游標名>/Deallocate <游標名>
6)游標應用實例 --定義游標
Declare cur_Depart Cursor
For Select cDeptID,cDeptName From Department into @DeptID,@DeptName
--創建游標
Open cur_Depart
--移動或提取列值
Fetch From cur_Depart into @DeptID,@DeptName
--利用循環處理游標中的列值
While @@Fetch_Status=0
Begin
Print @DeptID,@DeptName
Fetch From cur_Depart into @DeptID,@DeptName
End
--關閉/釋放游標
Close cur_Depart
Deallocate cur_Depart2.語句的詳細及注意 1)定義游標語句 Declare <游標名> [Insensitive] [Scroll] Cursor
For <Select 語句> [FOR {Read Only | Update [ OF <列名列表>]}] Insensitive DBMS創建查詢結果集數據的臨時副本(而不是使用直接引用資料庫表中的真實數據行中的列)。游標是Read Only,也就是說不能修改其內容或底層表的內容; Scroll 指定游標支持通過使用任意Fetch 選項(First Last Prior Next Relative Absolute)選取它的任意行作為當前行。如果此項省略,則游標將只支持向下移動單行(即只支持游標的Fetch Next); Select語句 定義游標結果集的標准 SELECT 語句。在游標聲明的 <Select語句>內不允許使用關鍵字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO; Read Only 防止使用游標的用戶通過更新數據或刪除行改變游標的內容; Update 創建可更新游標且列出值能被更新的游標列。如果子句中列入了任意列,則只有被列入的列才能被更新。如果Declare Cursor語句中只指定的UPDATE(沒有列名列表),則游標將允許更新它的任何或所有列。
Declare cur_Depart Cursor
For Select * From Department For Update OF cDeptID,cDeptName 2)提取游標列值、移動記錄指針語句 Fetch [Next | Prior | First | Last | {Absolute <行號>} | {Relative <行號>}]
From <游標名> [Into <變數列表……>] 每次執行Fetch語句時,DBMS移到游標中的下一行並把游標中的列值獲取到Into中列出的變數中。因此Fetch語句的Into子句中列出的變數必須與游標定義中Select 語句中的列表的類型與個數相對應; 僅當定義游標時使用Scroll參數時,才能使用Fetch語句的行定位參數(First Last Prior Next Relative Absolute);如果Fetch語句中不包括參數Next | Prior | First | Last,DBMS將執行默認的Fetch Next; Next 向下、向後移動一行(記錄); Prior 向上、向前移動一行(記錄); First 移動至結果集的第一行(記錄); Last 移動至結果集的最後一行(記錄); Absolute n 移動到結果集中的第n行。如果n是正值,DBMS從結果集的首部向後或向下移動至第n行;如果n是負數,則DBMS從結果集的底部向前或向上移動n行;
Fetch Absolute 2 From cur_Depart Into @DeptID,@DeptName Relative n 從指針的當前位置移動n行。如果n是正值,DBMS將行指針向後或向下移動至第n行;如果n是負數,則DBMS將行指針向前或向上移動n行;
Fetch Relative 2 From cur_Depart Into @DeptID,@DeptName 3)基於游標的定位DELETE/UPDATE語句 如果游標是可更新的(也就是說,在定義游標語句中不包括Read Only 參數),就可以用游標從游標數據的源表中DELETE/UPDATE行,即DELETE/UPDATE基於游標指針的當前位置的操作;
舉例: --刪除當前行的記錄
Declare cur_Depart Cursor
For Select cDeptID,cDeptName From Department into @DeptID,@DeptName
Open cur_Depart
Fetch From cur_Depart into @DeptID,@DeptName
Delete From Department Where CURRENT OF cur_Depart --更新當前行的內容
Declare cur_Depart Cursor
For Select cDeptID,cDeptName From Department into @DeptID,@DeptName
Open cur_Depart
Fetch From cur_Depart into @DeptID,@DeptName
Update Department Set cDeptID=』2007』 + @DeptID Where CURRENT OF cur_Depart3.游標使用技巧及注意 1)利用Order By改變游標中行的順序。此處應該注意的是,只有在查詢的中Select 子句中出現的列才能作為Order by子句列,這一點與普通的Select語句不同;
2)當語句中使用了Order By子句後,將不能用游標來執行定位DELETE/UPDATE語句;如何解決這個問題,首先在原表上創建索引,在創建游標時指定使用此索引來實現;例如:
Declare cur_Depart Cursor
For Select cDeptID,cDeptName From Department With INDEX(idx_ID)
For Update Of cDeptID,cDeptName
通過在From子句中增加With Index來實現利用索引對表的排序;
3)在游標中可以包含計算好的值作為列;
4)利用@@Cursor_Rows確定游標中的行數;

㈨ SQL中關於游標的問題

--一般游標分定義,打開,讀取,關閉和釋放幾個步驟
--1.定義變數,用來保存游標讀取的數據
DECLARE@IDINT
--2.定義游標
DECLARECurCURSORFOR
SelectidFrom表
--3.打開游標
OPENCur
--4.循環讀取
FETCHNEXTFROMCurINTO@ID
WHILE@@FETCH_STATUS=0
BEGIN
--要做的事
FETCHNEXTFROMCurINTO@ID
END
--5.關閉游標
CLOSECur
--6.釋放游標
DEALLOCATECur

㈩ MS SQL關於使用觸發器和游標同步更新數據的問題

我這邊執行你的存儲過程操作是可以進行更新的,不知道你更新不了具體錯誤是什麼?

修改前初始數據

最後,值得注意的是,定義decimal類型時最好帶上精度,不然會出現四捨五入的情況,declimal默認指的是decimal(18,0)