中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

怎么使用oracle游標 Oracle的游標

oracle中游標的作用有哪些?什么情況下使用?

存儲過程中查詢語句如何返回多行結(jié)果?我們知道,如果存儲過程中查詢語句有多行結(jié)果輸出,會報錯。若想讓存儲過程中的查詢語句返回多行結(jié)果不報錯,則需要使用游標來實現(xiàn)。本例主要也是用來熟悉存儲過程中游標的簡單使用方法:

專注于為中小企業(yè)提供成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)瑪沁免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

SET SERVEROUTPUT ON;

create or replace procedure proc_salary is

--定義變量

v_empno emp.empno%TYPE;

v_ename emp.ename%TYPE;

v_sal emp.sal%TYPE; ?

--定義游標

CURSOR emp_cursor IS ?SELECT empno, ename, sal from emp;

BEGIN--循環(huán)開始

LOOP

IF NOT emp_cursor%ISOPEN ?THEN

OPEN emp_cursor; ?END IF;

FETCH emp_cursor INTO ?v_empno, v_ename, v_sal;

--退出循環(huán)的條件

EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%NOTFOUND IS NULL;

dbms_output.put_line('員工編號為' || v_empno || '的' || v_ename || '薪水為:' || v_sal);

END LOOP;END;

/

游標是什么?ORACLE是怎樣使用游標的?舉例說明!

游標是什么

游標字面理解就是游動的光標。

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

游標的分類

顯式游標和隱式游標

顯式游標的使用需要4步:

1.

聲明游標

CURSOR

mycur(vartype

number)

is

select

emp_no,emp_zc

from

cus_emp_basic

where

com_no

=

vartype;

2.

打開游標

open

mycur(000627)

注:000627是參數(shù)

3.

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

fetch

mycur

into

varno,

varprice;

4.

關(guān)閉游標

close

mycur;

游標的屬性

oracle

游標有4個屬性:%ISOPEN,%FOUND,%NOTFOUND,%ROWCOUNT。

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

%FOUND

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

%ROWCOUNT返回當前位置為止游標讀取的記錄行數(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;

典型游標for

循環(huán)

游標for循環(huán)示顯示游標的一種快捷使用方式,它使用for循環(huán)依次讀取結(jié)果集中的行數(shù)據(jù),當form循環(huán)開始時,游標自動打開(不需要open),每循環(huán)一次系統(tǒng)自動讀取游標當前行的數(shù)據(jù)(不需要fetch),當退出for循環(huán)時,游標被自動關(guān)閉(不需要使用close)。使用游標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游標怎么使用?創(chuàng)建完了 怎么用?

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

cursor

cursor_name(parameter_name

datatype)

is

select_statement;

定義參數(shù)游標時,游標參數(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游標的使用

你嘗試一下, 使用 函數(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ù),是一個返回游標類型的函數(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ù),是 游標 + 返回值.

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游標 Oracle的游標
網(wǎng)站網(wǎng)址:http://m.rwnh.cn/article34/hiiise.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣App設(shè)計、網(wǎng)站建設(shè)做網(wǎng)站、品牌網(wǎng)站設(shè)計電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
肃南| 北票市| 阿合奇县| 阳新县| 阳西县| 金塔县| 科技| 闽清县| 焉耆| 临夏县| 东阿县| 同心县| 蒙自县| 京山县| 舒兰市| 平安县| 麟游县| 庆阳市| 渭南市| 济宁市| 元氏县| 平塘县| 鸡泽县| 拉孜县| 扎囊县| 芜湖市| 宁阳县| 泰兴市| 万山特区| 佳木斯市| 博客| 乌什县| 阳谷县| 宾川县| 耒阳市| 华池县| 离岛区| 油尖旺区| 抚远县| 南城县| 菏泽市|