b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

listener.ora Oracle(6)

电脑杂谈  发布时间:2018-02-12 18:03:06  来源:网络整理
 and u.name=jack;
12.plsql(编程语言)
    PL/SQL=传统SQL+结构化流程控制
      好处:1.有结构化的流程控制,可以完成复杂的操作
            2.性能高于sql
   sql:页面输入信息 -- servlet接收数据,调用持久层生成sql - sql语句发送到(DBMS),编译 -- 执行sql。
   plsql:页面输入信息 -- servlet接收数据,调用持久层传入参数(调用存储过程) -  执行sql。
        3.可以对程序中的异常进行处理
        PL/SQL程序由三个块组成。
(1) 声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 
 (2)执行部分: 过程及SQL 语句  , 即程序的主要部分 
 (3)  异常处理部分: 错误处理  
    语法:declare --声明部分,用来定义变量等
           begin--可以理解成java的花括号,编写代码的地方
           exception--处理程序抛出异常
           end;
      
       第一个plsql,在控制台输出HelloWorld
        BEGIN
       --包名.过程(参数)
       dbms_output.put_line(HelloWorld!);
     END;
       定义变量,变量初始值都是null
       常量constant
       declare
          v_id int;
      v_name varchar2(18):=jack;
      v_clazz constant varchar2(5):=j1703;
    begin
       v_id:=100;
       dbms_output.put_line(v_id=||v_id);
       dbms_output.put_line(v_name=||v_name);
    end;
    复合变量(数据类型) record
    1.包含多个内部组件,用于存放多个值
    2.需要先定义类型,然后用该类型可重复定义多个变量
     注意:复合变量属于数据类型,定义时前面要加TYPE
           TYPE是不能直接使用的,使用前需要定义变量引用
      declare 
          type r_tb_clazz is record
          (
            id int,
        code varchar2(18)
           );
            v_clazz r_tb_clazz;
         begin
           v_clazz.id:=1;
           v_clazz.code:=j1703;
      end;
    plsql分两大类:匿名块,带名块 
    begin 
      insert into tb_clazz(id,code) values(3,j1703);
      commit;
    end;
     select
         1.缺少into子句,plsql目的是操作数据,需要定义变量
     2.实际返回行数超过请求行数(只能查询一条数据,如果需要查询
        多条数据,使用游标)
     3.未找到数据
    declare  
        v_id int;
    v_code varchar2(18);
    begin
        select id,code into v_id,v_code from tb_clazz where id=1;
    dbms_output.put_link(v_id ||  || v_code);
    end;
      %type属性:
       定义某个变量的数据类型与已经存在的变量数据类型,
        某个列的数据类型相同。
       declare
          v_id tb_clazzz.id%type;
      v_code tb_clazz.code%type;
    begin
       select id,code into v_id,v_code from tb_clazz where id=1;
         dems_output.put_line(v_id ||  || v_code);
    end;
     %rowtype属性:
        用于定义不确定的类型的变量
    当中表字段的个数和数据类型会在运行中改变,
     程序中的变量也会自动随之改变。
      rt_tb_clazz tb_clazz%rowtype
      rt_tb_clazz 变量和tb_clazz表结构一致,相当于表结构的副本。
     declare
        v_tb_clazz tb_clazz%rowtype;
      begin
         select id,code into v_tb_clazz.id,v_tb_clazz.code from 
           tb_clazz where id=1;
           dbms_output.put_line(v_tb_clazz.id ||  || v_tb_clazz.code);
      end; 
      declare
        v_tb_clazz tb_clazz%rowtype;
      begin
         select * into v_tb_clazz from tb_clalzz where id=1;
         dbms output.put_line(v_tb_clazz.id ||  || v_tb_clazz.code);
         end;
     使用recode
     declare
         type r_tb_clazzz is recode
         (
           id tb_clazz.id%type,
           code tb_clazz.code%type;
          );
          v_tb_clazz r_tb_clazz;
       begin
         select * into v_tb_clazz from tb_clazz where id=1;
         dbms_output.putline(v_tb_clazz.id ||  || v_tb_clazz.code);
       end;
     循环和判断
          if分支
         declare
            v_i number:=10;
              begin 
             if(v_i=10)then
           dbms_output.putline(进入if块);
               end if;
          end;
       
      if else分支
         if ()then...else ...end if
      if elsif else分支
           if() then...elsif()then ...else ...end if
    plsql的循环有三种:loop for while
       loop循环:
           loop
          v_i:=v_i+1;--自增
          exit when v_i=5;
        end loop;
         第二种结束方法:
         loop 
           v_i:=v_i+1;
           if(v_i=5) then
              exit;
          end if;
          end loop;
       for循环
           for v_i in 1..5
       loop
        end loop;
     --重点 项目当中最常用的异常处理
     --实际开发中异常的处理  重点
      create table tb_error(
        id int primary key,
    errorObj varchar2(18),--抛出异常的对象
    sqlcode varchar(50),--异常编码
    sqlerrm varchar(200),--异常信息
    currdate date    --发生时间
      );
       create sequence s_tb_error;
     --重点掌握
     --orale当抛出异常时会将异常编码存储到sqlcode函数,异常信息
     -- 存储到sqlerrm 
       declare
          v_id tb_clazz.id%type;
      v_code tb_clazz.code%type;
       begin
          select id,code into v_id,v_code from tb_clazz;
      dbms_output.put_line(v_id ||  || v_code );
    exception
        when others then
      v_sqlcode :=sqlcode;
      v_sqlerrm:=sqlerrm;
      insert into tb_error(id,errorobj,sqlcode,sqlerrm,currdate)
      values(s_tb_error.nextval,default,v_sqlcode,v_sqlerrm,sysdate);
      commit;
     end;
     --游标:用来提取多行数据
     --oracle打开一个工作区(缓存)来保存多行查询的结果集,
     -- 游标就是给这个工作区命的名称,并能用于处理由多行查询而返回的
