Oracle 游标使用全解

合集下载

oracle中游标的用法

oracle中游标的用法

oracle中游标的用法游标是Oracle数据库中一种重要的数据类型,用于处理查询结果集中的数据。

使用游标可以方便地遍历查询结果,进行数据处理和操作。

下面是关于Oracle中游标的用法的参考内容。

一、游标的定义与声明在Oracle数据库中,游标可以在PL/SQL块中使用,用于与查询结果进行交互。

游标的使用分为显示游标和隐式游标两种方式:1. 显示游标:显示游标需要先定义游标类型,然后声明游标变量,并使用OPEN、FETCH和CLOSE等操作进行操作。

示例代码如下:```sql-- 定义游标类型TYPE cursor_type IS REF CURSOR;-- 声明游标变量cursor_var cursor_type;-- 打开游标OPEN cursor_var FOR SELECT * FROM table_name;-- 循环获取游标数据LOOPFETCH cursor_var INTO variable1, variable2...;EXIT WHEN cursor_var%NOTFOUND;-- 对游标数据进行处理END LOOP;-- 关闭游标CLOSE cursor_var;```2. 隐式游标:隐式游标由Oracle自动管理,不需要程序员定义和声明,系统会自动为每一个SELECT语句分配一个隐式游标。

隐式游标无法手动控制游标操作,只能通过向结果集添加条件来限制查询结果。

示例代码如下:```sql-- 查询结果会被自动赋值给隐式游标SELECT * FROM table_name;-- 循环处理查询结果LOOP-- 对查询结果进行处理-- 退出循环条件END LOOP;```二、游标的属性和操作1. 游标属性:(1) %FOUND:如果游标指向的结果集中有数据,则返回真;否则返回假。

(2) %NOTFOUND:如果游标指向的结果集中没有数据,则返回真;否则返回假。

(3) %ROWCOUNT:返回游标当前处理的行数。

oracle 游标循环用法

oracle 游标循环用法

oracle 游标循环用法游标循环是在Oracle数据库中常用的一种技术,它允许我们按行循环访问查询结果集,并对每一行的数据进行操作。

在本文中,我将逐步解释Oracle游标循环的用法,并提供一些示例来帮助读者更好地理解。

第一步:游标的定义在使用游标之前,我们需要先定义一个游标。

游标是一个指向结果集的指针,用于从结果集中逐行获取数据。

在Oracle中,我们可以使用DECLARE 语句定义游标。

例如:DECLARECURSOR cursor_name ISSELECT column1, column2, ...FROM table_nameWHERE condition;在上面的示例中,我们定义了一个名为cursor_name的游标,它选择具有满足条件的结果集。

游标名可以根据需要进行自定义。

第二步:游标的打开和关闭在使用游标之前,我们需要先打开它,以便开始遍历结果集。

这可以通过使用OPEN语句来实现。

例如:OPEN cursor_name;在执行OPEN语句之后,游标将指向结果集的第一行。

在完成游标的使用后,我们应该关闭它。

这可以通过使用CLOSE语句来实现。

例如:CLOSE cursor_name;关闭游标后,游标将不再指向结果集的任何行。

第三步:游标的循环遍历一旦游标打开,我们可以使用游标的名称在循环中获取结果集的每一行。

在Oracle中,我们有两种循环方法可以使用游标:FOR循环和WHILE 循环。

1. FOR循环:FOR循环是使用游标的一种常用方法。

它允许我们在循环中自动遍历游标的所有行。

以下是FOR循环的语法:FOR record_name IN cursor_nameLOOP在这里可以对每一行的数据进行操作END LOOP;在上面的示例代码中,record_name是一个记录变量,表示结果集的一行数据。

在循环中,我们可以使用record_name来访问每一行的列值,并进行相应的操作。

2. WHILE循环:WHILE循环是另一种使用游标的循环方法。

Oracle游标详解

Oracle游标详解

Oracle游标详解1、游标的概念游标(CURSOR):游标是把从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有⼀个数据指针,在初始状态下指向的是⾸记录,利⽤fetch语句可以移动该指针,从⽽对游标中的数据进⾏各种操作。

2、游标的作⽤游标是⽤来处理使⽤SELECT语句从数据库中检索到的多⾏记录的⼯具。

借助于游标的功能,数据库应⽤程序可以对⼀组记录逐条进⾏处理,每次处理⼀⾏。

3、游标的类型显式游标(Explicit Cursor):显式游标需要定义声明,在使⽤前要打开和获取,使⽤完毕后要关闭。

