精华内容
下载资源
问答
  • plsql匿名块

    千次阅读 2017-08-05 19:15:12
    PL/SQL匿名块详解 摘要: PL/SQL是Oracle下的脚本开发语言,是为了解决数据下一些复杂的应用而设计的。一些复杂的应用,仅靠一条SQL语句并不能完成,为了解决这个问题,各个数据库产品都设计了自己的脚本编程...

    PL/SQL匿名块详解

    摘要:

    PL/SQL是Oracle下的脚本开发语言,是为了解决数据下一些复杂的应用而设计的。一些复杂的应用,仅靠一条SQL语句并不能完成,为了解决这个问题,各个数据库产品都设计了自己的脚本编程语言,Oracle下叫做PL/SQL,SQL Server下叫做Transact SQL。

    PL/SQL单行注释使用--,多行注释使用/**/。 PL/SQL中的变量类型主要有一下几种: binary_integer: 整数,主要用来技数而不是用来表示字段类型 number: 数字类型 char: 定长字符串 varchar2: 变长字符串 date: 日期 long:长字符串,最长2GB boolean: 布尔类型,可以取值为true,false和null值。  匿名块是能够动态地创建和执行过程代码的PL/SQL结构,而不需要以持久化的方式将代码作为数据库对象储存在系统目录中。
    --HelloWorld开始
    set serveroutput on;
     
    begin
        dbms_output.put_line( 'Hello World!!!' );
    end;
    /
     
     
    --最简单的语句块
    declare
       v_word varchar( 20 );
    begin
       v_word:= 'Hello World!!!' ;
       dbms_output.put_line(v_word);
    end;
    /
     
     
    --语句块的组成
    declare
        v_num number:= 0 ;
    begin
        v_num:= 2 /v_num;
        dbms_output.put_line(v_num);
    exception
        when others then
           dbms_output.put_line( 'error' );
    end;
    /
     
     
    --变量的声明
    declare
       v_temp number( 1 );
       v_count binary_integer := 0 ;
       v_sal number( 7 , 2 ):= 3000.00 ;
       v_date date:=sysdate;
       v_pi_constrant number( 3 , 2 ):= 3.14 ;
       v_valid boolean := false ;
       v_name varchar2( 20 ) not null := 'My Name' ;
    begin
       dbms_output.put_line( 'v_temp value:' || v_temp);
    end;
    /
     
     
    --变量声明,使用%type属性
    declare
       v_empno number( 4 );
       v_empno2 emp.empno%type;
       v_empno3 v_empno2%type;
    begin
       dbms_output.put_line( 'test...' );
    end;
    /
     
     
    --简单变量赋值
    declare
       v_name varchar2( 20 );
       v_sal number( 7 , 2 );
       v_sal2 number( 7 , 2 );
       v_valid boolean := false ;
       v_date date;
    begin
       v_name := 'My Name' ;
       v_sal := 23.77 ;
       v_sal2 := 23.77 ;
       v_valid := (v_sal=v_sal2);
       v_date := to_date( '2010-08-04 22:58:58' , 'YYYY-MM-DD HH24-MI-SS' );
    end;
    /
     
     
    --table变量类型
    declare
       type  type_table_emp_empno  is table of  emp.empno%type  index by  binary_integer;
       v_empnos type_table_emp_empno;
    begin
       v_empnos( 0 ) := 7369 ;
       v_empnos( 1 ) := 7839 ;
       v_empnos(- 1 ) := 9999 ;
       dbms_output.put_line(v_empnos(- 1 ));
    end;
    /
     
     
    --Record变量类型
    declare
       type  type_record_dept  is record
       (
          deptno  dept.deptno%type,
          dname  dept.dname%type,
          loc  dept.loc%type
       );
       v_temp type_record_dept;
    begin
       v_temp.deptno := 50 ;
       v_temp.dname := 'dname' ;
       v_temp.loc := 'BJ' ;
       dbms_output.put_line(v_temp.deptno || ' ' || v_temp.dname);
    end;
    /
     
     
    --使用%rowtype 声明record变量
    declare
       v_temp dept%rowtype;
    begin
       v_temp.deptno := 50 ;
       v_temp.dname := 'dname' ;
       v_temp.loc := 'BJ' ;
       dbms_output.put_line(v_temp.deptno || ' ' || v_temp.dname);
    end;
    /
     
     
    --SQL语句应用
    declare
       v_ename emp.ename%type;
       v_sal emp.sal%type;
    begin
       select ename,sal into v_ename,v_sal from emp where empno= 7900 ;
       --select ename,sal into v_ename,v_sal from emp where deptno= 30 ;
       dbms_output.put_line(v_ename || ' ' || v_sal);
    end;
    /
     
     
    --SQL语句应用
    declare
       v_emp emp%rowtype;
    begin
       select * into v_emp from emp where empno= 7369 ;
       dbms_output.put_line(v_emp.ename);
    end;
    /
     
     
    --SQL语句应用
    create table dept2(
       deptno number,
       dname varchar2( 50 ),
       loc varchar2( 50 )
    );
    declare
       v_deptno dept.deptno%type := 50 ;
       v_dname dept.dname%type := 'My Name' ;
       v_loc dept.loc%type := 'BJ' ;
    begin
       insert into dept2 values(v_deptno,v_dname,v_loc);
    end;
    /
    select * from dept2;
    --drop table dept2;
     
     
    --SQL语句应用
    declare
       v_deptno dept2.deptno%type := 30 ;
       v_count number;
    begin
       select deptno into v_deptno from dept2 where deptno= 50 ;
       select count(*) into v_count from dept2;
       dbms_output.put_line( 'deptno:' || v_deptno);
       dbms_output.put_line( 'count:' || v_count);
       dbms_output.put_line(sql%rowcount || '条记录被影响...' );
    end;
    /
     
     
    --使用DDL语句
    begin
    execute immediate 'create table T(nnn varchar2(20))' ;
    end;
    /
    drop table T;
     
     
    --选择语句
    declare
       v_sal emp.sal%type;
    begin
       select sal into v_sal from emp where empno= 7369 ;
       if (v_sal < 1200 )then
         dbms_output.put_line( 'low' );
       elsif(v_sal < 2000 ) then
         dbms_output.put_line( 'middle' );
       else
         dbms_output.put_line( 'high' );
       end if ;
    end;
    /
     
     
    --循环语句
    declare
       i binary_integer := 1 ;
    begin
       loop
         dbms_output.put_line( '==' || i);
         i := i+ 1 ;
         exit when(i>= 11 );
       end loop;
    end;
    /
     
     
    --循环语句
    declare
       j binary_integer := 1 ;
    begin
       while j< 11 loop
         dbms_output.put_line( '==' || j);
         j := j+ 1 ;
       end loop;
    end;
    /
     
     
    --循环语句
    begin
       for k in 1 .. 10 loop
         dbms_output.put_line( '==' || k);
       end loop;
       for k in reverse 1 .. 10 loop
         dbms_output.put_line( '==' || k);
       end loop;
    end;
    /
     
     
    --错误处理
    declare
       v_temp number( 4 );
    begin
       select empno into v_temp from emp where deptno= 10 ;
    exception
       when too_many_rows then
         dbms_output.put_line( '太多记录了...' );
       when others then
         dbms_output.put_line( 'error...' );
    end;
    /
     
     
    --错误处理
    declare
       v_temp number( 4 );
    begin
       select empno into v_temp from emp where empno= 2222 ;
    exception
       when no_data_found then
         dbms_output.put_line( '没有数据...' );
       when others then
         dbms_output.put_line( 'error...' );
    end;
    /
     
     
    --游标
    declare
       cursor c is select * from emp;
       v_emp c%rowtype;
    begin
       open c;
       fetch c into v_emp;
       dbms_output.put_line(v_emp.ename);
       close c;
    end;
    /
     
     
    --游标
    declare
       cursor c is select * from emp;
       v_emp c%rowtype;
    begin
       open c;
       loop
         fetch c into v_emp;
         exit when(c%notfound);
           dbms_output.put_line(v_emp.ename);
       end loop;
       close c;
    end;
    /
     
     
    --游标
    declare
       cursor c is select * from emp;
       v_emp c%rowtype;
    begin
       open c;
       fetch c into v_emp;
       while (c%found)loop
         dbms_output.put_line(v_emp.ename);
         fetch c into v_emp;
       end loop;
       close c;
    end;
    /
     
     
    --游标
    declare
       cursor c is select * from emp;
    begin
       for v_emp in c loop
        dbms_output.put_line(v_emp.ename);
       end loop;
    end;
    /
     
     
    --带参数的游标
    declare
       cursor c(v_deptno emp.deptno%type, v_job emp.job%type) is
         select ename,sal from emp where deptno=v_deptno and job=v_job;
       --v_temp c%rowtype;
    begin
       --open c( 30 , 'clerk' );
       for v_temp in c( 30 , 'CLERK' ) loop
         dbms_output.put_line(v_temp.ename || ' ' || v_temp.sal);
       end loop;
    end;
    /
     
     
    --可以更新的游标
    create table emp2 as(
        select * from emp
    );
    drop table emp2;
    declare
       cursor c is select * from emp2 for update;
       --v_temp c%rowtype;
    begin
       for v_temp in c loop
         if (v_temp.sal < 2000 )then
           update emp2 set sal=sal* 2 where current of c;
         elsif(v_temp.sal = 5000 )then
           delete from emp2 where current of c;
         end if ;
       end loop;
       commit;
    end;
    /
    展开全文
  • plsql 匿名块

    2009-09-05 23:50:02
    写的一个匿名块: [code="sql"] declare v_num1 number := 1; v_num2 number := 2; v_string1 varchar2(50) := 'Hello World!'; v_string2 varchar2(50) := '--This message brou...
    最近在学plsql,发现和sql一起用,很强大。写的一个匿名块:
    

    declare
    v_num1 number := 1;
    v_num2 number := 2;

    v_string1 varchar2(50) := 'Hello World!';
    v_string2 varchar2(50) := '--This message brought to you by PL/SQL !';
    v_outputStr varchar2(50);

    begin

    insert into temp_table values(v_num1,v_string1);
    insert into temp_table values(v_num2,v_string2);

    select CHAR_COL into v_outputStr
    from temp_table
    where num_col = v_num1;

    dbms_output.put_line(v_outputStr);


    select char_col into v_outputStr
    from temp_table t
    where t.num_col = v_num2;

    dbms_output.put_line(v_outputStr);


    end;

    便于以后查阅。
    展开全文
  • plsql匿名块、record、table、type、rowtype、异常 博客分类:  oracle   /** 1.1 pl/sql(数据库编程):是对表中的sql语句的扩展,扩展了过程化的控制 1.2   变量: 数据类型:varchar2(len),nvarchar2(len)...

     

    plsql匿名块、record、table、type、rowtype、异常

     

    /**
    1.1 pl/sql(数据库编程):是对表中的sql语句的扩展,扩展了过程化的控制
    1.2 
     变量:
    数据类型:varchar2(len),nvarchar2(len),char(len),date,boolean,number(p,s)
    运算符:|| and or not != <>
    逻辑控制:
    循环结构:
    1.3.pl/sql块:下面相当于一个方法,没有名字,因此叫匿名块。declare(声明)
    declare
         定义变量,v是变量的意思
     begin
        写sql或者pl/sql语句
     exception
          异常处理   
      end;  
    **/
    ------------------------------------------
    declare
       -- v_name varchar(20):='乌龟';--声明变量,同时赋值(第一种赋值)
         v_name varchar(20);
      begin
        v_name:='乌龟';---赋值(第二种赋值)
        select sname into v_name from student where sno='112';--into的意思是把学生表的sname赋值给v_name(第三中赋值)
        dbms_output.put_line(v_name);---打印变量的值,相当于system.out.println()
       end;
    --------------------------------
     ---逻辑控制。if else,输出大年龄
     declare
         v_age number(5):=22;
         v_age2 number(5):=10000;
      begin  ----- if then endif相当于if语句。v_age>v_age2是判断条件,dbms_output.put_line('v_age:' ||v_age)是输出的结果
       if v_age>v_age2 then
         dbms_output.put_line('v_age:' ||v_age);
       else
           dbms_output.put_line('v_age2:' ||v_age2);
       end if;  
       end;
    -------------------------------------
    ---逻辑控制。多重if
     declare
         v_age number(5):=22;
         v_age2 number(5):=10000;
      begin  
       if v_age>v_age2 then
         dbms_output.put_line('v_age=' ||v_age);
       elsif v_age=v_age2  then---elsif在java中相当于else if
         dbms_output.put_line('v_age2=' ||v_age2 ||'v_age:' ||v_age);
       else
         dbms_output.put_line('v_age2=' ||v_age2 );---数据管理系统
       end if;  
       end;
    -------------------
    ---逻辑控制。case等值判断。(在java中就是switch,等值判断)
     declare
         v_grade number(1):=8;   
      begin  
       case 
         when v_grade=1 then  dbms_output.put_line('☆');
         when v_grade=2 then  dbms_output.put_line('☆☆');
         when v_grade=3 then  dbms_output.put_line('☆☆☆');
         when v_grade=4 then  dbms_output.put_line('☆☆☆☆');
         else dbms_output.put_line('☆☆☆☆11111111');
         end case;
       end;
    -----------  
    --逻辑控制。case区间判断
     declare
         v_grade number(3):=89;   
      begin  
       case 
         when v_grade>=90 then  dbms_output.put_line('A');
         when v_grade>=80 then  dbms_output.put_line('B');
         when v_grade>=60 then  dbms_output.put_line('c');
         when v_grade<60then  dbms_output.put_line('d');
         end case;
       end; 
     --------------------
       ---逻辑控制。case用在select中。好像跟sign()很相似
       select sname,
       case 
         when sage>40 then '中上'
         when sage>30 then '中上'
         when sage>20 then '中上'
         when sage<20 then '中上'
             end case
             from student
     ---==================================================================
     ------第二部分:循环控制
     -----循环结构 loop
      declare
         v_x number(6):=1;   
      begin  
      loop ---循环的意思,loop是个死循环
        dbms_output.put_line(v_x);
        if  v_x =100 then
          exit;---强制退出循环
          end if ;
        v_x:=v_x+1;---结果缓冲区溢出,因为超过10000个字节了。因为这是个死循环
      end loop;
       end; 
     -------------------
      ---循环结构 for 。。in后面是个集合
        declare
         v_x number(6):=1;   
      begin  
       for v_x in 1..100 loop ---loop就相当于左大括号,end loop就相当于右边大括号
        dbms_output.put_line(v_x);
      
      end loop;
       end; 
      ---------------------
     -- 循环结构 while 
        declare
         v_x number(6):=1;   
      begin  
       while v_x<=120 loop
        dbms_output.put_line(v_x);
      v_x:=v_x+1;
      end loop;
       end; 
       
    ------------------------
    ------第三部分:oracle 复合数据类型(其实就是java中的引用类型)
    ---1.record记录类型
    --record:就相当于创建类(更确切的说应该是创建表,因为格式更像是创建表,
    --因为他里面的内容都放在了一对括号里了,每个字段后面用逗号,而不是分号,最后一个字段不用逗号)
        declare
        ---- 1.定义一个复合类型v_r  (type是定义类型,相当于定义类,名字v_r)。完成的就是对类的定义和给类中属性赋值
        type v_r is record
        (
        v_x varchar(20),---这三行相当于是给类加上属性,更确切的说就是成员对象(或者说是在建表)
        v_y varchar(20),
        v_z varchar(20)
        );----这个表是个整体,因此结束的时候要分号
        ---2.定义复合类型的变量(相当于java创建对象)
        v_n v_r;
      begin  
        --这个sql块想要说明的就是v_n.v_x(对象.属性)的使用
      -- v_n.v_x:='安娜';---相当于在java中的利用对象调用属性
      --v_n.v_z:='令狐冲';
      -- v_n.v_y:=23;
       select sname,saddress,sage into v_n.v_x,v_n.v_y,v_n.v_z from student  where sno='112';---这个sql块想要说明的就是v_n.v_x(对象.属性)的使用
       dbms_output.put_line(v_n.v_x);
       dbms_output.put_line(v_n.v_y);
       dbms_output.put_line(v_n.v_z);
       end; 
    ----用处:定义一个record变量存放第二条记录, 并输出结果
    --------------------------------------------------------
       
     ----2.table类型(相当于数组) :总结一下:自己指定数组名字,数组类型,索引类型,索引名字,不用给数组指定大小,因为他自己会增加 。完成的就是对数组的定义和赋值
      declare
       ---1.声明table类型,of varchar2(23)是数组中元素的类型,index by 是索引的类型。v_t是数组类型.索引不用指定大小,会一直增加。索引的类型自己指定,
       ---(索引类型改成number不行(改成其他的不受限制)。因为number可以出现小数位)
       type v_t is table of varchar2(23) index by varchar2(3);
       ---2.定义v_t类型的变量,现在v_a就是数组变量
       v_a v_t;
      begin  
       select sname,saddress into v_a('1'),v_a('2')  from student where sno='112';----这里的1,2代表索引(类型是varchar2(3))。这索引也是自己定义的。但是要注意在select后面的列的类型,要跟数组的类型一致
    dbms_output.put_line(v_a('x'));
       end; 
    ----用处:定义一个table 类型变量存放3条记录, 并输出结果
    ---====================================================  
    ---第四部分:扩展变量类型
    ----题:把表中某列的值赋值到一个变量里,但是我不知道这些列的数据类型
    ---1.%type  赋值某一列(一个字段)
    declare 
      v_name student.sname%type;----student.sname%type是student表中的sname列的数据类型
      v_age student.sage%type;
      begin
        select sname ,sage into v_name,v_age from student where sno='112';---into是把sname的值给v_name
        dbms_output.put_line(v_name);
        dbms_output.put_line(v_age);
        end;
    ---2.%rowtype   赋值某一行(也就是所有列)
    declare 
      v_x student%rowtype;----student.sname%type将sname变量的数据类型赋值
      begin
        select sname,sage into v_x.sname,v_x.sage from student where sno='112';
        dbms_output.put_line(v_x.sname);
        dbms_output.put_line(v_x.sage);
        end;
    ------这两个的用处:用pl/sql实现输出7369号员工的姓名
    --=================================================
    -----第五部分:异常
    ---1.java中用异常类来描述(描述类名和异常的具体产生信息,异常编号)。
         ---oracle中描述异常:
                 ---异常名字
                 --异常的具体描述信息
                 --异常编号
    ---2.oracle中异常的分类,按照异常名称分类
       ---预定义异常:名称,描述,编号都由oracle系统提供(相当于java的异常类)
       ---非预定义异常:指提供描述和编号(没有名字的异常)
       ---自定义异常:三无。名称,描述和编号都由程序员自己提供
    --------------------------------------------------
    -----预定义异常。异常1
    declare
       v_num number(3):=10;
       v_num2 number(3):=0;
       v_num3 number(3);
    begin
      v_num3 :=v_num/v_num2; 
    exception
        when ZERO_DIVIDE  then---除零异常
          --dbms_output.put_line('这里有除数为0异常');--这里汉字就是描述
        dbms_output.put_line(sqlcode||'----'||sqlerrm);--系统编号sqlcode和中文描述sqlerrm
           when others then---所有异常,others相当于exception
          dbms_output.put_line('这里有异常');
    end;
    ---------------------------
    --预定义异常 异常2
    declare

           v_name varchar2(20);
    begin
           ---select sname into v_name from student where sno='112';--应该这样写,但是为了测试异常没有加where条件
           select sname into v_name from student;
    exception 
           when too_many_rows then-----实际返回的行数超出请求的行数,因为sname能查出好多,而v_name只能保存一个
           dbms_output.put_line(sqlcode||'鄙视你'||sqlerrm);
    end; 
    -----
    --------第二种:非预定义异常
    declare
    ---1.声明异常名字
       v_bajie exception;----这跟定义变量一样,变量名字 变量类型
    ----2.给非预定义异常编号为2291的异常绑定一个名字,名字为v_bajie
    --(因为名字都是程序员起的,因此在系统中根本不可能给他编号,,因此要程序员自己给绑定编号。程序员要用20000-20999之间的数)
      pragma exception_init(v_bajie,-2291) ; 
    begin
     insert into score values('129','200','3',2);---添加成绩的时候要考虑主外键关系,129和200都是外检,但是在主表中没有这个数据
      exception
        when v_bajie then
         dbms_output.put_line(sqlcode||' 八戒异常 '||sqlerrm);
    end; 

    -------
    ---第三种异常:自定义异常
    declare
    ---假设描述仓库管理员,当数量小于5的时候产生异常
    v_count number(3):=2; ---声明变量,表示库存数量
     ---1.声明名称
       v_wkex  exception ;
      ---2.将异常名称和异常编号进行绑定。其中,pragma是编译指令,在编译是时候被处理,不在运行的时候执行
      pragma exception_init(v_wkex,-20001);
    begin
     
      ---3.产生异常(引发异常,就是抛出)
      if v_count<5  then
       --  raise v_wkex ;--1.抛出。这种方式不能进行描述
       raise_application_error(-20001,'异常描述,库存不足');---2.进行关联,把名称和描述关联。自己描述的
        end if;
      exception
        ---4.使用名称进行处理
         when v_wkex then
       dbms_output.put_line(sqlcode||'    '||sqlerrm);---此时的编号是自己定义的编号-20001,描述也是自己的描述:异常描述,库存不足
    end;

     

    https://1601844782.iteye.com/blog/2267595

     

     

     

    展开全文
  • 使用 emcc 13 捕获到的一个 plsql 匿名块,分享下. -- ============================================================================================== -- -- This file is generated by EM Database Express. ...

    os: centos 7.6
    db: oracle 19.3
    emcc: 13

    使用 emcc 13 捕获到的一个 plsql 匿名块,分享下.

    -- ============================================================================================== --
    -- This file is generated by EM Database Express.			                          --
    -- The SQL bind variables, if any, will be declared below.                                        --
    -- ============================================================================================== --
    
    DECLARE
    
    	l_last_complete_disk_backup    VARCHAR2(64);
    	l_disk_recovery_window         NUMBER;
    	l_disk_unprotected_data_window NUMBER;
    
    	l_last_complete_sbt_backup     VARCHAR2(64);
    	l_sbt_recovery_window          NUMBER;
    	l_sbt_unprotected_data_window  NUMBER;
    
    	l_zdlra_media_count            NUMBER := 0;
    
    	TYPE data_cursor_type IS REF CURSOR;
    	data_cursor data_cursor_type;
    	
    	v_db_version                   VARCHAR2(10);
    	db_version_121                 CONSTANT VARCHAR2(10) := '12.1.0.0.0';
    	
    BEGIN
    	SELECT LPAD(version, 10, '0') 
    	  INTO v_db_version
    	  FROM v$instance;
    
    	SELECT COUNT (UNIQUE media)
    	INTO l_zdlra_media_count
    	FROM v$backup_piece_details p
    		 ,(SELECT session_key
    				, session_recid
    				, session_stamp
    			FROM (SELECT session_key
    						, session_recid
    						, session_stamp
    					FROM v$rman_backup_job_details
    					WHERE status LIKE 'COMPLETED%'
    					  AND output_device_type IN ('SBT_TAPE', '*')
    					ORDER BY end_time DESC)
    			WHERE rownum = 1) j
    	WHERE j.session_key = p.session_key
    	AND j.session_recid = p.session_recid
    	AND j.session_stamp = p.session_stamp
    	AND p.media like '%Recovery Appliance%';
    
    	BEGIN
    		IF (v_db_version >= db_version_121) THEN
    			EXECUTE IMMEDIATE
    			'SELECT to_char(low_time, ''YYYY-MM-DD HH24:MI:SS'') as last_complete_disk_backup,
    					ROUND((high_time-low_time)*24*60*60, 2) as disk_recovery_window,
    					ROUND((sysdate-high_time)*24*60*60, 2) as disk_unprotected_data_window
    			   FROM v$disk_restore_range rr1
    			  WHERE rr1.high_time = (SELECT max(rr2.high_time)
    					  	   	           FROM v$disk_restore_range rr2
    									  WHERE rr1.db_id = rr2.db_id)'
    			INTO l_last_complete_disk_backup,
    			     l_disk_recovery_window, 
    				 l_disk_unprotected_data_window;
    				 
    		END IF;
    	EXCEPTION
    		WHEN NO_DATA_FOUND THEN
    			l_last_complete_disk_backup := NULL;
    			l_disk_recovery_window := NULL;
    			l_disk_unprotected_data_window := NULL;
    		WHEN OTHERS THEN
    			dbms_output.put_line(SQLERRM);
    	END;
    
    	BEGIN
    		IF (v_db_version >= db_version_121 AND l_zdlra_media_count = 0) THEN
    			EXECUTE IMMEDIATE
    			'SELECT to_char(low_time, ''YYYY-MM-DD HH24:MI:SS'') as last_complete_sbt_backup,
    					ROUND((high_time-low_time)*24*60*60, 2) as sbt_recovery_window,
    					ROUND((sysdate-high_time)*24*60*60, 2) as sbt_unprotected_data_window
    			   FROM v$sbt_restore_range rr1
    			  WHERE rr1.high_time = (SELECT max(rr2.high_time)
    									   FROM v$sbt_restore_range rr2
    									  WHERE rr1.db_id = rr2.db_id)'
    			INTO l_last_complete_sbt_backup,
    			     l_sbt_recovery_window, 
    				 l_sbt_unprotected_data_window;
    				 
    		END IF;
    	EXCEPTION
    		WHEN NO_DATA_FOUND THEN
    			l_last_complete_sbt_backup := NULL;
    			l_sbt_recovery_window := NULL;
    			l_sbt_unprotected_data_window := NULL;
    		WHEN OTHERS THEN
    			dbms_output.put_line(SQLERRM);
    	END;
    
    	OPEN data_cursor FOR
    	SELECT l_last_complete_disk_backup, 
    		   l_disk_recovery_window,
    		   l_disk_unprotected_data_window, 
    		   l_last_complete_sbt_backup,
    		   l_sbt_recovery_window, 
    		   l_sbt_unprotected_data_window
    	FROM dual;
    	
    	:1   := data_cursor;
    END;
    
    

    参考:

    展开全文
  • [简单]plsql匿名块使用简单示例

    千次阅读 2014-06-17 18:18:40
    最近测试需要一批数据,本来使用Java写好了,无奈测试不会用java,只好把代码改为plsql匿名块,由于没有写文件的权限,结果使用dbms_output.put_line打印出来,代码如下:   declare i number := 1; ...
  • /**1.1 pl/sql(数据库编程):是对表中的sql语句的扩展,扩展了过程化的控制1.2 变量:数据类型:varchar2(len),...逻辑控制:循环结构:1.3.pl/sql块:下面相当于一个方法,没有名字,因此叫匿名块。decla...
  • /**1.1 pl/sql(数据库编程):是对表中的sql语句的扩展,扩展了过程化的控制1.2变量:数据类型:varchar2(len),...逻辑控制:循环结构:1.3.pl/sql块:下面相当于一个方法,没有名字,因此叫匿名块。declare(声...
  • PLSQL 匿名块 变量 基本类型 封装类型 封装类型:列类型 行类型 记录类型 表类型 匿名块 语法结构 declare -- 存放变量 begin -- 业务执行 exception -- 抛出异常后处理 end; 示例 让用户输入员工编号 , 在...
  • PLSQL中写匿名块自定义异常处理

    千次阅读 2017-12-28 23:05:14
    之前在开发中遇到一个问题,当在PLSQL中使用SELECT INTO,并且表与表之间的关联关系是1..n的时候,会查询出多个结果,而这时候INTO到某一个变量...添加一个匿名块,进行自定义异常处理,当异常发生时(查不到数据或者其
  • PLSQL嵌套

    千次阅读 2017-07-13 15:25:23
    外部块里嵌套三个匿名块匿名块1:查询部门名称 匿名块2:更改部门地址 匿名块3:处理异常,插入新的部门 总结:外部匿名块包含三个内部匿名块, (1)第一个嵌套块如果找不到数据会直接调到异常no_data_found里...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,522
精华内容 608
关键字:

plsql匿名块