记录行
    --隐式游标:默认的DML语句和select语句都有隐式游标
    --显示游标:开发中给工作区命名,并且可以进行操作
    --%isopen  boolean 游标打开,则返回true
    --%nofound  boolean  如果最近抓取没有获得记录,返回true
    --%found  boolean  如果最近抓取获得记录,返回true
    --%rowcount  number 返回到目前为止获取的记录数
    --使用游标的步骤
    --1.定义游标  cursor c_tb_clazz is select * from tb_clazz;
    --2.打开游标  open c_tb_clazz;
    --3.fetch游标  fetch c_tb_clazz into r_tb_clazz;
    -- 游标有个指针,默认指向第一行之上,fetch将指针向下移动,指向第n
      行数据,如果有数据,notfound 返回false,found返回true
       如果到末尾,抓取不到数据,一直显示最后一条数据
    --4.关闭游标 close c_tb_clazz;
    --第一个例子  ;使用游标提取tb_clazz的所有数据
      declare 
           cursor c_tb_clazz is select * from tb_clazz;
       r_tb_clazz tb_clazz%rowtype;
      begin
         open c_tb_clazz;
        loop
           fetch c_tb_clazz into r_tb_clazz;
            dbms_output.put_line(r_tb_clazz.id ||  || r_ tb_clazz.code);
         end loop;
        close c_tb_clazz;
     end;
    --带参数的游标
      第二个例子:使用游标提取tb_clazz的所有数据,同时提取每个班级的
    --注意:传递是形参,形参是不用长度的
     declare 
        --班级游标
    cursor c_tb_clazz is select * from tb_clazz;
     r_tb_clazz tb_clazz%rowtype;
     --学生游标
     cursor c_tb_student(v_clazz_id tb_clazz.id%type)
      is select * from tb_student where clazz_id=v_clazz_id;
         r_tb_student tb_student%rowtype;
      begin
         open c_tb_clazz;
         loop
            fetch c_tb_clazz into r_tb_clazz;
        exit when c_tb_clazz%notfound;
        dbms_output.put_.line(班级 || r_tb_clazz.id ||  || r_tb_clazz.code);
              --当前班级的
          --打开学生游标,参数是班级id
               open c_tb_student(r_tb_clazz.id);
                loop
              fetch c_tb_student into r_tb_student;
              exit when c_tb_student%nofound;
              dbms_output.putline(r_tb_student.id ||  || r_tb_student.name);
           end loop;
               close c_tb_student;
       end loop;
     close c_tb_clazz;
      end;
    --游标for循环
      1.不需要显式打开游标
      2.for循环自动隐式地定义recode变量
      3.不需要使用fetch抓取数据
      4.循环结束后,不需要使用close来关闭游标
       declare
           cursor c_dept is select * from scott.dept;
       begin
            for re_dept in c_dept
          loop
             dbms_output.put_line();
          end loop;
      end;
      --带名块(declare  begin end; 就是匿名块)
      是中命名的PL/SQL块,作为对象保存在里。
        主要四类:
      存储过程:执行特定操作,无返回值
       函数:进行复杂计算,有返回值
        包:逻辑上相关的过程和函数组织在一起
        触发器:事件触发,执行相应操作
         
     过程和函数统称为PL/SQL子程序,过程和函数的唯一区别是函数总向调用者返回数据,
     而过程则不返回数据。 
    --存储过程
    语法:(直接创建)
       procedure name
        [(parameters)形参]
          is
           局部变量声明
         begin
           语句;
          [exception]
         end;
       --建立存储过程,可以被多个程序调用(java或者c++),可以向
       --存储过程传递参数,也可以让存储过程传出参数
       --参数:
       --in:默认,值被传递给子程序。子程序不能改变参数值。
       --out:值被返回调用环境(java或者c++),子程序会改变参数值。
       --调用存储过程
          begin 
            insertclazz();--存储过程名
          end;
       --调用存储过程通过带参数传给存储过程
     --函数与过程语法差异:
         (1)在函数的声明中,必须包含一个带有数据类型的return字句,
       返回值表示的类型,在函数体中必须有一个有效的return语句。
      (2)只能使用in模式参数传入参数值
      --语法:
           function name
       [(parameters)形参]
        return datatype
        is 
          局部变量声明
            begin
          语句;
          return value;
          [exception]
          end;
        
        包类似于C++和Java语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的程序单元归纳到包里
