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的问题上本身就是矛盾的