真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

oracle游標(biāo)怎么設(shè)置,oracle游標(biāo)詳解

游標(biāo)是什么?ORACLE是怎樣使用游標(biāo)的?舉例說明!

一 游標(biāo)是什么

目前成都創(chuàng)新互聯(lián)已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計、萬寧網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

游標(biāo)字面理解就是游動的光標(biāo)。

用數(shù)據(jù)庫語言來描述:游標(biāo)是映射在結(jié)果集中一行數(shù)據(jù)上的位置實體,有了游標(biāo),用戶就可以訪問結(jié)果集中的任意一行數(shù)據(jù)了,將游標(biāo)放置到某行后,即可對該行數(shù)據(jù)進(jìn)行操作,例如提取當(dāng)前行的數(shù)據(jù)等。

二 游標(biāo)的分類

顯式游標(biāo)和隱式游標(biāo)

顯式游標(biāo)的使用需要4步:

1. 聲明游標(biāo)

CURSOR mycur(vartype number) is

select emp_no,emp_zc from cus_emp_basic

where com_no = vartype;

2. 打開游標(biāo)

open mycur(000627)

注:000627是參數(shù)

3. 讀取數(shù)據(jù)

fetch mycur into varno, varprice;

4. 關(guān)閉游標(biāo)

close mycur;

三 游標(biāo)的屬性

oracle 游標(biāo)有4個屬性:%ISOPEN,%FOUND,%NOTFOUND,%ROWCOUNT。

%ISOPEN判斷游標(biāo)是否被打開,如果打開%ISOPEN等于true,否則等于false;

%FOUND %NOTFOUND判斷游標(biāo)所在的行是否有效,如果有效,則%FOUNDD等于true,否則等于false;

%ROWCOUNT返回當(dāng)前位置為止游標(biāo)讀取的記錄行數(shù)。

四 示例

set serveroutput on;

declare

varno varchar2(20);

varprice varchar2(20);

CURSOR mycur(vartype number) is

select emp_no,emp_zc from cus_emp_basic

where com_no = vartype;

begin

if mycur%isopen = false then

open mycur(000627);

end if;

fetch mycur into varno,varprice;

while mycur%found

loop

dbms_output.put_line(varno||','||varprice);

if mycur%rowcount=2 then

exit;

end if;

fetch mycur into varno,varprice;

end loop;

close mycur;

end;

PL/SQL記錄的結(jié)構(gòu)和C語言中的結(jié)構(gòu)體類似,是由一組數(shù)據(jù)項構(gòu)成的邏輯單元。

PL/SQL記錄并不保存在數(shù)據(jù)庫中,它與變量一樣,保存在內(nèi)存空間中,在使用記錄時候,要首先定義記錄結(jié)構(gòu),然后聲明記錄變量??梢园裀L/SQL記錄看作是一個用戶自定義的數(shù)據(jù)類型。

set serveroutput on;

declare

type person is record

(

empno cus_emp_basic.emp_no%type,

empzc cus_emp_basic.emp_zc%type);

person1 person;

cursor mycur(vartype number)is

select emp_no,emp_zc from cus_emp_basic

where com_no=vartype;

begin

if mycur%isopen = false then

open mycur(000627);

end if;

loop

fetch mycur into person1;

exit when mycur%notfound;

dbms_output.put_line('雇員編號:'||person1.empno||',地址:'||person1.empzc);

end loop;

close mycur;

end;

典型游標(biāo)for 循環(huán)

游標(biāo)for循環(huán)示顯示游標(biāo)的一種快捷使用方式,它使用for循環(huán)依次讀取結(jié)果集中的行數(shù)據(jù),當(dāng)form循環(huán)開始時,游標(biāo)自動打開(不需要open),每循環(huán)一次系統(tǒng)自動讀取游標(biāo)當(dāng)前行的數(shù)據(jù)(不需要fetch),當(dāng)退出for循環(huán)時,游標(biāo)被自動關(guān)閉(不需要使用close)。使用游標(biāo)for循環(huán)的時候不能使用open語句,fetch語句和close語句,否則會產(chǎn)生錯誤。

set serveroutput on;

declare

cursor mycur(vartype number)is

select emp_no,emp_zc from cus_emp_basic

where com_no=vartype;

begin

for person in mycur(000627) loop

dbms_output.put_line('雇員編號:'||person.emp_no||',地址:'||person.emp_zc);

end loop;

end;

oracle游標(biāo)的使用

你嘗試一下, 使用 函數(shù) 來處理, 應(yīng)該就可以避免掉 存儲過程參數(shù)沒法寫的問題。

