文档章节

Oracle中Cursor介绍

谢思华
 谢思华
发布于 2017/08/22 15:58
字数 3158
阅读 22
收藏 0
点赞 0
评论 0

关键字 
概念 
类型 
异常处理 

 

一、概念


        游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。 


二  类型 


  Cursor类型包含三种: 隐式Cursor,显式Cursor和Ref Cursor(动态Cursor)。 
1. 隐式Cursor: 
1).对于Select …INTO…语句,一次只能从数据库中获取到一条数据,对于这种类型的DML Sql语句,就是隐式Cursor。例如:Select /Update / Insert/Delete操作。 
2)作用:可以通过隐式Cusor的属性来了解操作的状态和结果,从而达到流程的控制。Cursor的属性包含: 
SQL%ROWCOUNT 整型 代表DML语句成功执行的数据行数 
SQL%FOUND  布尔型  值为TRUE代表插入、删除、更新或单行查询操作成功 
SQL%NOTFOUND 布尔型 与SQL%FOUND属性返回值相反 
SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假 
3) 隐式Cursor是系统自动打开和关闭Cursor
下面是一个Sample: 

Sql代码 

Set Serveroutput on;  
  
begin  
    update t_contract_master set liability_state = 1 where policy_code = '123456789';  
      
    if SQL%Found then  
       dbms_output.put_line('the Policy is updated successfully.');  
       commit;  
    else  
      dbms_output.put_line('the policy is updated failed.');  
    end if;  
  
end;  
  
/ 


在PL/SQL中run: 

Sql代码 

SQL>   
   
the policy is updated failed.  
   
PL/SQL procedure successfully completed  


2. 显式Cursor: 
(1) 对于从数据库中提取多行数据,就需要使用显式Cursor。显式Cursor的属性包含: 
游标的属性   返回值类型   意    义  
%ROWCOUNT   整型  获得FETCH语句返回的数据行数  
%FOUND  布尔型 最近的FETCH语句返回一行数据则为真,否则为假  
%NOTFOUND   布尔型 与%FOUND属性返回值相反  
%ISOPEN 布尔型 游标已经打开时值为真,否则为假  

(2) 对于显式游标的运用分为四个步骤: 
 定义游标---Cursor  [Cursor Name]  IS; 
 打开游标---Open  [Cursor Name]; 
 操作数据---Fetch  [Cursor name] 
 关闭游标---Close [Cursor Name],这个Step绝对不可以遗漏。 
(3)以下是三种常见显式Cursor用法。 
1) 

Sql代码 

Set serveroutput on;  
  
declare   
    ---define Cursor  
    Cursor cur_policy is  
     select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account  
     from t_contract_master cm  
     where cm.liability_state = 2  
     and cm.policy_type = 1  
     and cm.policy_cate in ('2','3','4')  
     and rownum < 5  
     order by cm.policy_code desc;  
    curPolicyInfo cur_policy%rowtype;---定义游标变量  
Begin  
   open cur_policy; ---open cursor  
   Loop   
     --deal with extraction data from DB  
     Fetch cur_policy into curPolicyInfo;  
     Exit when cur_policy%notfound;  
           
     Dbms_Output.put_line(curPolicyInfo.policy_code);  
   end loop;  
   Exception   
     when others then  
         close cur_policy;  
         Dbms_Output.put_line(Sqlerrm);  
           
   if cur_policy%isopen then    
    --close cursor   
      close cur_policy;  
   end if;  
end;  
  
/  



2) 

Sql代码 

Set serveroutput on;  
  
declare   
    Cursor cur_policy is  
     select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account  
     from t_contract_master cm  
     where cm.liability_state = 2  
     and cm.policy_type = 1  
     and cm.policy_cate in ('2','3','4')  
     and rownum < 5  
     order by cm.policy_code desc;  
     v_policyCode t_contract_master.policy_code%type;  
     v_applicantId t_contract_master.applicant_id%type;  
     v_periodPrem t_contract_master.period_prem%type;  
     v_bankCode t_contract_master.bank_code%type;  
     v_bankAccount t_contract_master.bank_account%type;  
Begin  
   open cur_policy;  
   Loop   
     Fetch cur_policy into v_policyCode,  
                           v_applicantId,  
                           v_periodPrem,  
                           v_bankCode,  
                           v_bankAccount;  
     Exit when cur_policy%notfound;  
           
     Dbms_Output.put_line(v_policyCode);  
   end loop;  
   Exception   
     when others then  
         close cur_policy;  
         Dbms_Output.put_line(Sqlerrm);  
           
   if cur_policy%isopen then     
      close cur_policy;  
   end if;  
