------------静态游标:显式游标、隐式游标
1、显式游标一般用于循环获取结果集,一般使用for循环的简化语法
2、隐式游标经常用来判断DML的执行是否成功
3、动态游标往往集合存储过程来使用,如查询需要动态改变。
显示游标的使用:需要声明(定义)
1.声明游标
2.打开游标
3.提取游标
4.关闭游标
使用for循环操作游标,是不需要打开和关闭操作。
1、声明游标的语法
cursor <游标名> is select<语句>
2、打开游标语法
open<游标名>;
3、提取游标语法
fetch<游标名>into<变量列表>;
4、关闭游标语法
close<游标名>;
游标的属性:
%isopen 判断游标是否打开--是否打开
%found 游标是否指向有效行---查询到数据
%notfound 游标是否没有指向有效行--没有查询到数据
sql%rowcount 游标抽取过的行数---检索记录的行数
语法:游标名%属性名
显示游标的用法:
语法:
for <类型> in <游标名> loop
---操作各行数据
end loop;
隐式游标的使用:不需要定义
语法:select 表字段 into 变量 from 表;
动态游标与静态游标的区别:可以动态的指定sql语句,灵活性好,效率低些,静态游标效率高些,但是不灵活。
-----------------动态游标:强类型,弱类型--------------
语法:
delare
type 动态游标类型名 is ref cursor;
--定义动态游标的类型
return 数据类型 ---可选 定义返回的数据类型(强类型)
游标名 动态游标类型名;
begin
open 游标名 for select 变量列表 from 表名
end;
--------动态游标(弱类型:不规定返回值类型)------------------
实例:
declare
type dt_cursor is ref cursor; --定义动态游标类型
v_bank dt_cursor; --定义游标
v_name varchar(50);
v_balance number;
v_start number :=&请选择;
begin
if v_start=1 then
open v_bank for select cname,balance from bank;
elsif v_start=2 then
open v_bank for select ename,salary from EMPLOYEE;
end if;
loop
fetch v_bank into v_name,v_balance; --提取游标
exit when v_bank%notfound;
dbms_output.put_line(v_name||'==='||v_balance);
end loop;
end;
动态游标(强类型)-------------------------------------------
实例:
declare
type dt_q is ref cursor; --定义动态游标类型
return bank%rowtype; --定义返回类型
v_bank dt_q; --定义游标
return bank%rowtype;
stu bank%rowtype;
begin
open v_bank for select * from bank; --打开游标
loop
fetch v_bank into stu; --提取游标
exit when v_bank%notfound;
dbms_output.put_line(stu.cname||'====='||stu.balance);
end loop;
end;
----------------------------动态SQL-----------------------
语法:
execute immediate 'DML、DDL语句'
[into <变量序列>] ----用于查询
[using <参数序列>]; ---动态确定,用于绑定输入的参数变量
sql语句中若有参数,使用“:参数名”
执行动态sql语句实例:
declare
s_sid number :=&编号;
s_name varchar(50):='&姓名';
s_cardno number :=&身份证号;
s_balance number :=&金额;
s_s1 number :=&状态;
o_opens number:=&状态1;
begin
--动态执行sql语句
execute immediate 'insert into bank(cardid,cname,cardno,balance,status,opens) values(:s_sid,:s_name,:s_cardno,:s_balance,:s_s1,:o_opens)' using s_sid,s_name,s_cardno,s_balance,s_s1,o_opens;
if sql%rowcount>0 then
dbms_output.put_line('添加成功');
else
dbms_output.put_line('失败');
end if;
commit;
end;
--动态创建表
declare
t_table varchar2(50):='&表名';
begin
execute immediate 'create table '||t_table||'(id number)';
end;
-------------------静态sql:编译时确定
动态创建返回多行的sql语句
语法:
open cursor_name for <sql语句>
[using <参数序列>];
动态sql的列转换-----------------------------