oracle 游标用法详解
1、什么是游标
游标是一种PL/SQL控制结构,可以对SQL语句进行显示控制,便于对表的数据逐条进行处理
2、游标分类
显示游标: Declared and named by the programmer
隐式游标: Declared for all DML and PL/SQL SELECT statements
3、游标的属性:
%FOUND:Evaluates to TRUE if the most recent SQL statement affects one or more rows
%NOTFOUND:和%FOUND相反
%ISOPEN:是一个布尔值,如果游标打开,则为TRUE, 如果游标关闭,则为FALSE.对于隐式游标而言SQL%ISOPEN总是FALSE,这是因为隐式游标在DML语句执行时打开,结束时就立即关闭。
%ROWCOUNT:Number of records affected by the most recent SQL statement
注意:dbms_output.put_line();这个是不能打印boolean型的,解决方法
if b then
dbms_output.put_line('b=true');
end if;
或者:
declare
b boolean;
begin
b := true;
dbms_output.put_line((case when b then 'true' else 'false' end));
end;
对于null,课先使用NVL()或者decode()处理
显示游标:需要手动open和close
例如:
DECLARE
CURSOR mycursor IS
SELECT * FROM dept;
myrecord dept%ROWTYPE;
BEGIN
OPEN mycursor;
FETCH mycursor INTO myrecord;
WHILE mycursor%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(myrecord.deptno||' '||myrecord.dname||' '||myrecord.loc);
FETCH mycursor INTO myrecord;
END LOOP;
CLOSE mycursor;
END;
注意:在进行while循环前,必须先有一个FETCH..INTO操作,否者%FOUND总是返 回false
带参数的游标:
DECLARE
CURSOR mycursor(num varchar2) IS
SELECT * FROM DEPT WHERE deptno=num;
myrecord dept%ROWTYPE;
BEGIN
OPEN mycursor(10);
LOOP
FETCH mycursor INTO myrecord;
EXIT WHEN mycursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('deptNum='||myrecord.deptno||' deptName='||myrecord.dname);
END LOOP;
CLOSE mycursor;
END;
FOR循环操作游标
使用FOR循环读取游标时,不需要显示申明变量用于接收结果,也不需要手动打开和关闭游标,例如:
DECLARE
CURSOR mycursor(num varchar2) IS
SELECT * FROM DEPT WHERE deptno=num;
BEGIN
FOR cur IN mycursor(10) LOOP
DBMS_OUTPUT.PUT_LINE('deptNum='||cur.deptno||' deptName='||cur.dname);
END LOOP;
END;
注意:PL/SQL中参数只需要给出类型,不需要给出长度或精度。
当直接将游标的值读取到变量时,变量的个数应与游标指向的结果集的列数相同。例如结果集中有两个列,那么使用FETCH....INTO 时对应的变量个数也应该有两个。
DECLARE
d_no number;
d_name varchar2(10);
CURSOR mycursor(num varchar2) IS
SELECT deptno,dname FROM DEPT WHERE deptno=num;
BEGIN
OPEN mycursor(10);
FETCH mycursor INTO d_no,d_name;
LOOP
DBMS_OUTPUT.PUT_LINE(d_no||' '||d_name);
FETCH mycursor INTO d_no,d_name;
EXIT WHEN mycursor%NOTFOUND;
END LOOP;
CLOSE mycursor;
END;
/
%ROWCOUNT初始值为null,每当使用FETCH...INTO从游标中取出一条数据后, ROWCOUNT的值加1,并不是标识结果集的行数。
例如:
DECLARE
d_name varchar2(10);
CURSOR mycursor IS
SELECT dname FROM DEPT;
BEGIN
OPEN mycursor;
LOOP
FETCH mycursor INTO d_name;
EXIT WHEN mycursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(mycursor%ROWCOUNT);
END LOOP;
CLOSE mycursor;
END;
结果集中有4行记录,输出结果为:1 2 3 4
可更新数据的游标
要想在使用游标的同时修改数据,需要在申明游标时加上FOR UPDATE关键字。
例如:
DECLARE
d_name VARCHAR2(20);
CURSOR mycursor IS
SELECT dname FROM dept FOR UPDATE;
BEGIN
OPEN mycursor;
LOOP
FETCH mycursor INTO d_name;
EXIT WHEN mycursor%NOTFOUND;
UPDATE dept SET dname=RTRIM(dname,'_t') WHERE CURRENT OF mycursor;
END LOOP;
CLOSE mycursor;
END;
CURRENT OF+游标名:获取游标当前所指向的行
RTRIM(dname,'_t'):LTRIM、RTRIM实现字符串过滤(不仅仅去除空格)
隐式游标:不使用DECLARE显示申明的游标。
例如:
BEGIN
FOR cur IN(SELECT dname FROM dept) LOOP
DBMS_OUTPUT.PUT_LINE(cur.dname);
END LOOP;
END;
1、含有参数的游标
declare
cursor cur_my (mv number) is * from Person where no
for tem in cur_my(4) loop
DBMS_OUTPUT.put_line('name:'||tem.name);
end loop;
end;
2、设置引用游标
declare
temp_row Person%rowtype;
type my_type is ref cursor;
cur_my my_type;
begin
open cur_my for 'select * from Person ';
loop
fetch cur_my into temp_row;
exit when cur_my%notfound;
DBMS_OUTPUT.put_line('name:'||temp_row.name);
end loop;
close cur_my;
end;
3、for loop循环游标
DECLARE
v_id Integer;
v_name varchar2(50);
v_age Integer;
cursor cur_mycursor is select id,name,age from Users;
BEGIN
for temp in cur_mycursor loop
v_id :=temp.id;
v_name :=temp.name;
v_age :=temp.age;
dbms_output.put_line('id:'||v_id||'name:'||v_name||'age:'||v_age);
end loop;
/**dbms_output.put_line('所有记录数:'||cur_mycursor%rowcount||'条!');*/
END;
4、标准化loop循环游标
DECLARE
v_id Integer;
v_name varchar2(50);
v_age Integer;
cursor cur_mycursors is select id,name,age from Users;
BEGIN
OPEN cur_mycursors;
dbms_output.put_line('所有记录数:'||cur_mycursors%rowcount||'条!');
LOOP
FETCH cur_mycursors INTO v_id,v_name,v_age;
dbms_output.put_line('id:'||v_id||'name:'||v_name||'age:'||v_age);
IF cur_mycursors%NOTFOUND THEN
EXIT;
END IF;
END LOOP;
dbms_output.put_line('所有记录数:'||cur_mycursors%rowcount||'条!');
CLOSE cur_mycursors;
END;