end;  
/  



3)

Sql代码 

Set serveroutput on;  
  
declare   
    Cursor cur_policy is  
     select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account  
     from t_contract_master cm  
     where cm.liability_state = 2  
     and cm.policy_type = 1  
     and cm.policy_cate in ('2','3','4')  
     and rownum < 5  
     order by cm.policy_code desc;  
Begin  
   For rec_Policy in cur_policy loop  
       Dbms_Output.put_line(rec_policy.policy_code);  
   end loop;  
   Exception   
     when others then  
         Dbms_Output.put_line(Sqlerrm);  
           
end;  
  
/  


run pl/sql,执行结果如下: 

Sql代码 

SQL>   
   
8780203932  
8780203227  
8780203218  
8771289268  
   
PL/SQL procedure successfully completed 


3. Ref Cursor(动态游标): 
1) 与隐式Cursor,显式Cursor的区别:Ref Cursor是可以通过在运行期间传递参数来获取数据结果集。而另外两种Cursor,是静态的,在编译期间就决定数据结果集。 
2) Ref cursor的使用: 
 Type [Cursor type name] is ref cursor 
 Define 动态的Sql语句 
 Open cursor 
 操作数据---Fetch  [Cursor name] 
 Close Cursor 
下面是一个Sample: 

Sql代码 

Set serveroutput on;  
  
Declare  
    ---define cursor type name  
    type cur_type is ref cursor;  
    cur_policy cur_type;  
    sqlStr varchar2(500);  
    rec_policy t_contract_master%rowtype;  
begin  
   ---define 动态Sql  
   sqlStr := 'select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account from t_contract_master cm  
     where cm.liability_state = 2   
     and cm.policy_type = 1   
     and cm.policy_cate in (2,3,4)   
     and rownum < 5   
     order by cm.policy_code desc ';  
---Open Cursor  
  open cur_policy for sqlStr;  
  loop  
       fetch cur_policy into rec_policy.policy_code, rec_policy.applicant_id, rec_policy.period_prem,rec_policy.bank_code,rec_policy.bank_account;  
       exit when cur_policy%notfound;  
         
       Dbms_Output.put_line('Policy_code:'||rec_policy.policy_code);  
    
  end loop;  
close cur_policy;      
  
end;  
/  



3.常见Exception 

Sql代码 

1.  错 误 名 称 错误代码    错 误 含 义     
2.  CURSOR_ALREADY_OPEN ORA_06511   试图打开已经打开的游标     
3.  INVALID_CURSOR  ORA_01001   试图使用没有打开的游标     
4.  DUP_VAL_ON_INDEX    ORA_00001   保存重复值到惟一索引约束的列中     
5.  ZERO_DIVIDE ORA_01476   发生除数为零的除法错误     
6.  INVALID_NUMBER  ORA_01722   试图对无效字符进行数值转换     
7.  ROWTYPE_MISMATCH    ORA_06504   主变量和游标的类型不兼容     
8.  VALUE_ERROR ORA_06502   转换、截断或算术运算发生错误     
9.  TOO_MANY_ROWS   ORA_01422   SELECT…INTO…语句返回多于一行的数据     
10. NO_DATA_FOUND   ORA_01403   SELECT…INTO…语句没有数据返回     
11. TIMEOUT_ON_RESOURCE ORA_00051   等待资源时发生超时错误     
12. TRANSACTION_BACKED_OUT  ORA_00060   由于死锁,提交失败     
13. STORAGE_ERROR   ORA_06500   发生内存错误     
14. PROGRAM_ERROR   ORA_06501   发生PL/SQL内部错误     
15. NOT_LOGGED_ON   ORA_01012   试图操作未连接的数据库     
16. LOGIN_DENIED    ORA_01017   在连接时提供了无效用户名或口令 

 

4.Demo

-- 声明游标;CURSOR cursor_name IS select_statement

--For 循环游标
--(1)定义游标
--(2)定义游标变量
--(3)使用for循环来使用这个游标
declare
       --类型定义
       cursor c_job
       is
       select empno,ename,job,sal
       from emp
       where job='MANAGER';
       --定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型
       c_row c_job%rowtype;
begin
       for c_row in c_job loop
         dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
       end loop;
end;


      
--Fetch游标
--使用的时候必须要明确的打开和关闭