創(chuàng)建返回結(jié)果集的函數(shù)

SQL create or replace package pkg_HelloWorld as

2 -- 定義ref cursor類型

3 type myrctype is ref cursor;

4 --函數(shù)申明

5 function getHelloWorld return myrctype;

6 end pkg_HelloWorld;

7 /

程序包已創(chuàng)建。

SQL CREATE OR REPLACE package body pkg_HelloWorld as

2 function getHelloWorld return myrctype

3 IS

4 return_cursor myrctype;

5 BEGIN

6 OPEN return_cursor FOR

7 SELECT 'Hello 1' AS a, 'World 1' AS B FROM dual

8 UNION ALL

9 SELECT 'Hello 2' AS a, 'World 2' AS B FROM dual;

10 return return_cursor;

11 END getHelloWorld;

12 end pkg_HelloWorld;

13 /

程序包體已創(chuàng)建。

注:Oracle 這里的函數(shù),是一個返回游標(biāo)類型的函數(shù), 不是像 SQL Server 的那種叫 “表值函數(shù)” 的東西。

因此下面的寫法會報錯。

SQL SELECT * FROM pkg_HelloWorld.getHelloWorld();

SELECT * FROM pkg_HelloWorld.getHelloWorld()

*

第 1 行出現(xiàn)錯誤:

ORA-00933: SQL 命令未正確結(jié)束

SQL SELECT pkg_HelloWorld.getHelloWorld() FROM dual;

PKG_HELLOWORLD.GETHE

--------------------

CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

A B

------- -------

Hello 1 World 1

Hello 2 World 2

C# 如何調(diào)用上面的 返回結(jié)果集的例子:

/// summary

/// 測試 調(diào)用 Oracle 返回結(jié)果集的函數(shù).

/// /summary

private void CallFuncWithTable(OracleConnection conn)

{

// 創(chuàng)建一個 Command.

OracleCommand testCommand = conn.CreateCommand();

// 定義需要執(zhí)行的SQL語句. testCommand.CommandText = "pkg_HelloWorld.getHelloWorld";

// 定義好,本次執(zhí)行的類型,是存儲過程. testCommand.CommandType = CommandType.StoredProcedure;

// 定義好,我這個參數(shù),是 游標(biāo) + 返回值.

OracleParameter para = new OracleParameter("c", OracleType.Cursor);

para.Direction = ParameterDirection.ReturnValue;

testCommand.Parameters.Add(para);

// 執(zhí)行SQL命令,結(jié)果存儲到Reader中.

OracleDataReader testReader = testCommand.ExecuteReader();

// 處理檢索出來的每一條數(shù)據(jù).

while (testReader.Read())

{

// 將檢索出來的數(shù)據(jù),輸出到屏幕上.

Console.WriteLine("調(diào)用函數(shù):{0}; 返回:{1} - {2}",

testCommand.CommandText, testReader[0], testReader[1]

);

}

// 關(guān)閉Reader.

testReader.Close();

}

Oracle 游標(biāo)

游標(biāo)能夠根據(jù)查詢條件從數(shù)據(jù)表中提取一組記錄,將其作為一個臨時表置于數(shù)據(jù)緩沖區(qū)中,利用指針逐行對記錄數(shù)據(jù)進(jìn)行操作。

Oracle中的游標(biāo)分為顯示游標(biāo)和隱式游標(biāo) 。

在執(zhí)行SQL語句時,Oracle會自動創(chuàng)建隱式游標(biāo),該游標(biāo)是內(nèi)存中處理該語句的數(shù)據(jù)緩沖區(qū),存儲了執(zhí)行SQL語句的結(jié)果。通過隱式游標(biāo)屬性可獲知SQL語句的執(zhí)行狀態(tài)信息。

%found:布爾型屬性,如果sql語句至少影響到一行數(shù)據(jù),值為true,否則為false。

%notfound:布爾型屬性,與%found相反。

%rowcount:數(shù)字型屬性,返回受sql影響的行數(shù)。

%isopen:布爾型屬性,當(dāng)游標(biāo)已經(jīng)打開時返回true,游標(biāo)關(guān)閉時則為false。

用戶可以顯式定義游標(biāo)。使用顯式游標(biāo)處理數(shù)據(jù)要4個步驟:定義游標(biāo)、打開游標(biāo)、提取游標(biāo)數(shù)據(jù)和關(guān)閉游標(biāo)。

