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

存儲過程游標

發布時間: 2022-01-31 19:46:33

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

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是浪費 沒必要用 用簡單的顯示游標更好點