declare 
       --类型定义
       cursor c_job
       is
       select empno,ename,job,sal
       from emp
       where job='MANAGER';
       --定义一个游标变量
       c_row c_job%rowtype;
begin
       open c_job;
         loop
           --提取一行数据到c_row
           fetch c_job into c_row;
           --判读是否提取到值,没取到值就退出
           --取到值c_job%notfound 是false 
           --取不到值c_job%notfound 是true
           exit 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语句的执行情况。
       begin
         update emp set ENAME='ALEARK' WHERE EMPNO=7469;
         if sql%isopen then
           dbms_output.put_line('Openging');
           else
             dbms_output.put_line('closing');
             end if;
          if sql%found then
            dbms_output.put_line('游标指向了有效行');--判断游标是否指向有效行
            else
              dbms_output.put_line('Sorry');
              end if;
              if sql%notfound then
                dbms_output.put_line('Also Sorry');
                else
                  dbms_output.put_line('Haha');
                  end if;
                   dbms_output.put_line(sql%rowcount);
                   exception 
                     when no_data_found then
                       dbms_output.put_line('Sorry No data');
                       when too_many_rows then
                         dbms_output.put_line('Too Many rows');
                         end;
declare
       empNumber emp.EMPNO%TYPE;
       empName emp.ENAME%TYPE;
       begin
         if sql%isopen then
           dbms_output.put_line('Cursor is opinging');
           else
             dbms_output.put_line('Cursor is Close');
             end if;
             if sql%notfound then
               dbms_output.put_line('No Value');
               else
                 dbms_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 then
                dbms_output.put_line('Cursor is opinging');
                else
                dbms_output.put_line('Cursor is Closing');
                end if;
                 if sql%notfound then
                 dbms_output.put_line('No Value');
                 else
                 dbms_output.put_line(empNumber);
                 end if;
                 exception 
                   when no_data_found then
                     dbms_output.put_line('No Value');
                     when too_many_rows then
                       dbms_output.put_line('too many rows');
                       end;
                   
                 
       
--2,使用游标和loop循环来显示所有部门的名称
--游标声明
declare 
       cursor csr_dept
       is
       --select语句
       select DNAME
       from Depth;
       --指定行指针,这句话应该是指定和csr_dept行类型相同的变量
       row_dept csr_dept%rowtype;
begin
       --for循环
       for row_dept in csr_dept loop
           dbms_output.put_line('部门名称:'||row_dept.DNAME);
       end loop;
end;


--3,使用游标和while循环来显示所有部门的的地理位置(用%found属性)
declare
       --游标声明
       cursor csr_TestWhile
       is
       --select语句
       select  LOC
       from Depth;
       --指定行指针
       row_loc csr_TestWhile%rowtype;
begin
  --打开游标
       open csr_TestWhile;
       --给第一行喂数据
       fetch csr_TestWhile into row_loc;
       --测试是否有数据,并执行循环
         while csr_TestWhile%found loop
           dbms_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]  

declare 
      CURSOR 
      c_dept(p_deptNo number)
      is
      select * from emp where emp.depno=p_deptNo;
      r_emp emp%rowtype;
begin
        for r_emp in c_dept(20) loop
            dbms_output.put_line('员工号:'||r_emp.EMPNO||'员工名:'||r_emp.ENAME||'工资:'||r_emp.SAL);
        end loop;
end;
select * from emp   
--5:向游标传递一个工种,显示此工种的所有雇员的所有信息(使用参数游标)
declare 
       cursor
       c_job(p_job nvarchar2)
       is 
       select * from emp where JOB=p_job;
       r_job emp%rowtype;
begin 
       for r_job in c_job('CLERK') loop
           dbms_output.put_line('员工号'||r_job.EMPNO||' '||'员工姓名'||r_job.ENAME);
        end loop;
end;
SELECT * FROM EMP

--6:用更新游标来为雇员加佣金:(用if实现,创建一个与emp表一摸一样的emp1表,对emp1表进行修改操作),并将更新前后的数据输出出来 
--http://zheng12tian.iteye.com/blog/815770 
        create table emp1 as select * from emp;
        
declare
        cursor
        csr_Update
        is
        select * from  emp1 for update OF SAL;
        empInfo csr_Update%rowtype;
        saleInfo  emp1.SAL%TYPE;
begin
    FOR empInfo IN csr_Update LOOP
      IF empInfo.SAL<1500 THEN
        saleInfo:=empInfo.SAL*1.2;
       elsif empInfo.SAL<2000 THEN
        saleInfo:=empInfo.SAL*1.5;
        elsif empInfo.SAL<3000 THEN
        saleInfo:=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表进行修改操作)
