oracle PL、SQL(二)
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(二)的更多相关文章
- [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)
原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
- ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!) 继上篇:ORACLE P ...
- [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)
原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...
- [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)
原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...
- 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航
原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...
- ORACLE PL/SQL编程详解(转)
原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...
- Oracle PL/SQL入门之慨述
Oracle PL/SQL入门之慨述 一.PL/SQL出现的目的 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,它属于第四代语言( ...
随机推荐
- mysql优化----explain的列分析
sql语句优化: : sql语句的时间花在哪儿? 答: 等待时间 , 执行时间. 等待时间:看是不是被锁住了,那就不是语句层面了是服务端层面了,看连接数内存. 执行时间:到底取出多少行,一次性取出1万 ...
- oracle问题系列 : ORA-02290: 违反检查约束条件
报错如下: ### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-022 ...
- RabbitMQ使用简述
RabbitMQ基于AMQP协议. AMQP:是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现 RabbitMQ使用:Exchange(交换机)根据routing-key(路由选择键 ...
- codeforces 459 A. Pashmak and Garden 解题报告
题目链接:http://codeforces.com/problemset/problem/459/A 题目意思:给出两个点的坐标你,问能否判断是一个正方形,能则输出剩下两点的坐标,不能就输出 -1. ...
- codeforces 672D D. Robin Hood(二分)
题目链接: D. Robin Hood time limit per test 1 second memory limit per test 256 megabytes input standard ...
- bzoj2337 XOR和路径——高斯消元
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2337 异或就一位一位考虑: x为到n的概率,解方程组即可: 考虑了n就各种蜜汁错误,所以索性 ...
- apple-touch-startup-image 制作iphone web应用程序的启动画面
为ipad制作web应用程序的启动画面时发现个问题,只能显示竖屏图,横屏图出不来,如下: 首先页面头部里要加入(这个是APP启动画面图片,如果不设置,启动画面就是白屏,图片像素就是手机全屏的像素) & ...
- 用 SDL2 加载PNG平铺背景并显示前景
上一篇中加载的是BMP,这次可以引用 SDL2_image.lib,加载更多格式的图像. LoadImage函数做了改动,区别在于不用将surface转换成texture了. 环境:SDL2 + VC ...
- hibernate的基础学习
工具类: public class H3Util { private static final SessionFactory sessionFactory = buildSessionFactory( ...
- Epoll简介以及例子
第一部分:Epoll简介 问题 : Select,Poll和Epoll的区别 答案 : Epoll和Select的区别 1. 遍历方式的区别.select判断是否有事件发生是遍历的,而epoll是事 ...