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 */

 

posted @ 2017-03-03 17:20  Bigerf  阅读(358)  评论(0编辑  收藏  举报