declare 
     cursor
      csr_AddSal
     is
      select * from emp1 where ENAME LIKE 'A%' OR ENAME LIKE 'S%' for update OF SAL;
      r_AddSal csr_AddSal%rowtype;
      saleInfo  emp1.SAL%TYPE;
begin
      for r_AddSal in csr_AddSal loop
          dbms_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)500
declare
      cursor
          csr_AddComm(p_job nvarchar2)
      is
          select * from emp1 where   JOB=p_job FOR UPDATE OF COMM;
      r_AddComm  emp1%rowtype;
      commInfo emp1.comm%type;
begin
    for r_AddComm in csr_AddComm('SALESMAN') LOOP
        commInfo:=r_AddComm.COMM+500;
         UPDATE EMP1 SET COMM=commInfo where CURRENT OF csr_AddComm;
    END LOOP;
END;

--9:编写一个PL/SQL程序块,以提升2个资格最老的职员为MANAGER(工作时间越长,资格越老)
--(提示:可以定义一个变量作为计数器控制游标只提取两条数据;也可以在声明游标的时候把雇员中资格最老的两个人查出来放到游标中。)
declare
    cursor crs_testComput
    is
    select * from emp1 order by HIREDATE asc;
    --计数器
    top_two number:=2;
    r_testComput crs_testComput%rowtype;
begin
    open crs_testComput;
       FETCH crs_testComput INTO r_testComput;
          while top_two>0 loop
             dbms_output.put_line('员工姓名:'||r_testComput.ENAME||' 工作时间:'||r_testComput.HIREDATE);
             --计速器减一
             top_two:=top_two-1;
             FETCH crs_testComput INTO r_testComput;
           end loop;
     close crs_testComput;
end;
    

--10:编写一个PL/SQL程序块,对所有雇员按他们的基本薪水(sal)的20%为他们加薪,
--如果增加的薪水大于300就取消加薪(对emp1表进行修改操作,并将更新前后的数据输出出来) 
declare
    cursor
        crs_UpadateSal
    is
        select * from emp1 for update of SAL;
        r_UpdateSal crs_UpadateSal%rowtype;
        salAdd emp1.sal%type;
        salInfo emp1.sal%type;
begin
        for r_UpdateSal in crs_UpadateSal loop
           salAdd:= r_UpdateSal.SAL*0.2;
           if salAdd>300 then
             salInfo:=r_UpdateSal.SAL;
              dbms_output.put_line(r_UpdateSal.ENAME||':  加薪失败。'||'薪水维持在:'||r_UpdateSal.SAL);
             else 
              salInfo:=r_UpdateSal.SAL+salAdd;
              dbms_output.put_line(r_UpdateSal.ENAME||':  加薪成功.'||'薪水变为:'||salInfo);
           end if;
           update emp1 set SAL=salInfo where current of crs_UpadateSal;
        end loop;
end;
     
--11:将每位员工工作了多少年零多少月零多少天输出出来   
--近似
  --CEIL(n)函数:取大于等于数值n的最小整数
  --FLOOR(n)函数:取小于等于数值n的最大整数
  --truc的用法 http://publish.it168.com/2005/1028/20051028034101.shtml
declare
  cursor
   crs_WorkDay
   is
   select ENAME,HIREDATE, trunc(months_between(sysdate, hiredate) / 12) AS SPANDYEARS,
       trunc(mod(months_between(sysdate, hiredate), 12)) AS months,
       trunc(mod(mod(sysdate - hiredate, 365), 12)) as days
   from emp1;
  r_WorkDay crs_WorkDay%rowtype;
begin
    for   r_WorkDay in crs_WorkDay loop
    dbms_output.put_line(r_WorkDay.ENAME||'已经工作了'||r_WorkDay.SPANDYEARS||'年,零'||r_WorkDay.months||'月,零'||r_WorkDay.days||'天');
    end loop;
end;
  