MySQLviewshavelimitations:1)Theydon'tsupportallSQLoperations,restrictingdatamanipulationthroughviewswithjoinsorsubqueries.2)Theycanimpactperformance,especiallywithcomplexqueriesorlargedatasets.3)Viewsdon'tstoredata,potentiallyleadingtooutdatedinforma

ProperusermanagementinMySQLiscrucialforenhancingsecurityandensuringefficientdatabaseoperation.1)UseCREATEUSERtoaddusers,specifyingconnectionsourcewith@'localhost'or@'%'.2)GrantspecificprivilegeswithGRANT,usingleastprivilegeprincipletominimizerisks.3)

MySQLdoesn'timposeahardlimitontriggers,butpracticalfactorsdeterminetheireffectiveuse:1)Serverconfigurationimpactstriggermanagement;2)Complextriggersincreasesystemload;3)Largertablesslowtriggerperformance;4)Highconcurrencycancausetriggercontention;5)M

Yes,it'ssafetostoreBLOBdatainMySQL,butconsiderthesefactors:1)StorageSpace:BLOBscanconsumesignificantspace,potentiallyincreasingcostsandslowingperformance.2)Performance:LargerrowsizesduetoBLOBsmayslowdownqueries.3)BackupandRecovery:Theseprocessescanbe

Adding MySQL users through the PHP web interface can use MySQLi extensions. The steps are as follows: 1. Connect to the MySQL database and use the MySQLi extension. 2. Create a user, use the CREATEUSER statement, and use the PASSWORD() function to encrypt the password. 3. Prevent SQL injection and use the mysqli_real_escape_string() function to process user input. 4. Assign permissions to new users and use the GRANT statement.

MySQL'sBLOBissuitableforstoringbinarydatawithinarelationaldatabase,whileNoSQLoptionslikeMongoDB,Redis,andCassandraofferflexible,scalablesolutionsforunstructureddata.BLOBissimplerbutcanslowdownperformancewithlargedata;NoSQLprovidesbetterscalabilityand

ToaddauserinMySQL,use:CREATEUSER'username'@'host'IDENTIFIEDBY'password';Here'showtodoitsecurely:1)Choosethehostcarefullytocontrolaccess.2)SetresourcelimitswithoptionslikeMAX_QUERIES_PER_HOUR.3)Usestrong,uniquepasswords.4)EnforceSSL/TLSconnectionswith

ToavoidcommonmistakeswithstringdatatypesinMySQL,understandstringtypenuances,choosetherighttype,andmanageencodingandcollationsettingseffectively.1)UseCHARforfixed-lengthstrings,VARCHARforvariable-length,andTEXT/BLOBforlargerdata.2)Setcorrectcharacters


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

Zend Studio 13.0.1
Powerful PHP integrated development environment

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),
