zoukankan      html  css  js  c++  java
  • oracle PL、SQL(二)

    oracle PL、SQL(基础知识点二)

      1 --1,参数   in:表示输入类型,可以省略 ;out:输出类型不能省略----------
      2 
      3 ----案例1:编写一个过程,可以输入雇员的编号,返回该雇员的姓名。 
      4 create or replace procedure  proc_getEnameByEmpno( v_empno in number,v_ename out varchar2 )
      5 is
      6 begin
      7 --根据输入的编号查找出名字赋值给输出的变量
      8  select ename into v_ename from emp where empno=v_empno;
      9 end;
     10 /
     11 ----调用形式------打印输出----前提: set serveroutput on---------
     12 declare
     13 vename  varchar2(30);
     14 begin  
     15 proc_getEnameByEmpno(9903,vename);
     16 dbms_output.put_line(vename);  
     17 end;
     18 
     19 
     20 ----案例2:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。-----------
     21 create or replace procedure  proc_getEnameByEmpno( v_empno in number,v_ename out varchar2,v_job out varchar2 )
     22 is
     23 begin
     24  select ename,job into v_ename,v_job from emp where empno=v_empno;
     25 end;
     26 /
     27 
     28 ----调用形式---------------------
     29 declare
     30 v_ename  varchar2(30);
     31 v_job varchar2(30);
     32 begin  
     33 proc_getEnameByEmpno(9903,v_ename,v_job);
     34 dbms_output.put_line('姓名:'||v_ename|| '  岗位 :'||v_job);
     35 end;
     36 
     37 
     38 
     39 ----案例2的。。。。JAVA程序调用--------------------------
     40 /*
     41 try {
     42     Class.forName("oracle.jdbc.OracleDriver");
     43     String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
     44 Connection conn=DriverManager.getConnection(url, "scott", "tiger");
     45 
     46 CallableStatement  cs=conn.prepareCall("{call proc_getEnameByEmpno(?,?,?)}"); //调用存储过程
     47 
     48     cs.setInt(1, 9903);//将第一个参数赋值
     49     //注册操作
     50     cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);//将第二个参数注册为ORACLE的varchar 说明是一个out类型的数据
     51 cs.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR);//将第三个参数注册为ORACLE的varchar 说明是一个out类型的数据
     52 
     53     cs.execute();//执行存储过程
     54     String ename=cs.getString(2);//取出第二个参数的值
     55     String job=cs.getString(3);//取出第三个参数的值
     56 System.out.println("姓名:"+ename+" , 岗位:"+job);
     57 
     58     cs.close();
     59     conn.close();
     60         } catch (Exception e) {
     61         }
     62 */
     63 
     64 
     65 
     66 --2,创建视图-view-------------------------------------------- 
     67 
     68 --2.1、as  用法 :  用在三个地方:视图 、栏目别名 、 包  ------------
     69 /*
     70 create view view_emp 
     71 as 
     72 select empno,ename,sal from emp;
     73 -------------------------------------------------------------
     74 select ename as 姓名 , sal as 工资 from emp;
     75 */
     76 
     77 
     78 --2.2、包:package --游标:cursor-------------------------
     79 
     80 create or replace package package_emp ---创建包
     81 as
     82 type emp_cursor is ref cursor;  ---定义游标
     83 end package_emp;
     84 
     85 
     86 ----案例3:------------------------------
     87 create or replace procedure  proc_getResut(v_deptno  in  number ,v_cursor out package_emp.emp_cursor   )
     88 is
     89 begin
     90    open  v_cursor for --打开游标,将结果放进去
     91    select * from emp where deptno=v_deptno;
     92 end;
     93 /
     94 /* ------Java 调用包---------------------
     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    //调用存储过程
    101 CallableStatement  cs=conn.prepareCall("{call proc_getResut(?,?)}"); 
    102 
    103       cs.setInt(1, 30);//将第一个参数赋值
    104       //注册操作
    105 //将第二个参数注册为ORACLE的varchar 说明是一个out类型的数据
    106      cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);  
    107     cs.execute();//执行存储过程
    108 //getObject() 取游标所对应的结果集      
    109    ResultSet rs=(ResultSet) cs.getObject(2);       
    110 while (rs.next()) {
    111     System.out.println( 
    112 "   姓名:"+rs.getString("ename")+
    113 "  工资:"+rs.getDouble("sal")+
    114 "  部门号:"+rs.getInt("deptno"));
    115     }
    116   cs.close();
    117   conn.close();
    118 } catch (Exception e) {
    119 }
    120 */
    121 
    122 
    123 --3,分页------ 行号 :rownum------------------------
    124 
    125 ----案例4:在员工表信息后面加上行号
    126 select e.* , rownum as num  from emp e;
    127 
    128 ----案例5:将 加了行号的结果 看成新的表----查询9至12行的数据
    129 select * from (select e.*  ,rownum as num  from emp e)  where num between  9  and 12  
    130 
    131 ----案例6:
    132 ------(1)建立包 和游标 用来指向结果集
    133  create or replace package   pagesPackage 
    134  as
    135  type  pages_cursor is ref cursor;
    136  end pagesPackage;
    137  
    138 ------(2.1)建立存储过程
    139 create or replace procedure  fenye(
    140 tablename in varchar2,---表名
    141 pagesize  in number,-----每页条数
    142 pageNow   in number,-----当前页
    143 totalNum     out number,----总条数
    144 totalPage    out number,-----总页数
    145 result_cursor out pagesPackage.pages_cursor ---查询结果游标
    146 )
    147 is
    148 v_sql varchar2(500);---拼装SQL语句
    149 v_begin  number:=(pageNow-1)*pagesize+1;---开始的位置
    150 v_end    number:=pageNow*pagesize;---结束的位置
    151 begin
    152 v_sql:='select * from 
    153 (select t.*,rownum as num from 
    154 (select * from '|| tablename ||') t) 
    155 where num between'||v_begin||' and '||v_end;
    156 open result_cursor for v_sql;---将查询的结果存入游标中
    157 v_sql:='select count(*) from  '||tablename;---查询总条数的SQL语句
    158 execute immediate v_sql into totalNum;--立即执行 将结果赋值给 toalNum  的到总条数
    159   if  mod(totalNum,pagesize)=0 then  
    160      totalPage:=totalNum/pagesize;
    161    else
    162       totalPage:=totalNum/pagesize+1;
    163    end if;
    164 end;
    165 /
    166 
    167 
    168 ----案例7:按照员工编号降序的方式 找到30号部门中  第4到第6条的数据
    169 select *  from (select t.*,rownum as num from (select * from emp where  deptno=30  order by empno desc) t) where  num between  4  and 6 ;
    170 
    171 
    172 ---(2.2) 建立存储过程  增加 where 和  order by 条件
    173 create or replace procedure  fenye(
    174 tablename in varchar2,---表名
    175 pagesize  in number,-----每页条数
    176 pageNow   in number,-----当前页
    177 wheres    in varchar2,---查询条件
    178 orderby   in varchar2,---排序
    179 totalNum     out number,----总条数
    180 totalPage    out number,-----总页数
    181 result_cursor out pagesPackage.pages_cursor ---查询结果游标
    182 )
    183 is
    184 v_sql varchar2(500);---拼装SQL语句
    185 v_begin  number:=(pageNow-1)*pagesize+1;---开始的位置
    186 v_end    number:=pageNow*pagesize;---结束的位置
    187 v_where varchar2(30):='';
    188 v_orderby varchar2(30):='';
    189 begin
    190   if wheres is not null then
    191     v_where:=' where  ' ||wheres;
    192   end if;
    193 
    194    if orderby  is not null then
    195      v_orderby:=' order by  '||orderby;
    196    end if;
    197 v_sql:='select *   from    (select t.*,rownum as num from (select * from '||tablename||' '||v_where||'  '||v_orderby ||') t) where   num between '||v_begin||'  and  '||v_end;
    198 open result_cursor for v_sql;---将查询的结果存入游标中
    199 v_sql:='select count(*) from '||tablename||v_where ;---查询总条数的SQL语句
    200 execute immediate v_sql into totalNum;--立即执行 将结果赋值给 toalNum  的到总条数
    201   if  mod(totalNum,pagesize)=0 then  
    202      totalPage:=totalNum/pagesize;
    203    else
    204       totalPage:=totalNum/pagesize+1;
    205    end if;
    206 end;
    207 /
    208 /*
    209 try {
    210     Class.forName("oracle.jdbc.OracleDriver");
    211 String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    212 Connection conn=DriverManager.getConnection(url, "scott", "tiger");
    213   CallableStatement  cs=conn.prepareCall("{call fenye(?,?,?,?,?,?,?,?)}"); //调用存储过程
    214     cs.setString(1, "emp");//填入表名
    215     cs.setInt(2, 3);//每页4条
    216     cs.setInt(3, 2);//第三页
    217     cs.setString(4, " deptno=30 ");//where 条件
    218     cs.setString(5, " sal  desc  ");//排序
    219     cs.registerOutParameter(6, oracle.jdbc.OracleTypes.INTEGER); // 注册  输出总条数
    220     cs.registerOutParameter(7, oracle.jdbc.OracleTypes.INTEGER); //注册  输出总页数
    221     cs.registerOutParameter(8, oracle.jdbc.OracleTypes.CURSOR);  //注册  输出结果集
    222     cs.execute();//执行存储过程
    223   System.out.println("总条数:"+cs.getInt(6));
    224   System.out.println("总数页:"+cs.getInt(7));
    225   System.out.println("打印第"+2+"页的数据");
    226    ResultSet rs=(ResultSet) cs.getObject(8);    //getObject() 取游标所对应的结果集      
    227    while (rs.next()) {
    228     System.out.println( "姓名:  "+rs.getString("ename")+"  工资:"+rs.getDouble("sal")+"  部门号:"+rs.getInt("deptno"));
    229     }
    230   cs.close();
    231   conn.close();
    232 } catch (Exception e) {
    233 }
    234 */
  • 相关阅读:
    子类调用父类被重写的方法
    Linux下编译出现undefined reference to ‘pthread_create’问题解决
    CRC校验8
    嵌入式C语言查表法
    Static关键字,遇到的问题_1
    java中方法的参数传递机制_一个对象被当作参数传递到一个方法后
    String使用equals和==比较的区别
    如何导入XML数据 (python3.6.6区别于python2 环境)
    0xx_PHP核心01
    PHP_MVC设计模式02
  • 原文地址:https://www.cnblogs.com/bigerf/p/6497654.html
Copyright © 2011-2022 走看看