通过使用包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。
      --触发器
      --触发器是当某个事件发生时自动隐式运行。而且,触发器不能
      接收参数。
      --触发器最主要作用:提供更灵活的完整性校验规则。
      --语法:
        trigger name
        after|berfore
        is 
          局部变量声明;
        begin
           语句;
           [exception]
            end;
    --触发器的组成成分:
       触发事件:在任何情况下触发trigger(insert,undate,delete等)
       触发时间:before或者after
       触发器本身:该trigger被触发后的执行体
       触发频率:动作被执行的次数(主要行级触发器)
       
          当行级触发器被触发时,如果要访问插入,更新或删除的记录的值,
      可以使用:
         :new  访问操作完成后的值
         :old 访问操作前的数据
         --特性  insert   update   delete
            :old    Null      有效    有效
          :new    有效      有效     null
      当删除tb_tran的数据时,将数据备份到tb_back:
  
         create  or  replace trigger t_del_tran
           before delete
           on tb_tran
           for  each row
         declare
             begin
             insert into tb_back(id,accout,amount,currdate)
         values(:old.id,:old.Accout,:old.Amount,:old:Currdate);
             end t_del_tran;
            触发器还可以用来维护数据完整性:
          create or replace trigger t_del_clazz
            before delete
        on  tb_clazz
                for each row
      declarer
          begin
              delete from tb_student_course
          where student_id in
          (
             select id from tb_student where clazz_id=:old.id
          );
                  delete from tb_student where clazz_id=:old.id;
    end  t_del_clazz;


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-73999-6.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 孙洙
      孙洙

      美国在反is的问题上本身就是矛盾的

    热点图片
    拼命载入中...