當前位置:首頁 » 編程語言 » oraclesqlcursor用法
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

oraclesqlcursor用法

發布時間: 2022-07-24 01:49:02

A. Oracle中的游標和cursor是什麼,怎麼用的啊

1、plsql是面向過程的語言,這類語言還有c,cobol等,這類語言的共同點是一次只能處理一條數據,而資料庫sql返回的對象是一個集合,這樣直接用plsql程序操作就會出現問題。
2、在這種環境下就出現了游標,游標實際是一個內存地址,只想的是sql查詢出的結果集,當需要的時候再根據游標一條一條取數據【fetch】,直到全部數據取完。
---
以上,希望對你有所幫助。

B. ORACLE中用for in 使用cursor

CURSOR cur IS是定義一個游標,然後把游標里定義的查詢語句存儲到游標里
因為查詢語句查出來的數據往往是幾條記錄
但是你用的時候缺只能一條一條取出來用
這時游標的好處就體現出來了
游標存儲時 存的是幾條記錄
但是讀取時 他是一條記錄一條記錄讀取的
然後再使用FOR IN循環一下
就可以將你存儲在游標里的記錄一條一條的讀取出來 但是每次只讀取一條
以方便你的使用
這種情況如果不使用游標 往往會出現返回多行結果的錯誤

C. 游標是什麼ORACLE是怎樣使用游標的舉例說明!

一 游標是什麼

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

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

二 游標的分類

顯式游標和隱式游標

顯式游標的使用需要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是參數

3. 讀取數據

fetch mycur into varno, varprice;

4. 關閉游標

close mycur;

三 游標的屬性

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

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

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

%ROWCOUNT返回當前位置為止游標讀取的記錄行數。

四 示例

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記錄的結構和C語言中的結構體類似,是由一組數據項構成的邏輯單元。

PL/SQL記錄並不保存在資料庫中,它與變數一樣,保存在內存空間中,在使用記錄時候,要首先定義記錄結構,然後聲明記錄變數。可以把PL/SQL記錄看作是一個用戶自定義的數據類型。

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 循環

游標for循環示顯示游標的一種快捷使用方式,它使用for循環依次讀取結果集中的行數據,當form循環開始時,游標自動打開(不需要open),每循環一次系統自動讀取游標當前行的數據(不需要fetch),當退出for循環時,游標被自動關閉(不需要使用close)。使用游標for循環的時候不能使用open語句,fetch語句和close語句,否則會產生錯誤。

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;

D. Oracle中的游標和cursor是什麼,怎麼用的啊

cursor就是游標的意思
游標一般多用在存儲過程當中,用來查詢、修改或者刪除某些符合條件的數據
詳細參見pl/sql編程的游標使用

E. oracle觸發器select into和cursor用法的區別

樓主您好

cursor多用於定義遍歷一個結果集之前的查詢。
然後用fetch into或是for循環遍歷(loop)此游標
select into多用於查詢出單個值(不是絕對的 比如有bluk collect into)並給自己自定義的變數賦值。這倆其實沒太大關系,一般對比cursor和ref cursor,select into 和 :=賦值的區別

F. oracle plsql 練習 要用到游標

唉,又是大學生吧,自己不動腦筋.發個例子你看看.
declare
v_num number := &input;
v_last_num number := 0;
v_result varchar(2000) := '';
begin
loop
v_last_num := mod(v_num,10);
v_result := v_result || to_char(v_last_num);
v_num := v_num - v_last_num;
exit when v_num=0;
v_num := v_num / 10;
end loop;
dbms_output.put_line(v_result);
end;

第六章 游標(cursor)管理
create SYNONYM emp for scott.emp;
--作用:
declare
v_ename emp.ename%type;
begin
select ename into v_ename
from emp;

dbms_output.put_line(v_ename);
end;

--顯式游標的定義和遍歷
--通過無條件的循環來遍歷游標
declare
--1.定義游標
cursor c_emp_cursor
is select ename from emp;

v_ename emp.ename%type;
begin
--2.打開游標
open c_emp_cursor;

--3.遍歷游標
loop
fetch c_emp_cursor into v_ename; --rs.next();

exit when c_emp_cursor%NOTFOUND;

dbms_output.put_line(v_ename);
end loop;

--4.關閉游標
close c_emp_cursor;
end;

--用WHILE循環來遍歷游標
declare
cursor c_emp_cursor
is select * from emp;

v_row emp%rowtype;
begin
open c_emp_cursor;

fetch c_emp_cursor into v_row;

while c_emp_cursor%FOUND loop
dbms_output.put_line(v_row.ename || ' ' || v_row.empno);
fetch c_emp_cursor into v_row;
end loop;

close c_emp_cursor;
end;

--FOR循環遍歷游標的方式
declare
cursor c_emp_cursor
is select * from emp;
begin
for v_row IN c_emp_cursor loop
dbms_output.put_line(v_row.empno || ' ' || v_row.ename);
end loop;
end;

--定義參數類型的游標
declare
cursor c_emp_cursor(p_deptno emp.deptno%type)
is select ename from emp where deptno=p_deptno;

v_ename emp.ename%type;
begin
open c_emp_cursor(&input);

loop
fetch c_emp_cursor into v_ename;
exit when c_emp_cursor%NOTFOUND;
dbms_output.put_line(v_ename);
end loop;

