oracle 游标

1.       游标: 容器,存储SQL语句影响行数。

2.       游标类型: 隐式游标,显示游标,REF游标。其中,隐式游标和显示游标属于静态游标(运行前将游标与SQL语句关联),REF游标属于动态游标(运行时将游标与SQL语句关联)。

3.       隐式游标: DML语句对应的游标,由Oracle自动管理,也称SQL游标。(所有的DML操作都被Oracle内部解析为一个cursor名为SQL的隐式游标)

--      隐式游标的属性有:
--     %FOUND – SQL 语句影响了一行或多行时为 TRUE
--    %NOTFOUND – SQL 语句没有影响任何行时为TRUE
--    %ROWCOUNT – SQL 语句影响的行数
--    %ISOPEN - 游标是否打开,始终为FALSE
declare aid a.name%type:='liaomin';  --a.name即表a的name字段 这样定义可以不需要知道类型
begin
    update a set name='liaomin1' where name=aid;
    --隐式游标在执行上面语句就已经停止 所有这里是不知道是否打开的
    if(SQL%isopen) then
        dbms_output.put_line('打开游标');
    end if;

    --隐士游标的信息都在SQL变量中 如果update的数据有多条记录 SQL就指向最后一条
    if(SQL%notfound) then
        dbms_output.put_line('没有');
    end if;
    if(SQL%found) then
        dbms_output.put_line('找到');
    end if;
end;

显示游标操作:

                  (1)声明游标(关联SQL语句)    cursor+游标名 is/as sql语句

                  (2)打开游标(执行SQL语句,填充游标)    open+游标名

                  (3)提取游标的行    fetch 游标名 into 行类型变量

                  (4)关闭游标       close+游标名

例子

declare arow a%rowtype;
cursor csr is select * from a;
begin
    open csr;
    loop
    fetch csr into arow;
    exit when csr%notfound;
    dbms_output.put_line(arow.name);
    end loop;
    close csr;
end;

带参数的游标

declare arow a%rowtype;
paramname varchar(20):='liaomin';
cursor csr(param varchar) is select * from a where name=param;
begin
    open csr(paramname);
    loop
    fetch csr into arow;
    exit when csr%notfound;
    dbms_output.put_line(arow.name);
    end loop;
    close csr;
end;

使用显示游标更新行

q      允许使用游标删除或更新活动集中的行

q      声明游标时必须使用 SELECT … FOR UPDATE语句

 declare arow a%rowtype;
paramname varchar(20):='liaomin';
cursor csr(param varchar) is select * from a where name=param for update of name;

   -- 定义的游标会让数据库对涉及的行(对应的列)加锁,别的会话如果要访问该游标中的行便会进入等待状态。              

   --如果别的会话一直不解锁,那么你的select就会一直等待下去,

   --如果你不想等,只需在for   update后面加上nowait就可以解决这个问题了,这样你的选择会立即返回。   
begin
    open csr(paramname);
    loop
    fetch csr into arow;
    exit when csr%notfound;
    update a set name='huqun' where current of csr;
    end loop;
    close csr;
end;

循环游标

q     循环游标用于简化游标处理代码

q     当用户需要从游标中提取所有记录时使用

q     循环游标的语法如下

declare
cursor csr is select * from a;
begin
       for csr_obj in csr
       loop
         dbms_output.put_line(csr_obj.name);
       end loop;
end; 

.REF游标和游标变量

q      REF 游标和游标变量用于处理运行时动态执行的 SQL 查询

q      创建游标变量需要两个步骤:

q      声明 REF 游标类型

q      声明 REF 游标类型的变量

q      用于声明 REF 游标类型的语法为:

       TYPE <ref_cursor_name> IS REF CURSOR

       [RETURN <return_type>];

q      打开游标变量的语法如下:

        OPEN cursor_name FOR select_statement;

声明强类型的REF游标

type emp_cur is ref cursor return emp%rowtype;

empRecord emp_cur;

声明弱类型的REF游标

type emp_cur is ref cursor;

empRecord emp_cur;

declare
type ref_cursor is ref cursor return a%rowtype;
test_cursor ref_cursor;
row_cursor a%rowtype;
begin
      open test_cursor for select * from a;
      loop
         fetch test_cursor into row_cursor;
         exit when test_cursor%notfound;
         dbms_output.put_line(row_cursor.name);
      end loop;
      close test_cursor;
end;

原文地址:https://www.cnblogs.com/liaomin416100569/p/9331688.html