多⽤于返回多⾏的SELECT语句隐式游标(Implicit Cursor):在执⾏⼀个SQL语句时,服务器将⾃动创建⼀个隐式游标,该游标是内存中的⼯作区,存储了执⾏SQL 语句的结果,可通过游标的属性获得SQL的执⾏结果及状态信息。

多⽤于只返回⼀⾏的SQL语句4、隐式游标(ORACLE在创建隐式游标时,默认的游标名为SQL)1)游标的主要属性(显⽰游标、隐式游标)%FOUND 布尔型属性,当SQL语句⾄少影响⼀⾏时为TRUE,否则为FALSE%NOTFOUND 布尔型属性,当SQL语句没有影响的⾏时为TRUE,否则为FALSE%ISOPEN 布尔型属性,当游标已打开时返回TRUE,否则为FALSE(对⽤户⽽⾔,隐式游标永远是false)%ROWCOUNT 数字型属性,返回受到SQL影响的⾏数注意:属性名与游标名之间没有空格。

游标的属性只能在PL/SQL块中使⽤,⽽不能在SQL语句中使⽤例1 将PRODUCTS表中类型为1的所有产品的单价打9折,并显⽰该更新所影响的⾏数.BEGINUPDATE productsSET unitprice=unitprice*0.9WHERE categoryid=1;IF SQL%FOUND THENdbms_output.put_line(‘更新了’||SQL%ROWCOUNT||’条记录’);ELSEdbms_output.put_line(‘没有更新记录’);END IF;END;5、显式游标1)定义游标在使⽤显⽰游标之前,必须先在声明部分定义游标,其定义语法如下:CURSOR cursor_name[(parameter,…)]IS select_statement;说明:参数parameter形式如下:para_name [IN] data_type [:=|DEFAULT value](2)打开游标当打开游标时,ORACLE会执⾏游标所对应的SELECT语句,并将结果存放到结果集,其定义语法如下:OPEN cursor_name[(parameter,…)];(3)提取数据语法如下:FETCH cursor_name INTO variable[,…];说明:对游标第⼀次执⾏FETCH语句时,它将⼯作区中的第⼀条记录赋给赋给变量,并使⼯作区内的指针指向下⼀条记录。

Oracle函数返回游标的方法及应用

Oracle函数返回游标的方法及应用

Oracle函数返回游标的方法及应用在Oracle中,游标是一种使用SELECT语句检索数据的数据库对象。

Oracle提供了一些内置函数来返回游标,这些函数可以用于各种应用和场景。

下面将介绍几个常用的Oracle函数返回游标的方法及其应用。

1.SYS_REFCURSORSYS_REFCURSOR是Oracle提供的一种特殊类型,可以用于返回游标。

它允许在PL/SQL程序中打开和操作游标,然后将其作为参数传递给其他过程或函数。

SYS_REFCURSOR的使用如下:```CREATE OR REPLACE FUNCTION get_employee_cursorRETURNSYS_REFCURSORISemp_cursor SYS_REFCURSOR;BEGINOPEN emp_cursor FOR SELECT * FROM employees;RETURN emp_cursor;END;```在上述例子中,`get_employee_cursor`函数返回一个SYS_REFCURSOR类型的游标,该游标打开并检索了employees表中的所有数据。

其他过程或函数可以调用这个函数来获取该游标,并使用FETCH语句获取数据。

2.CURSOR返回值在PL/SQL中,可以使用`CURSOR`来定义一个游标类型的变量,并将其作为函数的返回值。

这种方式主要用于在PL/SQL代码中处理游标。

下面是一个示例:```CREATE OR REPLACE FUNCTION get_employee_cursorRETURN employees%ROWTYPEISemp_cursor employees%ROWTYPE;BEGINSELECT * INTO emp_cursor FROM employees;RETURN emp_cursor;END;```在这个例子中,`get_employee_cursor`函数返回一个employees表中的行数据,使用`%ROWTYPE`声明了一个与employees表结构相匹配的记录类型变量emp_cursor。

oracle cursor用法

oracle cursor用法

oracle cursor用法
oracle cursor是oracle的动态游标,它是书写sql语句的一种重要手段,常常用在oracle的查询中。

oracle中定义游标的语法如下:cursor c_name 。

is 。

select * from table_name; 。

begin 。

open c_name; 。

fetch c_name into x,y; 。

while c_name%found then 。

--进行逻辑运算。

fetch c_name into x, y; 。

end loop; 。

close c_name; 。