--12:输入部门编号,按照下列加薪比例执行(用CASE实现,创建一个emp1表,修改emp1表的数据),并将更新前后的数据输出出来
--  deptno  raise(%)
--  10      5%
--  20      10%
--  30      15%
--  40      20%
--  加薪比例以现有的sal为标准
--CASE expr WHEN comparison_expr THEN return_expr
--[, WHEN comparison_expr THEN return_expr]... [ELSE else_expr] END
declare
     cursor
         crs_caseTest
          is
          select * from emp1 for update of SAL;
          r_caseTest crs_caseTest%rowtype;
          salInfo emp1.sal%type;
     begin
         for r_caseTest in crs_caseTest loop
         case 
           when r_caseTest.DEPNO=10
           THEN salInfo:=r_caseTest.SAL*1.05;
           when r_caseTest.DEPNO=20
           THEN salInfo:=r_caseTest.SAL*1.1;
           when r_caseTest.DEPNO=30
           THEN salInfo:=r_caseTest.SAL*1.15;
            when r_caseTest.DEPNO=40
           THEN salInfo:=r_caseTest.SAL*1.2;
         end case;
          update emp1 set SAL=salInfo where current of crs_caseTest;
        end loop;
end;

--13:对每位员工的薪水进行判断,如果该员工薪水高于其所在部门的平均薪水,则将其薪水减50元,输出更新前后的薪水,员工姓名,所在部门编号。
--AVG([distinct|all] expr) over (analytic_clause)
---作用:
--按照analytic_clause中的规则求分组平均值。
  --分析函数语法:
  --FUNCTION_NAME(<argument>,<argument>...)
  --OVER
  --(<Partition-Clause><Order-by-Clause><Windowing Clause>)
     --PARTITION子句
     --按照表达式分区(就是分组),如果省略了分区子句,则全部的结果集被看作是一个单一的组
     select * from emp1
DECLARE
     CURSOR 
     crs_testAvg
     IS
     select EMPNO,ENAME,JOB,SAL,DEPNO,AVG(SAL) OVER (PARTITION BY DEPNO ) AS DEP_AVG
     FROM EMP1 for update of SAL;
     r_testAvg crs_testAvg%rowtype;
     salInfo emp1.sal%type;
     begin
     for r_testAvg in crs_testAvg loop
     if r_testAvg.SAL>r_testAvg.DEP_AVG then
     salInfo:=r_testAvg.SAL-50;
     end if;
     update emp1 set SAL=salInfo where current of crs_testAvg;
     end loop;
end;

 

以上内容整合了以下两个来源:

http://www.iteye.com/topic/649874

http://www.cnblogs.com/sc-xx/archive/2011/12/03/2275084.html

© 著作权归作者所有

共有 人打赏支持
谢思华
粉丝 59
博文 179
码字总数 120809
作品 0
广州
程序员
Oracle里的Cursor(一) ——shared cursor

Cursor直译过来就是“游标”,它是Oracle数据库中SQL解析和执行的载体。Oracle数据库是用C语言写的,可以将Cursor理解成是C语言的一种结构(Structure)。 Oracle数据库里的Cursor分为两种类型...

技术小胖子
2017/11/08
0
0
Oracle --存储过程基本语法

一、存储过程的理解 create or replace procedure 存储过程名 as begin null end 行1:create or replace procedure 是一个SQL语句,通知oracle数据库去创建一个叫做skeleton储存过程,如果存...

求是科技
2015/04/09
0
0
Oracle服务器的Execute to Parse

有台Oracle数据库服务器,发现内存占用得比较厉害,生成awr报告,发现有个指标有点异常 Instance Efficiency Percentages (Target 100%) 里面的Execute to Parse 居然出现负数。找到某大师给...

rudy_gao
2014/07/10
0
0
Python学习之 cx_Oracle学习记录 一

今天开始正式学习Python,正好在学Oracle,刚好结合在一起把cxOracle学习了。 对了这哥们有一个教python的网站,我在上面也学了学 地址: http://www.liaoxuefeng.com/wiki/001374738125095c...

卜星星
2015/03/13
0
0
Oracle存储过程基本语法介绍(转)

转自该地址:http://www.jb51.net/article/31805.htm 正文如下: Oracle存储过程基本语法介绍,有需求的朋友可以参考下 <SCRIPT type=text/javascript>dy("artup")<SCRIPT type=text/javasc......

功夫panda
2015/12/13
130
0
MySQL · 引擎特性 · MySQL logical read-ahead

背景 之前的月报中我们比较了InnoDB linear read-ahead和Oracle的multiblock read,两个的性能有所差别,具体可以参考月报详情。 这两种方式之所以带来了更高的吞吐量,都基于数据存储的连续...

阿里云RDS-数据库内核组
2015/07/09
0
0
[Oracle] 变量绑定

