zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    隐式马尔科夫模型
    TCP与UDP协议
    语法分析
    requests发送HTTP请求
    IPv6协议
    IP协议
    路由协议
    Django表单验证
    PDB调试Python程序
    word2vec模型原理与实现
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331688.html
Copyright © 2011-2022 走看看