• oracle PL、SQL(概念)


    .PL/SQL简介。

      Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询Oracle自身过程控制为一体的强大语言,PL/SQL不但支持更多的数据类型,拥有自身的变量申明,赋值语句,而且还有条件,循环等流程控制语句。过程控制结构与SQL数据处理能力无缝的结合形成了强大的编程语言,可以创建过程和函数以及程序包。

    二.优点:

    1,支持SQL

        SQL是访问数据库的标准语言,通过SQL命令,用户可以操纵数据库的数据。

        PL/SQL支持所有的SQL数据操纵命令、游标控制命令、事务控制命令、SQL函数、运算符和伪列。

    2,支持面向对象编程

        PL/SQL支持面向对象的编程,在PL/SQL中可以创建类型,可以对类型进行继承,可以在子程序中重载方法等。

    3,更好的性能

        SQL是非过程语言,只能一条一条的执行,而PL/SQL把一个PL/SQL统一进行编译后执行,同时还可以把编译好的PL/SQL块存储起来,以备重用,减少了应用程序和服务器之间的通信时间,所以PL/SQL是高效而快速的。

    4,可移植性

        使用PL/SQL编写的应用程序语言,可以移植到任何操作平台的ORACLE服务器,同时还可以编写可移植程序库,在不同环境中使用。

    5,安全性

         可以通过存储过程对客户机和服务器之间的应用程序逻辑进行分割,这样可以限制对ORACLE数据库的访问,数据库还可以授权和撤销其他用户的访问权利。

     

      1 --1,PL/SQL--包含 过程、函数、触发器、...
      2      PL--> procedural  language  过程语言
      3  
      4 --查看错误信息能够更详细的指出错所在
      5 show error  
      6 
      7 ----1.1、第一个存储过程,简单定义(相当于一个静态方法)
      8 --(1)创建一个存储过程
      9 create  procedure  proc_holleword
     10 is
     11 begin
     12 dbms_output.put_line('Hello everyone !');  
     13 end;
     14 --(2)显示输出内容
     15 set serveroutput on;
     16 --(3)执行存储过程(二选一)
     17 execute procedurename;
     18 exec    procedurename;
     19 
     20 ---JAVA程序调用存储过程需要用call 
     21 
     22 ----1.2、第二个存储过程(简单案例)
     23 create or replace procedure proc_insertEmp
     24 is
     25 begin
     26  insert into emp values( 9901,'WANGQIANG' ,'CLERK');
     27  insert into emp values( 9902,'JIALIUL' ,'CLERK');
     28  insert into emp values( 9903,'ZHAOQI' ,'CLERK'); 
     29 end;
     30 
     31 --2,编写规范
     32 编写规范n
     33 2.1、注释;
     34 单行注释 --Sql 代码
     35 多行注释 /*...* /来划分
     36 
     37 2.2、标志符号的命名规范
     38 1).当定义变量时,建议用v_作为前缀v_sal
     39 2).当定义常量时,建议用c_作为前缀c_rate
     40 3).当定义游标时,建议用_cursor 作为后缀emp_cursor
     41 4).当定义例外时,建议用e_作为前缀e_error
     42 
     43 
     44 --3,代码块
     45 declare   --定义声明
     46 begin     --程序开始
     47 exception --异常  
     48 end;      ---程序结束
     49 
     50 
     51 ---- 案例 ---从对话框中输入一个员工编号,然后打印出该员工的姓名和工资
     52 declare
     53 v_ename varchar2(30);
     54 v_sal number(8,2);
     55 begin
     56 -- '&'开头的变量 是指从对话框输入值---
     57   select ename,sal into v_ename,v_sal from emp where empno=&eno;
     58   dbms_output.put_line('员工姓名:'||v_ename||'   工资:'||v_sal);
     59 end;
     60 /
     61 
     62 --4,exception 的使用案例,
     63 declare
     64 v_ename varchar2(30);
     65 v_sal  number(8,2);
     66 begin
     67   select ename,sal into v_ename,v_sal from emp where empno=&eno;
     68   dbms_output.put_line('员工姓名:'||v_ename||'   工资:'||v_sal);
     69 exception
     70   when no_data_found then
     71   dbms_output.put_line('该员工号不存在,请重新输入员工号');
     72 end;
     73 /
     74 
     75 
     76 --5,存储过程----带参数---   
     77 
     78 ----根据输入的员工编号,新的姓名,新的工资,去修改姓名和工资--------
     79 create procedure  proc_updateEmp(v_empno number,v_ename varchar2 ,v_sal number)
     80 is
     81 begin
     82 update emp set ename=v_ename  ,sal=v_sal where empno=v_empno;
     83 end;
     84 /
     85 ----执行--(传入参数)------------------
     86 exec  proc_updateEmp(9900,'LAOWANG',10000);
     87 
     88 
     89 
     90 --6,JAVA程序调用 存储过程 -------------------------------
     91 /* 
     92 建立一个Java程序
     93 加入oracle的驱动包ojdbc6.jar【app-administrator-product-11.2.0-dbhome_1-jdbc-lib-ojdbc6.jar】
     94 
     95 try {
     96             Class.forName("oracle.jdbc.OracleDriver");
     97             String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
     98             Connection conn=DriverManager.getConnection(url, "scott", "tiger");
     99 //调用格式
    100             CallableStatement  cs=conn.prepareCall("{call proc_updateEmp(?,?,?)}");
    101               cs.setInt(1, 9903);
    102               cs.setString(2, "阿甘");
    103               cs.setDouble(3, 9988.50);
    104               cs.execute();
    105               cs.close();
    106               conn.close();
    107         } catch (Exception e) {
    108         }
    109 */
    110 
    111 
    112 
    113 --7,条件分支语句-------------------------------------
    114 if  ..  then   ..  end if;
    115 if  ..  then   ..   else  ..  end if;
    116 if  ..  then   ..   elsif .. then    ..  else .. end if ;
    117 
    118 
    119 ----案例问题1:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该员工工资增加10%。
    120 create or replace procedure  proc_updateSalByEname(v_ename varchar2)
    121 is
    122 v_sal emp.sal%type;---取得emp表中的sal栏目的数据类型
    123 begin
    124   select sal into v_sal from emp where ename=v_ename;--根据名字查询
    125   if v_sal<2000  then  
    126     update emp set sal=sal*1.1 where ename=v_ename;
    127    end if; 
    128 end;
    129 /
    130 ----根据传入参数(名字)执行
    131 exec proc_updateSalByEname('SMITH');
    132 
    133 
    134 
    135 ----案例问题2:编写一个过程,可以输入一个雇员名,如果该雇员的补助不是0 就在原来的基础上增加100;如果补助为0 就把补助设为200;
    136 create or replace procedure  proc_updateCommByEname(v_ename varchar2)
    137 is
    138 v_comm emp.comm%type; --声明一个变量,并设置类型为emp中comm的类型
    139 begin
    140 --查询出comm后赋值给一个临时变量
    141     select comm into v_comm   from emp where ename=v_ename;
    142   if  nvl(v_comm,0) >0 then 
    143     update emp set comm=comm+100 where ename =v_ename;  
    144   else
    145     update emp set comm=200  where  ename=v_ename;
    146   end if;
    147 end;
    148 /
    149 
    150 
    151 ----案例问题3:编写一个过程,可以输入一个雇员编号,如果该雇员的职位是PRESIDENT就给他的工资增加1000,如果该雇员的职位是MANAGER 就给他的工资增加500,其它职位的雇员工资增加200 
    152 create or replace procedure  proc_updateSalByJob(v_ename varchar2)
    153 is
    154 v_job emp.job%type;
    155 begin
    156    select job into v_job from emp where ename=v_ename;
    157   if  v_job='PRESIDENT' then 
    158      update emp set  sal=sal+1000 where ename=v_ename;
    159   elsif v_job='MANAGER'  then
    160       update emp set  sal=sal+500 where ename=v_ename;
    161   else 
    162       update emp set  sal=sal+200 where ename=v_ename;
    163   end if;
    164 end;
    165 /
    166 
    167 
    168 --8,loop循环---------------------------------------
    169 loop   ..  exit when ..  num+   end loop;
    170 
    171 
    172 ----案例:建立一张stemp表 id sname  ,请插入100条数据
    173 create table  stemp(id number(8),sname varchar2(20));
    174 
    175 declare
    176 v_num number(8):=1; --声明变量并赋值【 :=  赋值符号】
    177 begin 
    178   loop 
    179        insert into stemp values(v_num, 'sname'||v_num   );
    180   exit when  v_num=100; --条件
    181        v_num:=v_num+1;
    182   end loop;--结束循环
    183 end;
    184 /
    185 
    186 --8.2、while循环--------------------------------
    187 while  ..  loop ..........  num+  end loop;
    188 
    189 ----案例
    190 declare
    191 v_num number(8):=1;
    192 begin 
    193  while v_num<=100  loop 
    194        insert into stemp values(v_num, 'sname'||v_num   );
    195        v_num:=v_num+1;
    196   end loop;
    197 end;
    198 /
    199 
    200 --8.3、for 循环--- reverse:反序-----------------
    201 for v in 区间 loop   ...  end loop; 
    202 for v in reverse 区间 loop  ...  end loop;
    203 
    204 ----案例
    205 begin
    206 for  v_num  in 1..1000  loop
    207     insert into stemp values(v_num, 'sname'||v_num   );
    208 end loop;
    209 end;
    210 /
    211 
    212 ----案例
    213 begin
    214 for  v_num  in  reverse 1..1000  loop
    215     insert into stemp values(v_num, 'sname'||v_num   );
    216 end loop;
    217 end;
    218 /

     

     

  • 相关阅读:
    🍖JS函数
    🍖JS流程控制
    🍖JS运算符介绍
    🍖JS数值类型与字符串类型的内置方法
    多态
    property装饰器
    封装
    组合
    继承&派生 属性查找
    继承与派生
  • 原文地址:https://www.cnblogs.com/bigerf/p/6489171.html
Copyright © 2020-2023  润新知