close c_emp_cursor;
end;

--為游標指定返回類型1-rowtype
declare
cursor c_emp_cursor
return emp%rowtype --強制類型
is select * from emp;
begin
for v_row IN c_emp_cursor loop
dbms_output.put_line(v_row.empno);
end loop;
end;

--為游標指定返回類型2-記錄(Record)類型
declare
--定義一個記錄類型
type t_emp_record is record
(
empno emp.empno%type,
ename emp.ename%type
);

v_emp_record t_emp_record;

cursor c_emp_cursor
return v_emp_record --強制類型
is select empno,ename from emp;
begin
open c_emp_cursor;
loop
fetch c_emp_cursor into v_emp_record;
exit when c_emp_cursor%NOTFOUND;
dbms_output.put_line(v_emp_record.empno);
dbms_output.put_line(v_emp_record.ename);
end loop;
close c_emp_cursor;
end;

--如何通過游標來修改數據
declare
--通過游標修改數據要上行級鎖
cursor c_emp_cursor
is select * from emp where deptno=20 for update;
begin
for v_row In c_emp_cursor loop
delete from emp
where current of c_emp_cursor;
end loop;
commit;
end;
select * from emp;

--REF引用類型的游標描述
declare
type t_ref_cursor is ref cursor;

v_ref_cursor t_ref_cursor;
begin
open v_ref_cursor
for select * from emp;

close v_ref_cursor;

open v_ref_cursor
for select * from dept;

close v_ref_cursor;
end;

--1.隱式游標(SQL)的使用
--用途:因為資料庫系統在做insert,delete,update,select這些操作的時候
--都是通過游標去完成的,所以,在做操作之前我們的資料庫系統都會隱式
--的打開一個游標,在執行操作完畢之後隱式的關閉游標,那麼每次的操作的結果
--都會保存在一個叫做SQL的隱式游標中,我們可以通過操作這個隱式游標來獲取
--資料庫操作的信息

begin
delete from emp where deptno=10;

dbms_output.put_line(SQL%ROWCOUNT);
end;

第七章 存儲過程(Procere)和包(Package)

SQLServer - 存儲過程 (output參數 return)
Oracle -存儲過程(out參數) 函數(return)

--1.存儲過程
create or replace procere print(msg varchar2)
is
begin
dbms_output.put_line(msg);
end;

--1.1 調用存儲過程
execute print('helloworld');

--1.2
create or replace procere findEmp(p_empno emp.empno%type)
is
v_ename emp.ename%type;
begin
select ename into v_ename
from emp where empno=p_empno;

print(v_ename);
exception
when no_data_found then
print('未發現指定員工.');
end;

--1.3 傳遞參數
create or replace procere myabs(p_num1 IN number,p_num2 OUT number)
is
begin
if p_num1 >0 then
p_num2 := p_num1;
else
p_num2 := (0 - p_num1);
end if;
end;

--調用
declare
v_result number;
begin
myabs(-987,v_result);
print(v_result);
end;

create or replace procere change_num(p_num1 IN OUT number,p_num2 IN OUT number)
is
v_temp number;
begin
v_temp := p_num1;
p_num1 := p_num2;
p_num2 := v_temp;
end;

--調用
declare
v_num1 number :=111;
v_num2 number :=222;
begin
change_num(v_num1,v_num2);

print(v_num1);
print(v_num2);
end;

--2.函數(FUNCTION)
create or replace function myabs1(p_num1 number)
return number
is
begin
if p_num1 >= 0 then
return p_num1;
else
return (0 - p_num1);
end if;
end;

begin
print(myabs1(-999));
end;

create or replace function findEmp1(p_empno emp.empno%type)
return emp.ename%type
is
v_ename emp.ename%type;
begin
select ename into v_ename
from emp
where empno=p_empno;

return v_ename;
exception
when no_data_found then
print('未發現員工');
end;

begin
print(findEmp1(7499));
end;

--3.包(Package)-包(package-定義)和包體(package body-實現)
create or replace package mypkg
is
procere print(msg varchar2);

function findEmp(p_empno number)
return emp.ename%type;
end;

create or replace package body mypkg
is
procere print(msg varchar2)
is
begin
dbms_output.put_line(msg);
end;

function findEmp(p_empno number)
return emp.ename%type
is
v_ename emp.ename%type;
begin
select ename into v_ename
from emp
where empno=p_empno;

return v_ename;
exception
when no_data_found then
print('未發現員工');
end;
end;

--4.通過函數返回結果集
create or replace function findAllEmps
return SYS_REFCURSOR
is
v_ref_cursor SYS_REFCURSOR;
begin
open v_ref_cursor
for 'select * from emp';

return v_ref_cursor;
end;
我上學時候練慣用的

G. Oracle關於游標的使用,要求最後返回值是游標


create or replace package 名字 as type ReturnCursor is ref Cursor;
procere demo1(Return_Cursor out ReturnCursor);
end 名字;


create or replace package body 名字 as
procere demo1(Return_Cursor out ReturnCursor)
is
strsql varchar2(8000);
begin
strsql :='select a,b from table1';
open Return_Cursor for strsql;
end 名字;

H. oracle plsql cursor的疑問

for update是鎖定這些記錄,不讓其他人更新;不加for update,你在游標讀取的時間內別人有可能會更新數據導致不一致

沒有for delete和for insert