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

 --1,参数   in:表示输入类型,可以省略 ;out:输出类型不能省略----------

 ----案例1:编写一个过程,可以输入雇员的编号,返回该雇员的姓名。
create or replace procedure proc_getEnameByEmpno( v_empno in number,v_ename out varchar2 )
is
begin
--根据输入的编号查找出名字赋值给输出的变量
select ename into v_ename from emp where empno=v_empno;
end;
/
----调用形式------打印输出----前提: set serveroutput on---------
declare
vename varchar2(30);
begin
proc_getEnameByEmpno(9903,vename);
dbms_output.put_line(vename);
end; ----案例2:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。-----------
create or replace procedure proc_getEnameByEmpno( v_empno in number,v_ename out varchar2,v_job out varchar2 )
is
begin
select ename,job into v_ename,v_job from emp where empno=v_empno;
end;
/ ----调用形式---------------------
declare
v_ename varchar2(30);
v_job varchar2(30);
begin
proc_getEnameByEmpno(9903,v_ename,v_job);
dbms_output.put_line('姓名:'||v_ename|| ' 岗位 :'||v_job);
end; ----案例2的。。。。JAVA程序调用--------------------------
/*
try {
Class.forName("oracle.jdbc.OracleDriver");
String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
Connection conn=DriverManager.getConnection(url, "scott", "tiger"); CallableStatement cs=conn.prepareCall("{call proc_getEnameByEmpno(?,?,?)}"); //调用存储过程 cs.setInt(1, 9903);//将第一个参数赋值
//注册操作
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);//将第二个参数注册为ORACLE的varchar 说明是一个out类型的数据
cs.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR);//将第三个参数注册为ORACLE的varchar 说明是一个out类型的数据 cs.execute();//执行存储过程
String ename=cs.getString(2);//取出第二个参数的值
String job=cs.getString(3);//取出第三个参数的值
System.out.println("姓名:"+ename+" , 岗位:"+job); cs.close();
conn.close();
} catch (Exception e) {
}
*/ --2,创建视图-view-------------------------------------------- --2.1、as 用法 : 用在三个地方:视图 、栏目别名 、 包 ------------
/*
create view view_emp
as
select empno,ename,sal from emp;
-------------------------------------------------------------
select ename as 姓名 , sal as 工资 from emp;
*/ --2.2、包:package --游标:cursor------------------------- create or replace package package_emp ---创建包
as
type emp_cursor is ref cursor; ---定义游标
end package_emp; ----案例3:------------------------------
create or replace procedure proc_getResut(v_deptno in number ,v_cursor out package_emp.emp_cursor )
is
begin
open v_cursor for --打开游标,将结果放进去
select * from emp where deptno=v_deptno;
end;
/
/* ------Java 调用包---------------------
try {
Class.forName("oracle.jdbc.OracleDriver");
String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
Connection conn=DriverManager.getConnection(url, "scott", "tiger"); //调用存储过程
CallableStatement cs=conn.prepareCall("{call proc_getResut(?,?)}"); cs.setInt(1, 30);//将第一个参数赋值
//注册操作
//将第二个参数注册为ORACLE的varchar 说明是一个out类型的数据
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
cs.execute();//执行存储过程
//getObject() 取游标所对应的结果集
ResultSet rs=(ResultSet) cs.getObject(2);
while (rs.next()) {
System.out.println(
" 姓名:"+rs.getString("ename")+
" 工资:"+rs.getDouble("sal")+
" 部门号:"+rs.getInt("deptno"));
}
cs.close();
conn.close();
} catch (Exception e) {
}
*/ --3,分页------ 行号 :rownum------------------------ ----案例4:在员工表信息后面加上行号
select e.* , rownum as num from emp e; ----案例5:将 加了行号的结果 看成新的表----查询9至12行的数据
select * from (select e.* ,rownum as num from emp e) where num between 9 and 12 ----案例6:
------(1)建立包 和游标 用来指向结果集
create or replace package pagesPackage
as
type pages_cursor is ref cursor;
end pagesPackage; ------(2.1)建立存储过程
create or replace procedure fenye(
tablename in varchar2,---表名
pagesize in number,-----每页条数
pageNow in number,-----当前页
totalNum out number,----总条数
totalPage out number,-----总页数
result_cursor out pagesPackage.pages_cursor ---查询结果游标
)
is
v_sql varchar2(500);---拼装SQL语句
v_begin number:=(pageNow-1)*pagesize+1;---开始的位置
v_end number:=pageNow*pagesize;---结束的位置
begin
v_sql:='select * from
(select t.*,rownum as num from
(select * from '|| tablename ||') t)
where num between'||v_begin||' and '||v_end;
open result_cursor for v_sql;---将查询的结果存入游标中
v_sql:='select count(*) from '||tablename;---查询总条数的SQL语句
execute immediate v_sql into totalNum;--立即执行 将结果赋值给 toalNum 的到总条数
if mod(totalNum,pagesize)=0 then
totalPage:=totalNum/pagesize;
else
totalPage:=totalNum/pagesize+1;
end if;
end;
/ ----案例7:按照员工编号降序的方式 找到30号部门中 第4到第6条的数据
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 ; ---(2.2) 建立存储过程 增加 where 和 order by 条件
create or replace procedure fenye(
tablename in varchar2,---表名
pagesize in number,-----每页条数
pageNow in number,-----当前页
wheres in varchar2,---查询条件
orderby in varchar2,---排序
totalNum out number,----总条数
totalPage out number,-----总页数
result_cursor out pagesPackage.pages_cursor ---查询结果游标
)
is
v_sql varchar2(500);---拼装SQL语句
v_begin number:=(pageNow-1)*pagesize+1;---开始的位置
v_end number:=pageNow*pagesize;---结束的位置
v_where varchar2(30):='';
v_orderby varchar2(30):='';
begin
if wheres is not null then
v_where:=' where ' ||wheres;
end if; if orderby is not null then
v_orderby:=' order by '||orderby;
end if;
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;
open result_cursor for v_sql;---将查询的结果存入游标中
v_sql:='select count(*) from '||tablename||v_where ;---查询总条数的SQL语句
execute immediate v_sql into totalNum;--立即执行 将结果赋值给 toalNum 的到总条数
if mod(totalNum,pagesize)=0 then
totalPage:=totalNum/pagesize;
else
totalPage:=totalNum/pagesize+1;
end if;
end;
/
/*
try {
Class.forName("oracle.jdbc.OracleDriver");
String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
Connection conn=DriverManager.getConnection(url, "scott", "tiger");
CallableStatement cs=conn.prepareCall("{call fenye(?,?,?,?,?,?,?,?)}"); //调用存储过程
cs.setString(1, "emp");//填入表名
cs.setInt(2, 3);//每页4条
cs.setInt(3, 2);//第三页
cs.setString(4, " deptno=30 ");//where 条件
cs.setString(5, " sal desc ");//排序
cs.registerOutParameter(6, oracle.jdbc.OracleTypes.INTEGER); // 注册 输出总条数
cs.registerOutParameter(7, oracle.jdbc.OracleTypes.INTEGER); //注册 输出总页数
cs.registerOutParameter(8, oracle.jdbc.OracleTypes.CURSOR); //注册 输出结果集
cs.execute();//执行存储过程
System.out.println("总条数:"+cs.getInt(6));
System.out.println("总数页:"+cs.getInt(7));
System.out.println("打印第"+2+"页的数据");
ResultSet rs=(ResultSet) cs.getObject(8); //getObject() 取游标所对应的结果集
while (rs.next()) {
System.out.println( "姓名: "+rs.getString("ename")+" 工资:"+rs.getDouble("sal")+" 部门号:"+rs.getInt("deptno"));
}
cs.close();
conn.close();
} catch (Exception e) {
}
*/

