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. [arm驱动]Linux内核开发之阻塞非阻塞IO----轮询操作【转】

    本文转载自:http://7071976.blog.51cto.com/7061976/1392082 <[arm驱动]Linux内核开发之阻塞非阻塞IO----轮询操作>涉及内核驱动函数 ...

  2. POJ3278 Catch That Cow —— BFS

    题目链接:http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total S ...

  3. 获取cookies的简单代码(总结待续)

    Cookie[] cookies = request.getCookies(); Cookie cookie = null; for (int i = 0; i < cookies.length ...

  4. java 简单贪吃蛇

    1. [代码]java 简单程序     跳至 [1] [全屏预览]package com.snake;import java.awt.*;import javax.swing.*;import ja ...

  5. WPF之Binding深入探讨 转载:http://blog.csdn.net/fwj380891124/article/details/8107646

    1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的 ...

  6. linux学习二(小随笔)

    1apt-get 解包命令 tar zxvf ......... 打包命令 tar czvf ......... gz gunzip ........gz gzip    ..........gz l ...

  7. 聊聊Spring中的工厂

    BeanFactory是Spring IOC容器的根接口,定义了Bean工厂的最基础的功能特性,比如根据name获取指定bean等,根据不同用途它的子接口又对它的功能进行细化,比如是否是可列表的,是否 ...

  8. 任务31:课时介绍 & 任务32:Cookie-based认证介绍 &任务33:34课 :AccountController复制过来没有移除[Authorize]标签

    任务31:课时介绍 cookie-based网站这边的认证 jwt基于移动端和前后端分离的项目,jwt有一些独特的优势 jwt在asp.net core中的实现机制,了解实现机制并进行扩展.比如非标准 ...

  9. E20180420-hm

    prior adj. 优先的; 占先的; 在…之前 alignment n. 结盟; 队列,排成直线; 校直,调整; [工] 准线; align  vt. 使成一线,使结盟; 排整齐    vi. 排 ...

  10. 51nod 1092【区间dp】

    思路: 简单的区间dp,从小区间到大区间,随便写. 还有一种是那啥,n-LCS...具体不说了,赶时间)))= =. #include <stdio.h> #include <str ...