oracle游标

------------静态游标:显式游标、隐式游标
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的列转换-----------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值