❶ 存儲過程的游標是什麼 有什麼作用
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
❷ oracle存儲過程游標有什麼用
1,什麼是游標?
①從表中檢索出結果集,從中每次指向一條記錄進行交互的機制。
②關系資料庫中的操作是在完整的行集合上執行的。
由SELECT 語句返回的行集合包括滿足該語句的WHERE 子句所列條件的所有行。由該語句返回完整的行集合叫做結果集。
應用程序,尤其是互動和在線應用程序,把完整的結果集作為一個單元處理並不總是有效的。
這些應用程序需要一種機制來一次處理一行或連續的幾行。而游標是對提供這一機制的結果集的擴展。
游標是通過游標庫來實現的。游標庫是常常作為資料庫系統或數據訪問API 的一部分而得以實現的軟體,
用來管理從數據源返回的數據的屬性(結果集)。這些屬性包括並發管理、在結果集中的位置、返回的行數,
以及是否能夠在結果集中向前和/或向後移動(可滾動性)。
游標跟蹤結果集中的位置,並允許對結果集逐行執行多個操作,在這個過程中可能返回至原始表,也可能不返回至原始表。
換句話說,游標從概念上講基於資料庫的表返回結果集。
由於它指示結果集中的當前位置 ,就像計算機屏幕上的游標指示當前位置一樣,「游標」由此得名。
❸ 存儲過程中游標是怎麼用的
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)
❹ 執行存儲過程顯示 游標不存在
將
close kecheng_cousor
deallocate kechang_cousor
移到循環外
create procere add_record @sno char(9)
as
declare @total_num int,@cno char(4)
SET NOCOUNT on;
select @total_num= COUNT(*) from Student where Sno=@sno
if @total_num=0
begin
print'該學生不存在!'
return
end
else
begin
declare kecheng_cursor CURSOR FOR select cno from course
open kecheng_cousor
fetch next from kecheng_cursor into @cno
while @@FETCH_STATUS=0
begin
select @total_num=COUNT(*) from SC where Sno=@sno and Cno=@cno
if @total_num>0
begin
FETCH NEXT FROM kecheng_cousor into @cno
continue
end
else
begin
insert into SC(Sno,cno,grade)values(@sno,@cno,100*RAND())
fetch next from kecheng_cousor into @cno
end
end
close kecheng_cousor
deallocate kechang_cousor
end
❺ oracle在存儲過程中定義游標
sql">createorreplace
procerepro6
as
vempnoemp.empno%type;
venameemp.ename%type;
cursorc_empisselectempno,enamefromemp;
begin
openc_emp;
loop
fetchc_empintovempno,vename;
exitwhenc_emp%notfound;
dbms_output.put_line('編號:'||vempno||'姓名:'||vename);
endloop;
closec_emp;
end;
❻ Oracle存儲過程游標for循環怎麼寫
首先編寫存儲過程的整體結構,如下:
create or replace procere test_proc is
v_date date; --變數定義
begin
select sysdate into v_date from al;
end test_proc;
❼ 存儲過程的游標什麼作用
①從表中檢索出結果集,從中每次指向一條記錄進行交互的機制。
②關系資料庫中的操作是在完整的行集合上執行的。
由SELECT 語句返回的行集合包括滿足該語句的WHERE 子句所列條件的所有行。由該語句返回完整的行集合叫做結果集。
應用程序,尤其是互動和在線應用程序,把完整的結果集作為一個單元處理並不總是有效的。
這些應用程序需要一種機制來一次處理一行或連續的幾行。而游標是對提供這一機制的結果集的擴展。
❽ 存儲過程中游標的使用
下面是一個樣例,參考一下吧:
procere BAK_ONHAND(p_batch_code in varchar2,
p_calc_date_code in varchar2) is
r_onhand CUX_MTL_ONHAND_BAK_TEMP%rowtype;
v_bak_date date;
Cursor C1 is
select moq.inventory_item_id,
msib.segment1 item_code,
msib.description item_des,
msib.primary_unit_of_measure item_uom,
moq.subinventory_code,
moq.locator_id,
nvl(sum(moq.transaction_quantity), 0) trans_qty,
moq.organization_id
from mtl_onhand_quantities_detail moq, mtl_system_items_b msib
where moq.inventory_item_id = msib.inventory_item_id
and moq.organization_id = msib.organization_id
and msib.organization_id = g_organization_id
and exists (select 1
from CUX_ITEM_VENDOR_INFOR_T ci
where msib.inventory_item_id = ci.item_id
and msib.organization_id = ci.organization_id
and ci.plan_or_delivery = '計劃')
group by moq.inventory_item_id,
msib.segment1,
msib.description,
msib.primary_unit_of_measure,
moq.subinventory_code,
moq.locator_id,
moq.organization_id
order by msib.segment1;
begin
v_bak_date := sysdate;
r_onhand.BATCH_CODE := p_batch_code;
r_onhand.catc_date_code := p_calc_date_code;
r_onhand.created_by := g_user_id;
r_onhand.creation_date := sysdate;
r_onhand.last_updated_by := g_user_id;
r_onhand.last_update_date := sysdate;
r_onhand.last_update_login := g_login_id;
for c11 in C1 loop
r_onhand.ITEM_ID := c11.inventory_item_id;
r_onhand.ITEM_CODE := c11.item_code;
r_onhand.ITEM_DES := c11.item_des;
r_onhand.ITEM_UOM := c11.item_uom;
r_onhand.SUB_CODE := c11.subinventory_code;
r_onhand.LOCATOR_ID := c11.locator_id;
r_onhand.TRANS_QTY := c11.trans_qty;
r_onhand.ORGANIZATION_ID := g_organization_id;
r_onhand.BAK_DATE := v_bak_date;
r_onhand.ATTRIBUTE1 := '';
r_onhand.ATTRIBUTE2 := '';
r_onhand.ATTRIBUTE3 := '';
r_onhand.ATTRIBUTE4 := '';
r_onhand.ATTRIBUTE5 := '';
insert into CUX_MTL_ONHAND_BAK_TEMP values r_onhand;
end loop; ---end C1
commit;
end BAK_ONHAND;
❾ oracle存儲過程游標使用疑問
1、for t_name in (select ...) loop
這個是隱式游標,相當於一個結果集,隱式Cursor由系統自動打開和關閉。
exit when %notfound是配合fetch使用,沒有fetch就不需要。
你第一個存儲過程可以這樣寫:
create or replace procere d_1 is
begin
for cur in (select * from t_t) ---這個cur是隱式游標,無需定義,直接使用。
loop
dbms_output.put_line(cur.name);
end loop;
end;
/
2、使用的是標準的顯式游標
a 定義游標---Cursor [Cursor Name] IS;
b 打開游標---Open [Cursor Name];
c 操作數據---Fetch [Cursor name]
d 關閉游標---Close [Cursor Name]
希望能幫到你。
❿ oracle存儲過程游標問題
--打開游標並提取後面SQL的第一行數據放到游標中 這里就是打開游標
open for 是隱式游標的寫法 不建議使用 這種游標好象不需要關閉 具體你自己測試下 而且少了expection 處理
fetch mycur into yang_02;
--循環插入數據
多餘了 可以不要 前面有fetch了如果還有這里的話 就只能插入奇數行
其他沒什麼問題了 還有你這個過程用ref cursor是浪費 沒必要用 用簡單的顯示游標更好點