oracle PL、SQL(二)的更多相关文章

  1. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

  2. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  3. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  4. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  5. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  6. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

    原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...

  7. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

  8. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

    原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...

  9. ORACLE PL/SQL编程详解(转)

    原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...

  10. Oracle PL/SQL入门之慨述

    Oracle PL/SQL入门之慨述 一.PL/SQL出现的目的 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,它属于第四代语言( ...

随机推荐

  1. Netty实现时间服务演示样例

    相关知识点: [1] ChannelGroup是一个容纳打开的通道实例的线程安全的集合,方便我们统一施加操作.所以在使用的过程中能够将一些相关的Channel归类为一个有意义的集合.关闭的通道会自己主 ...

  2. (24) java web的struts2框架的使用-action参数自动封装与类型转换

    structs可以对参数进行自动封装,做法也很简单. 一,action参数自动封装: 1,可以直接在action类中,声明public的属性,接受参数. 2,属性也是是private,如果是priva ...

  3. jdbc navcat for mysql 连不上远程服务器的原因(安全组设置)

    如果你权限,防火墙什么都设置好了,但是还是连不上远程数据库, 那么你就必须要看看你的服务器上安全组的设置(很重要) 这里以阿里云为例子(之前用阿里云服务都没设置),现在阿里云的服务器租的时候就要求配置 ...

  4. table 中的thead tbody

    通过thead 下的tr 设置样式以及 tbody 下的 tr 设置样式 避免冲突 <table> <thead> <tr> <td> </td& ...

  5. bzoj3136: [Baltic2013]brunhilda

    这个题为什么会放在数据结构啊 首先因为有决策包容性,对于一个n每次必然选择一个n%p最大的p,令n减n%p 设fi表示i变成0的步数的话,同样我们可以知道f是有单调性的 假如fd能转移到fk,首先d一 ...

  6. 【Maven】pom.xml(1)

    在pom.xml加入: <build> <finalName>oauth2</finalName> <resources> <resource&g ...

  7. Tomcat 系统架构与设计模式之二

    Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析 来自:http://www.ibm.com/developerworks/cn/java/j-lo-tomcat2/ 这个分为两个部分的 ...

  8. [Selenium] 操作新弹出窗口之验证标题和内容

    1)验证标题 package com.learningselenium.normalwebdriver; import static org.junit.Assert.*; import java.u ...

  9. CMake学习记录--list(列表操作命令)

    CMake是一个跨平台的工程管理工具,能方便的把工程转换为vs各个版本.Borland Makefiles.MSSYS Makefiles.NMake Makefiles等工程,对于经常在不同IDE下 ...

  10. Code-NFine:NFine介绍

    ylbtech-Code-NFine:NFine介绍 1. NFine平台介绍返回顶部 1. 使用时请务必保留来源,请勿用于违反我国法律的web平台.如诈骗等非法平台网站.版权最终解释权归<NF ...