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)是用来访问关系型数据库一种通用语言,它属于第四代语言( ...
随机推荐
- ajax异步加载问题
使用ajax异步加载数据,在之后需要用到这个数据时,应该将之后的js一并写入ajax函数中,否则后面的js不能找到动态拼接的dom节点. 或者将其封装成方法,在ajax动态加载数据的最后调用该方法.
- 如何用redis做到限制,一个手机号,1分钟内最多发一条,一天内最多10条
需要两个缓存 key名称 phone-busy,缓存1分钟 key名称 phone-send-count,缓存1天,每成功发送一条+1 发送的时候流程如下: 判断phone-busy是否存在,存在直接 ...
- hihocoder #1068 : RMQ-ST算法 ( RMQ算法 O(nlogn)处理 O(1)查询 *【模板】 1)初始化d数组直接读入+计算k值用数学函数log2()==*节约时间 )
#1068 : RMQ-ST算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在美国旅行了相当长的一段时间之后,终于准备要回国啦!而在回国之前,他们准备 ...
- 树状数组(二叉索引树 BIT Fenwick树) *【一维基础模板】(查询区间和+修改更新)
刘汝佳:<训练指南>Page(194) #include <stdio.h> #include <string.h> #include <stdlib.h&g ...
- 异常、Throwable、finally、File类(十九)
1.异常的概述和分类 * A:异常的概述 * 异常就是Java程序在运行过程中出现的错误.* B:异常的分类 * 通过API查看Throwable * Error * 服务器宕机,数据库崩溃等 * E ...
- Html5--6-46 渐变效果
Html5--6-46 渐变效果 学习要点 掌握线性渐变和径向渐变的使用 线性渐变: 属性:linear-gradinet(开始位置 角度,起始颜色,终止颜色 ) 开始位置:渐变开始的位置,属性值可以 ...
- codeforces 665E E. Beautiful Subarrays(trie树)
题目链接: E. Beautiful Subarrays time limit per test 3 seconds memory limit per test 512 megabytes input ...
- [SoapUI] Read data from response , use it to update parameter
import com.eviware.soapui.support.GroovyUtils def groovyUtils = new GroovyUtils( context ) def holde ...
- 【Codeforces 762A】 k-th divisor
[题目链接] 点击打开链接 [算法] 我们知道,一个数的因子是成对出现的,一半小于等于sqrt(N),一半大于sqrt(N),因此,我们可以从 2..sqrt(N)枚举因子 [代码] #include ...
- CentOS 6.5升级到CentOS 7
CentOS7 已经发布了,之前一直想在上面测试一下,一直没有机会,这次终于可以感受一下CentOS7了.一直使用CentOS6.5有一段时间了,但是由于它的内核版本依然停留在2.6.32,所以决定升 ...