Parent-Child cursor (父子游标) 父游标:只要SQL语句文本相同,它们就对应同一个parent cursor。 子游标:在某些情况下,虽然SQL语句的文本相同,但是因为其它因素不同(这些因素可以在视...

长平狐
2013/06/03
45
0
Oracle存储过程和游标基本语法

1 CREATE OR REPLACE PROCEDURE 存储过程名   2 IS   3 BEGIN   4 NULL;   5 END; 行1:   CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储...

沧海飞蝶
2014/06/19
0
1
【每日一摩斯】-Shared Pool优化和Library Cache Latch冲突优化 (1523934.1)-系列4

CURSORSHARING 参数 (8.1.6 以上) 这个参数需要小心使用。如果它被设为FORCE,那么Oracle会尽可能用系统产生的绑定变量来替换原来SQL中的literals部分。对于很多仅仅是literal不一样的相似的...

bisal
2013/09/02
0
0
[Oracle] 变量绑定

Parent-Child cursor (父子游标) 父游标:只要SQL语句文本相同,它们就对应同一个parent cursor。 子游标:在某些情况下,虽然SQL语句的文本相同,但是因为其它因素不同(这些因素可以在视...

长平狐
2013/06/03
65
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

社交系统ThinkSNS+ V1.8.3更新播报

     研发发布版本号:1.8.3   本次版本于2018年7月16日发布   本次发布类型:新增功能、细节调整与优化   社交系统ThinkSNSPlus更新体验:请于官网下载/安装最新版或联系QQ35159...

ThinkSNS账号
9分钟前
0
0
教育思考:选择编程是一场父母和孩子的和解[图]

教育思考:选择编程是一场父母和孩子的和解[图]: 之前有个很热的段子是这样讲的:深夜十点的时候,某小区一女子大声喊叫“什么关系?啊?!到底什么关系?你说!”最后发现原来是一位妈妈陪...

原创小博客
10分钟前
0
0
X64汇编之指令格式解析

最近由于项目组内要做特征码搜索的东西,便于去Hook一些未导出函数,你懂得...于是就闲着学习了一下x86/x64的汇编指令格式。x86的汇编指令格式请参照http://bbs.pediy.com/showthread.php?t...

simpower
13分钟前
0
0
rust 语法概要(只适合不熟悉时快速查阅使用,不适合理解其精髓。未完待续)

注意:本内容只适合快查,不适合理解精髓。精髓请研读 https://kaisery.github.io/trpl-zh-cn/foreword.html 基本数据类型 i8,i16,i32,i64,i128 u8,u16,u32,u64,u128 f32,f64 char bool:true...

捍卫机密
16分钟前
0
0
JS中严格模式和非严格模式

1,使用 严格模式的使用很简单,只有在代码首部加入字符串 "use strict"。必须在首部即首部指其前面没有任何有效js代码除注释,否则无效 2.注意事项 (1)不使用var声明变量严格模式中将不通...

AndyZhouX
16分钟前
0
0
Nginx配置error_page 404 500等自定义的错误页面

Nginx 做web server时, 开发中发现有时候的网站代码有错误,我们需要跳转到一个指定内容的错误页面: 1. 在nginx.conf配置文件上加上一句: fastcgi_intercept_errors on; 2. 服务中加上: er...

MichaelShu
18分钟前
0
0
微服务架构下的监控系统设计(一)——指标数据的采集展示

前言 微服务是一种架构风格,一个大型复杂软件应用通常由多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。...

UCloudTech
24分钟前
0
0
极客时间《趣谈网络协议》之开篇词学习笔记

出于个人兴趣,本人在极客时间购买了网易研究院云计算技术部的首席架构师刘超老师关于计算机网络的专栏之《趣谈网络协议》,由于知识版权原因,不能直接分享刘超老师的原文,所以,我会在每次...

aibinxiao
26分钟前
1
0
Activiti - 新一代的开源 BPM 引擎

Activiti 背景简介、服务和功能介绍 董 娜, 狄 浩, 和 张 晓篱 2012 年 7 月 23 日发布 背景介绍 Activiti 其核心是 BPMN 2.0 的流程引擎。BPMN 是目前被各 BPM 厂商广泛接受的 BPM 标准,全...

孟飞阳
32分钟前
0
0
最有效的方式来适配

最有效的方式来进行屏幕适配 在上代码之前先把屏幕相关的几个概念搞清楚:Density、DensityDpi、ScaleDensity。这里我们不过多讲解这些概念知识。 1.0 获取设计图的屏幕尺寸:这里我以360dp...

android-key
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部