end; 。

上面的语法介绍了oracle怎样定义一个游标。

我们可以根据上述语法可以看出,在使用oracle游标时,我们需要先定义一个cursor,然后在使用fetch语句从cursor里提取数据,while循环判断语句可以判断是否存在更多的数据,如果存在的话,就继续取数据,如果不存在的话,就关闭游标。

oracle游标的应用非常广泛,它可以执行聚合函数,求最大值等结果,也可以进行多重条件判断等操作,极大地提高了oracle的查询效率。

此外,oracle游标还可以用来做循环操作,比如对表中的每一行数据执
行某种操作等。

所以,oracle游标在oracle数据库中发挥着重要的作用,是oracle程序中使用的重要工具。

Oracle数据库的游标和for循环使用

Oracle数据库的游标和for循环使用

Oracle数据库的游标和for循环使⽤1. 游标的概念和作⽤游标是 sql 的⼀个内存⼯作区,由系统或⽤户以变量的形式定义游标的作⽤就是⽤于临时存储从数据库中提取的数据块(结果集)。

它有⼀个指针,从上往下移动(fetch),从⽽能够遍历每条记录。

⽤牺牲内存来提升 SQL 执⾏效率,适⽤于⼤数据处理。

(摘抄⾃https:///qq_34745941/java/article/details/81294166)。

2.游标结构图3.具体⽤法 游标有四⼤属性,分别是1. “SQL%ISOPEN” :布尔类型。

判断游标是否打开 2.“SQL%FOUND”:布尔类型。

判断上⼀条fetch语句是否有值,有则为true,否则为false; 3.“SQL%NOTFOUND”:布尔类型。

与2相反,常⽤作退出循环的条件。

4.“SQL%ROWCOUNT”:整型。

当前成功执⾏更改的数据⾏数。

3.1 静态游标 3.1.1 隐式游标 使⽤DML操作(增删改)或select……into……会⾃动创建隐式游标,名称是“sql”,该游标会⾃动声明,打开和关闭。

⽆需⼈为开启或关闭。

create or replace procedure ATest(O_Result Out VarChar2)isv_id staff.id%type;begininsert into staff(id,name) values(1,'张三');if sql%found thenO_Result:='添加成功';end if;update staff set name ='李四'where id =1;if sql%found thenO_Result:='更新成功';end if;delete from staff where id =1;if sql%found thenO_Result:='删除成功';end if;select id into v_id from staff;if sql%found thenO_Result:='查询成功';end if;if sql%isopen thenO_Result:='游标为开启状态,但不可能⾛到这⼀步'; --游标只有在执⾏上述增删改操作才会开启并⾃动关闭elseO_Result:='游标为关闭状态';end if;exceptionwhen Others thenbeginO_Result:='N_SQLCODE is '||SQLCODE||' and SQLERRM is '||SQLERRM;rollback;end;end; 3.1.2 显式游标 显⽰游标⼜分为不带参数和带参数两种 ⽆参:create or replace procedure ATest(O_Result Out VarChar2)isv_cur_info staff%rowtype;cursor v_cur is--声明游标为staff表的数据集select*from staff;beginopen v_cur; --打开游标fetch v_cur into v_cur_info; --赋值给游标O_Result:='ID:'||v_cur_info.id||',Name:'||v_cur_;--输出值close v_cur; --关闭游标exceptionwhen Others thenbeginO_Result:='N_SQLCODE is '||SQLCODE||' and SQLERRM is '||SQLERRM;rollback;end;end;输出结果: ID:1,Name:张三带参:create or replace procedure ATest(O_Result Out VarChar2)isv_cur_info staff%rowtype;cursor v_cur(v_id staff.id%type) is--声明游标为staff表的数据集select*from staff where id =v_id; --参数:v_idbeginopen v_cur(1); --打开游标fetch v_cur into v_cur_info; --赋值给游标O_Result:='ID:'||v_cur_info.id||',Name:'||v_cur_;close v_cur; --关闭游标exceptionwhen Others thenbeginO_Result:='N_SQLCODE is '||SQLCODE||' and SQLERRM is '||SQLERRM;rollback;end;end;输出结果: ID:1,Name:张三 3.2 动态游标 3.2.1 ⾃定义类型游标 ⾃定义游标类型声明写法:TYPE ref_type_name IS REF CURSOR[RETURN return_type];ref_type_name代表我们⾃定义类型的名称,cursor是系统默认的return_type代表数据库表中的⼀⾏,或⼀个记录类型,是⼀个返回类型;返回值不是必要的,⽆返回值则称为弱类型,更加灵活;有返回值称为强类型,减少错误;弱类型写法:create or replace procedure ATest(O_Result Out VarChar2)isv_cur_info staff%rowtype;type v_cur_type is ref cursor; --⾃定义游标类型v_cur v_cur_type;beginopen v_cur for--打开游标并声明select*from staff where id<5;loop --开始循环fetch v_cur into v_cur_info; -- 赋值exit when v_cur%notfound; --判断没有值就退出循环O_Result:= O_Result||chr(10)||'ID:'||v_cur_info.id||',Name:'||v_cur_;end loop;close v_cur;exceptionwhen Others thenbeginO_Result:='N_SQLCODE is '||SQLCODE||' and SQLERRM is '||SQLERRM;rollback;end;end;另⼀种写法:create or replace procedure ATest(O_Result Out VarChar2)isv_sql varchar(1000);v_param staff.id%type:=5;v_cur_info staff%rowtype;type v_cur_type is ref cursor; --⾃定义游标类型v_cur v_cur_type;beginv_sql:='select * from staff where id <:id';open v_cur for v_sql --打开游标并声明using v_param; --绑定参数⽅法loop --开始循环fetch v_cur into v_cur_info; -- 赋值exit when v_cur%notfound; --判断没有值就退出循环O_Result:= O_Result||chr(10)||'ID:'||v_cur_info.id||',Name:'||v_cur_;end loop;close v_cur;exceptionwhen Others thenbeginO_Result:='N_SQLCODE is '||SQLCODE||' and SQLERRM is '||SQLERRM;rollback;end;end;强类型写法:三个注意事项:1.强类型⽆法使⽤绑定参数⽅法 2.for后⾯必须是sql,不能是字符串,如上⾯的v_sql; 3.参数必须对应;create or replace procedure ATest(O_Result Out VarChar2)isv_cur_info staff%rowtype;type v_cur_type is ref cursor return staff%rowtype ; --⾃定义游标类型v_cur v_cur_type;beginopen v_cur for--打开游标并声明select*from staff where id <5;loop --开始循环fetch v_cur into v_cur_info; -- 赋值exit when v_cur%notfound; --判断没有值就退出循环O_Result:= O_Result||chr(10)||'ID:'||v_cur_info.id||',Name:'||v_cur_;end loop;close v_cur;exceptionwhen Others thenbeginO_Result:='N_SQLCODE is '||SQLCODE||' and SQLERRM is '||SQLERRM;rollback;end;end; 3.2.2 系统类型游标 简写⼿动声明⾃定义游标的过程type v_cur_type is ref cursor return staff%rowtype ; --⾃定义游标类型v_cur v_cur_type;等同于 v_cur sys_refcursor;4.效率问题没有实际测试过,根据其他博客总结是这样:⼀般来说批量处理的速度要最好,隐式游标的次之,单条处理的最差以下是⽰例:1、批量处理open游标;loopfetch游标bulk collect into集合变量(也就是table类型哦) limit 数值; -- ⼀般 500 左右exit when条件--(变量.count = 0,如果⽤ sql%notfound 不⾜ limit 的记录就不会被执⾏哦)close游标;2、隐式游标for x in (sql 语句) loop... 逻辑处理end loop;3、单条处理open游标;loopfetch游标into变量;exit when条件end loop;close游标;————————————————原⽂链接:https:///qq_34745941/java/article/details/81294166批量处理的关键字不是很了解,下次学习下在记录起来;隐式游标写法最简洁明了,类似于程序中的for循环写法;单条处理⼤概就是上⾯那些范例的写法。

python oracledb cursor用法

python oracledb cursor用法

python oracledb cursor用法Python在与Oracle数据库交互时,使用oracledb模块是一种高效的方式。

oracledb是一个Python库,它允许Python程序与Oracle数据库进行连接和交互。

本文旨在详细介绍oracledb中cursor(游标)的用法,为开发者提供一个清晰的指南。

游标的基本概念在数据库操作中,游标是一个非常重要的概念。

它是一个数据库查询的结果集,允许程序逐行访问查询的结果。

在使用oracledb与Oracle数据库进行交互时,游标用于执行SQL语句,并且通过游标来处理SQL语句的结果。

连接数据库在介绍游标的使用之前,首先需要建立与Oracle数据库的连接。

这一步骤是通过oracledb模块的connect方法完成的。

以下是一个简单的连接示例:```pythonimport oracledb数据库连接字符串,格式:用户名/密码@数据库地址:端口/服务名dsn = "user/password@localhost:1521/orcl"connection = oracledb.connect(dsn)```成功连接数据库后,就可以创建游标并使用它来执行SQL语句了。

创建和使用游标游标的创建是通过连接对象的cursor()方法完成的。

创建游标后,可以使用它来执行SQL语句,并遍历结果集。

以下是创建游标并执行一个简单查询的示例:```python创建游标cursor = connection.cursor()使用游标执行SQL查询cursor.execute("SELECT * FROM employees WHEREdepartment_id = :id", [10])遍历查询结果for row in cursor:print(row)```在这个示例中,`:id`是一个参数化查询的一部分,这意味着其值在执行时被提供,这有助于防止SQL注入攻击。

Oracle游标的使用方法

Oracle游标的使用方法

( e at n f no mais f nigGe ea s ia o nigM i tr o D p rme t fr tc jn n rl oI o Na Ho ptl f Na j l a yC mma d n i n ,Na j gJa g u2 0 0 , ia n i in s 10 2 Chn ) n
Ab t a t s r c :A n i r d c i n i i e o t e u e o h u s r i a l n n e m p e d mo s r tn he e l i n h nt o u to s g v n t h s f t e c r o n Or c e a d a xa l e n t a i g t xp i t a d t e c i p i i c r o s i lo p o i e m l t u s r s a s r v d d. c Ke r s: a l y wo d Or c e;e l i u s r m p i i c r o xp i t c r o ;i l t u s r c c
必需的信 息 , 其中包括语句 要处理的行的数 目、 一个指 向语句
被分析以后产生 的表示形式的指针 , 以及查询的活动集 (cie atv st这是查询返回的行 的集合 ) e, 。 游标 ( u sr 是一个指 向上下 文区的句柄 ( a de 或指 c ro ) h n l) 针。通过游标 , L S P / QL程序可 以控制上下文区和在处理语句 时上下文区会发生一些事情。 游标包括显式游标和隐式 游标 。
① 用 “ OUND” “ %F 和 %NOTF OUND” 检验 游 标 成 功 是
这 里 c ro — a us r n me是 游 标 的 名 字 ,而 S E EL CT —tt— sae me t 将 要 处 理 的 查 询 。 n是
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

-- 声明游标;CURSOR cursor_name IS select_statement--For 循环游标--(1)定义游标--(2)定义游标变量--(3)使用for循环来使用这个游标declare--类型定义cursor c_jobisselect empno,ename,job,salfrom empwhere job='MANAGER';--定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型c_row c_job%rowtype;beginfor c_row in c_job loopdbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);end loop;end;--Fetch游标--使用的时候必须要明确的打开和关闭declare--类型定义cursor c_jobisselect empno,ename,job,salfrom empwhere job='MANAGER';--定义一个游标变量c_row c_job%rowtype;beginopen c_job;loop--提取一行数据到c_rowfetch c_job into c_row;--判读是否提取到值,没取到值就退出--取到值c_job%notfound 是false--取不到值c_job%notfound 是trueexit when c_job%notfound;dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);end loop;--关闭游标close c_job;end;--1:任意执行一个update操作,用隐式游标sql的属性%found,%notfound,%rowcount,%isopen观察update语句的执行情况。