游標(biāo)由游標(biāo)名稱和游標(biāo)對應(yīng)的select結(jié)果集組成。定義游標(biāo)應(yīng)該放在pl/sql程序塊的聲明部分。

語法格式:cursor 游標(biāo)名稱(參數(shù)) is 查詢語句

打開游標(biāo)時,游標(biāo)會將符合條件的記錄送入數(shù)據(jù)緩沖區(qū),并將指針指向第一條記錄。

語法格式:open 游標(biāo)名稱(參數(shù));

將游標(biāo)中的當(dāng)前行數(shù)據(jù)賦給指定的變量或記錄變量。

語法格式:fetch 游標(biāo)名稱 into 變量名;

游標(biāo)一旦使用完畢,就應(yīng)將其關(guān)閉,釋放與游標(biāo)相關(guān)聯(lián)的資源。

語法格式:close 游標(biāo)名稱;

declare

cursor c1 is? select sno,cno,grade from sc;

v_sno sc.sno%type;

v_cno sc.cno%type;

v_grade sc.grade%type;

begin

open c1;

loop

? fetch c1 into v_sno,v_cno,v_grade;

? exit when c1%notfound;--緊跟fetch之后

if c1%found then

dbms_output.put_line(to_char(c1%rowcount)||v_cno);

end if;

end loop;

close c1;?

end;

declare

cursor c1 is select sno,cno,grade from sc;

v_sno sc.sno%type;

v_cno sc.cno%type;

v_grade sc.grade%type;

begin

open c1;

fetch c1 into v_sno,v_cno,v_grade;

while c1%found loop

? dbms_output.put_line(v_sno||v_cno||v_grade);

?fetch c1 into v_sno,v_cno,v_grade;

end loop;

close c1;?

end;

第三種:for

declare

cursor c1 is select sno,cno,grade from sc;

begin

for item in c1 loop

dbms_output.put_line(rpad(item.sno,'10',' ')||rpad(item.cno,'10',' ')||rpad(item.grade,'10',' '));

end loop;

end;

oracle游標(biāo)怎么使用?創(chuàng)建完了 怎么用?

在定義參數(shù)游標(biāo)之后,當(dāng)使用不同參數(shù)值多次打開游標(biāo)時,可以產(chǎn)生不同的結(jié)果集,語法如下:

cursor

cursor_name(parameter_name

datatype)

is

select_statement;

定義參數(shù)游標(biāo)時,游標(biāo)參數(shù)只能指定數(shù)據(jù)類型,而不能指定長度。

示例如下:

declare

cursor

temp_cursor(no

number)

is

select

name

from

cip_temps

where

id=no;

v_name

cip_temps.name%type;

begin

open

temp_cursor(1);

loop

oracle中如何定義一個游標(biāo)?

1.游標(biāo)定義:

cursor XXXA is

SELECT 語句;

XXXB cursorName%rowtype;

XXXA: 游標(biāo)名

XXXB: 游標(biāo)行數(shù)據(jù)定義

2. 打開游標(biāo):

-- 打開之前最好先關(guān)一下,防止上次發(fā)生異常沒有關(guān)掉而引發(fā)不必要的異常

IF XXXA%ISOPEN THEN

CLOSE XXXA;

END IF;

Open XXXA ;

Loop

Fetch XXXA into XXXB;

exit when XXXA%NOTFOUND;

... ... 處理邏輯

end loop;

close XXXA;

oracle存儲過程中打開游標(biāo)有幾種方法?用open直接打開?

兩種方法\x0d\x0a1.聲明游標(biāo)時寫好SELECT語句,如\x0d\x0aCURSOR r_cur1 IS select *** from tableName where 條件;\x0d\x0a使用時\x0d\x0a OPEN r_cur1;\x0d\x0a LOOP\x0d\x0a FETCH *** INTO variable;\x0d\x0a EXIT WHEN r_cur1%NOTFOUND OR r_cur1%NOTFOUND IS NULL;\x0d\x0a。。。\x0d\x0a2.聲明游標(biāo)\x0d\x0accc sys_refcursor;\x0d\x0a使用時\x0d\x0a open ccc for select dept_code,dept_name from comm.dept_dict; \x0d\x0a loop\x0d\x0a fetch ccc into aa,bb;\x0d\x0a exit when ccc%notfound;\x0d\x0a 。。。\x0d\x0a end loop;\x0d\x0a close ccc;


當(dāng)前標(biāo)題:oracle游標(biāo)怎么設(shè)置,oracle游標(biāo)詳解
鏈接地址:http://weahome.cn/article/phpdji.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部