beginupdate emp set ENAME='ALEARK'WHERE EMPNO=7469;if sql%isopen thendbms_output.put_line('Openging');elsedbms_output.put_line('closing');end if;if sql%found thendbms_output.put_line('游标指向了有效行');--判断游标是否指向有效行elsedbms_output.put_line('Sorry');end if;if sql%notfound thendbms_output.put_line('Also Sorry');elsedbms_output.put_line('Haha');end if;dbms_output.put_line(sql%rowcount);exceptionwhen no_data_found thendbms_output.put_line('Sorry No data');when too_many_rows thendbms_output.put_line('Too Many rows');end;declareempNumber emp.EMPNO%TYPE;empName emp.ENAME%TYPE;beginif sql%isopen thendbms_output.put_line('Cursor is opinging');elsedbms_output.put_line('Cursor is Close');end if;if sql%notfound thendbms_output.put_line('No Value');elsedbms_output.put_line(empNumber);end if;dbms_output.put_line(sql%rowcount);dbms_output.put_line('-------------');select EMPNO,ENAME into empNumber,empName from emp where EMPNO=7499; dbms_output.put_line(sql%rowcount);if sql%isopen thendbms_output.put_line('Cursor is opinging');elsedbms_output.put_line('Cursor is Closing');end if;if sql%notfound thendbms_output.put_line('No Value');elsedbms_output.put_line(empNumber);end if;exceptionwhen no_data_found thendbms_output.put_line('No Value');when too_many_rows thendbms_output.put_line('too many rows');end;--2,使用游标和loop循环来显示所有部门的名称--游标声明declarecursor csr_deptis--select语句select DNAMEfrom Depth;--指定行指针,这句话应该是指定和csr_dept行类型相同的变量row_dept csr_dept%rowtype;begin--for循环for row_dept in csr_dept loopdbms_output.put_line('部门名称:'||row_dept.DNAME);end loop;end;--3,使用游标和while循环来显示所有部门的的地理位置(用%found属性)declare--游标声明cursor csr_TestWhileis--select语句select LOCfrom Depth;--指定行指针row_loc csr_TestWhile%rowtype;begin--打开游标open csr_TestWhile;--给第一行喂数据fetch csr_TestWhile into row_loc;--测试是否有数据,并执行循环while csr_TestWhile%found loopdbms_output.put_line('部门地点:'||row_loc.LOC);--给下一行喂数据fetch csr_TestWhile into row_loc;end loop;close csr_TestWhile;end;select*from emp--4,接收用户输入的部门编号,用for循环和游标,打印出此部门的所有雇员的所有信息(使用循环游标)--CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;--定义参数的语法如下:Parameter_name [IN] data_type[{:=|DEFAULT} value]declareCURSORc_dept(p_deptNo number)isselect*from emp where emp.depno=p_deptNo;r_emp emp%rowtype;beginfor r_emp in c_dept(20) loopdbms_output.put_line('员工号:'||r_emp.EMPNO||'员工名:'||r_emp.ENAME||'工资:'||r_emp.SAL);end loop;end;select*from emp--5:向游标传递一个工种,显示此工种的所有雇员的所有信息(使用参数游标)declarecursorc_job(p_job nvarchar2)isselect*from emp where JOB=p_job;r_job emp%rowtype;beginfor r_job in c_job('CLERK') loopdbms_output.put_line('员工号'||r_job.EMPNO||''||'员工姓名'||r_job.ENAME);end loop;end;SELECT*FROM EMP--6:用更新游标来为雇员加佣金:(用if实现,创建一个与emp表一摸一样的emp1表,对emp1表进行修改操作),并将更新前后的数据输出出来--/blog/815770create table emp1 as select*from emp;declarecursorcsr_Updateisselect*from emp1 for update OF SAL;empInfo csr_Update%rowtype;saleInfo emp1.SAL%TYPE;beginFOR empInfo IN csr_Update LOOPIF empInfo.SAL<1500THENsaleInfo:=empInfo.SAL*1.2;elsif empInfo.SAL<2000THENsaleInfo:=empInfo.SAL*1.5;elsif empInfo.SAL<3000THENsaleInfo:=empInfo.SAL*2;END IF;UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_Update;END LOOP;END;--7:编写一个PL/SQL程序块,对名字以‘A’或‘S’开始的所有雇员按他们的基本薪水(sal)的10%给他们加薪(对emp1表进行修改操作) declarecursorcsr_AddSalisselect*from emp1 where ENAME LIKE'A%'OR ENAME LIKE'S%'for update OF SAL;r_AddSal csr_AddSal%rowtype;saleInfo emp1.SAL%TYPE;beginfor r_AddSal in csr_AddSal loopdbms_output.put_line(r_AddSal.ENAME||'原来的工资:'||r_AddSal.SAL);saleInfo:=r_AddSal.SAL*1.1;UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_AddSal;end loop;end;--8:编写一个PL/SQL程序块,对所有的salesman增加佣金(comm)500declarecursorcsr_AddComm(p_job nvarchar2)isselect*from emp1 where JOB=p_job FOR UPDATE OF COMM;r_AddComm emp1%rowtype;commInfo m%type;beginfor r_AddComm in csr_AddComm('SALESMAN') LOOPcommInfo:=r_M+500;UPDATE EMP1 SET COMM=commInfo where CURRENT OF csr_AddComm;END LOOP;END;--9:编写一个PL/SQL程序块,以提升2个资格最老的职员为MANAGER(工作时间越长,资格越老)--(提示:可以定义一个变量作为计数器控制游标只提取两条数据;也可以在声明游标的时候把雇员中资格最老的两个人查出来放到游标中。

相关文档
最新文档