- 浏览: 802421 次
- 性别:
- 来自: 西安
-
文章分类
- 全部博客 (307)
- struts (8)
- hibernate (3)
- spring (32)
- opensourceproject (12)
- javaScript (9)
- primeton EOS (2)
- journey of heart (10)
- Design pattern (6)
- ejb (17)
- point (37)
- Linux&Unix (22)
- ibatis (10)
- AJAX (6)
- DB (26)
- Protocol (6)
- chart (4)
- web server (11)
- webservice (7)
- integration (3)
- tuxedo (5)
- ext (4)
- android (1)
- c/c++ (12)
- JVM (1)
- paginationFrame (2)
- code (2)
- report (1)
- High-performance web (1)
- svn (1)
- JQuery (1)
- workDaily (2)
- cloud (16)
- Python (8)
- English (2)
- shell (5)
- googleCode (1)
- nio (1)
- hyper-v (1)
- debug (3)
- vbs (2)
- openstack (3)
- K8S (1)
- Mesos (0)
- Spark (0)
- Marathon (0)
最新评论
-
钱图大展:
chao2751021 写道lib包哪里去下载,找不到
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
钱图大展:
无法下载
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
fm395728572:
shell脚本中用到了环境变量,但是获取不到,例如脚本中有一句 ...
ganymed-ssh2 for Java -
liuhanjiang:
我qq147229234
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
liuhanjiang:
博主 我利用您提供的方法实现博文中介绍的clickstream ...
大型网站用户行为记录的一个实现--基于clickStream(第一部分)
存储过程创建语法:
create or replace procedure 存储过程名(param1 in type,param2 out type)
as
变量1 类型(值范围);
变量2 类型(值范围);
Begin
Select count(*) into 变量1 from 表A where列名=param1;
If (判断条件) then
Select 列名 into 变量2 from 表A where列名=param1;
Dbms_output。Put_line(‘打印信息’);
Elsif (判断条件) then
Dbms_output。Put_line(‘打印信息’);
Else
Raise 异常名(NO_DATA_FOUND);
End if;
Exception
When others then
Rollback;
End;
注意事项:
1, 存储过程参数不带取值范围,in表示传入,out表示输出
2, 变量带取值范围,后面接分号
3, 在判断语句前最好先用count(*)函数判断是否存在该条操作记录
4, 用select 。。。into。。。给变量赋值
5, 在代码中抛异常用 raise+异常名
以命名的异常
命名的系统异常 产生原因
ACCESS_INTO_NULL 未定义对象
CASE_NOT_FOUND CASE 中若未包含相应的 WHEN ,并且没有设置
ELSE 时
COLLECTION_IS_NULL 集合元素未初始化
CURSER_ALREADY_OPEN 游标已经打开
DUP_VAL_ON_INDEX 唯一索引对应的列上有重复的值
INVALID_CURSOR 在不合法的游标上进行操作
INVALID_NUMBER 内嵌的 SQL 语句不能将字符转换为数字
NO_DATA_FOUND 使用 select into 未返回行,或应用索引表未初始化的
TOO_MANY_ROWS 执行 select into 时,结果集超过一行
ZERO_DIVIDE 除数为 0
SUBSCRIPT_BEYOND_COUNT 元素下标超过嵌套表或 VARRAY 的最大值
SUBSCRIPT_OUTSIDE_LIMIT 使用嵌套表或 VARRAY 时,将下标指定为负数
VALUE_ERROR 赋值时,变量长度不足以容纳实际数据
LOGIN_DENIED PL/SQL 应用程序连接到 oracle 数据库时,提供了不
正确的用户名或密码
NOT_LOGGED_ON PL/SQL 应用程序在没有连接 oralce 数据库的情况下
访问数据
PROGRAM_ERROR PL/SQL 内部问题,可能需要重装数据字典& pl./SQL
系统包
ROWTYPE_MISMATCH 宿主游标变量与 PL/SQL 游标变量的返回类型不兼容
SELF_IS_NULL 使用对象类型时,在 null 对象上调用对象方法
STORAGE_ERROR 运行 PL/SQL 时,超出内存空间
SYS_INVALID_ID 无效的 ROWID 字符串
TIMEOUT_ON_RESOURCE Oracle 在等待资源时超时
实例学习:
1. 建立一个存储过程 一个入参,一个出参 create or replace procedure test_xg_p5(a in number,x out varchar2) is 在sql 模式下运行 以上存储过程 调用方式 3种 a. 在 windows 客户端 使用PLSQL Developer 的 command模式 执行
begin
if a=0 then
select count(1) into x from log;
else
select count(1) into x from id_table;
end if;
exception
when others then
ROLLBACK;
end test_xg_p5;
b.在安装 oracle 的linux 客户机上使用 oracle 用户在控制台 使用sqlpuls 执行存贮过程 图 pd2
c. 使用java客户端
/*掉oracle存储过程 返回一个 数字*/
Connection conn=null;
CallableStatement proc = null;
conn= OracleJDBCTest.getConn();
proc = conn.prepareCall("{call test_xg_p5(?,?)}");
//传递0 返回1 传递1 返回106 两个表的记录数目不同
proc.setInt(1,1);
proc.registerOutParameter(2, Types.VARCHAR);
proc.execute();
System.out.println(proc.getString(2));
conn.close();
2 建立一个存储过程 返回一个结果集合
步骤:
第一步: 首先建立一个包,定义游标类型
CREATE OR REPLACE PACKAGE TYPES AS
TYPE BJ_CURSOR IS REF CURSOR;
END;
第二步: 建立 中间存贮过程过程 返回游标
CREATE OR REPLACE PROCEDURE BJ_TEST_PROC
(
V_TEMP OUT TYPES.BJ_CURSOR,
PID IN VARCHAR
)
AS
BEGIN
OPEN V_TEMP FOR select * from id_table t where t.quantity=PID;
END BJ_TEST_PROC;
调用方式2 种
a. 在sqlplus 控制台下 (貌似不能在 commond 模式下执行,不然var a refcursor会报错)
var a refcursor
call BJ_TEST_PROC(:a,1);
print a;
图 pb3
b. 使用java客户端
首先看下表名 为id_table的表结构
图pd4
调用代码
Connection conn=null;
CallableStatement proc = null;
conn= OracleJDBCTest.getConn();
proc = conn.prepareCall("{call BJ_TEST_PROC(?,?)}");
proc.setString(2,"1");
proc.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
proc.execute();
ResultSet rs = (ResultSet) proc.getObject(1);
while (rs.next()) {
System.out.println(rs.getString("TABLE_NAME"));
}
conn.close();
一个在eusp 项目中自己写的存储过程 以及 客户端调用代码
功能:给学校初始化 客户管理菜单
create or replace procedure pr_initCustManageMenu(flag in varchar2,sysOrg in varchar2,outPut out number) is
begin
-- 增加菜单 flag=0,删除菜单 flag=1
if flag='0' then
insert into xs_menu (menu_name,menu_type,menu_icon,SYS_ORGANIZATION) values('客户管理','系统类','customer.gif',sysOrg);
insert into xs_menu (upper_menu_id,menu_name,menu_type,tech_type,SYS_ORGANIZATION)
select menu_id,'教职工管理','系统类','tecOrgCustPanel',sysOrg
from XS_MENU where XS_MENU.MENU_NAME='客户管理' and SYS_ORGANIZATION=sysOrg;
insert into xs_menu (upper_menu_id,menu_name,menu_type,tech_type,SYS_ORGANIZATION)
select menu_id,'临时人员管理','系统类','worOrgCustPanel',sysOrg
from XS_MENU where XS_MENU.MENU_NAME='客户管理' and SYS_ORGANIZATION=sysOrg;
insert into xs_menu (upper_menu_id,menu_name,menu_type,tech_type,SYS_ORGANIZATION)
select menu_id,'学生管理','系统类','stuOrgCustPanel',sysOrg
from XS_MENU where XS_MENU.MENU_NAME='客户管理' and SYS_ORGANIZATION=sysOrg;
insert into xs_menu (upper_menu_id,menu_name,menu_type,tech_type,SYS_ORGANIZATION)
select menu_id,'营业组管理','系统类','shoOrgCustPanel',sysOrg
from XS_MENU where XS_MENU.MENU_NAME='客户管理' and SYS_ORGANIZATION=sysOrg;
insert into xs_menu (upper_menu_id,menu_name,menu_type,tech_type,SYS_ORGANIZATION)
select menu_id,'设备管理','系统类','xxTermPanel',sysOrg
from XS_MENU where XS_MENU.MENU_NAME='客户管理' and SYS_ORGANIZATION=sysOrg;
--- 添加权限
insert into XS_LEVEL_SYSMODULE(MENU_ID,ROLE_ID)
select m.menu_id,(select role_id from xs_role where name='ROLE_admin' and SYS_ORGANIZATION=sysOrg)
from xs_menu m where m.sys_organization=sysOrg start with
m.menu_id=(select m.menu_id from xs_menu m where m.menu_name='客户管理' and m.sys_organization=sysOrg)
connect by prior m.menu_id = m.upper_menu_id;
-- 添加成功返回
outPut:=0;
commit;
else
-- 删除权限
delete from XS_LEVEL_SYSMODULE ls where exists
(
select menu_id from (
(select m.menu_id from xs_menu m where m.sys_organization=sysOrg start with
m.menu_id=(select m.menu_id from xs_menu m where m.menu_name='客户管理' and m.sys_organization=sysOrg)
connect by prior m.menu_id = m.upper_menu_id)
) a where a.menu_id=ls.menu_id);
-- 删除菜单
delete from xs_menu ls where exists
(
select menu_id from (
(select m.menu_id from xs_menu m where m.sys_organization=sysOrg start with
m.menu_id=(select m.menu_id from xs_menu m where m.menu_name='客户管理' and m.sys_organization=sysOrg)
connect by prior m.menu_id = m.upper_menu_id)
) a where a.menu_id=ls.menu_id and ls.sys_organization=sysOrg);
--删除成功返回
outPut:=0;
commit;
end if;
exception
when others then
ROLLBACK;
--失败
outPut:=1;
end pr_initCustManageMenu;
客户端调用代码:使用了spring的 JdbcDaoSupport
@Override
public int initCustManageMenu(final String flag, final String sysOrg) {
String sql = "{call pr_initCustManageMenu(?,?,?)}";
Object obj=getJdbcTemplate().execute(sql,new CallableStatementCallback(){
public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
cs.setString(1,flag);
cs.setString(2,sysOrg);
cs.registerOutParameter(3,Types.INTEGER);
cs.execute();
return cs.getInt(3);
}
});
return Integer.valueOf(obj.toString());
}
发表评论
-
使用shell+procedure构造测试数据
2012-01-17 15:27 1214more test.sh #!/usr/bin/bash ... -
porting oracle to mysql
2011-09-02 08:09 1346很久都没写blog了,忙着结婚,忙着和媳妇度过在西安为数不 ... -
ORACLE+UNIX易错问题集锦
2011-02-26 23:31 1563很好的文章! -
Oracle 常用SQL技巧收藏(转载)
2010-11-19 12:53 12611. SELECT子句中避免使用 “*” 当你想 ... -
oracle trigger 的使用
2010-08-29 17:14 16171.目的: 网厅前台订单查询中只查到net ... -
记录一次 mysql 无法启动 的问题
2010-05-10 14:10 1720早上看了下我的mysql 服务器,发现无法启动了 ... -
Oracle Sql优化笔记
2010-05-05 10:33 1281基本的Sql编写注意事项 尽量少用IN操作符,基本上所有 ... -
oracle恢复误删除数据,解除锁定的等sql语句
2010-04-27 12:54 21480. (SELECT SID,SERIAL# FROM ... -
Oracle数据库中分区表的操作方法
2010-04-15 08:34 1211在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以 ... -
谈谈怎么实现Oracle数据库分区表
2010-04-15 08:13 2086谈谈怎么实现Oracle数据库分区表 Oracle ... -
使用 exp, imp命令 导出导入数据
2010-04-09 00:08 1607目标 : 我是吧64上的数据用netbnew用户( ... -
SQL注入攻击例子及Statement和PreparedStatement的比较
2010-03-19 22:56 5644SQL injection is a technique th ... -
mysql explain语法解释
2010-02-01 15:13 1323explain显示了mysql如 何使用索引来处理select ... -
Redhad4 下安装mysql5
2010-01-25 21:18 2126一开始是下载的是2进制的包,按照网上的教 ... -
redhat5 下安装 oracle10g
2010-01-23 05:36 2658工作中使用的一直是oracle 数据库 从来 ... -
oracle 小技巧
2009-12-24 21:58 10281.启动和关闭数据库 举例:我们64 测试环境 ... -
mysql 小技巧
2009-12-24 21:45 10961. mysql 看所有表的信息 select * ... -
解决远程连接mysql错误1130代码的方法
2009-12-22 21:27 8865解决远程连接mysql错误 ... -
powerdesigner 基本操作
2009-11-19 22:30 14031.将物理模型 pdm文件 导成数据字典 ... -
oracle 分页例子
2009-10-28 08:44 1453select tp_card_num,serial,resul ...
相关推荐
Oracle 存储过程学习经典入门 Oracle 存储过程学习目录是 Oracle 存储过程学习的基础知识,了解 Oracle 存储过程的基本语法、基础知识和一些常见问题的解决方法是非常重要的。本文将从 Oracle 存储过程的基础知识...
这个"ORACLE存储过程学习源码"集合包含了从基础到高级的30个示例,是学习和掌握Oracle存储过程的理想资源。下面,我们将深入探讨存储过程的基本概念、结构、类型,以及如何通过这些源码进行学习。 1. **存储过程的...
oracle存储过程学习
存储过程学习、个人随笔、基本语法和流程控制。仅供参考
快速学习函数创建和练习。 创建函数、存储过程、创建过程、调用存储过程、AUTHID、PRAGMA AUTONOMOUS_TRANSACTION、开发存储过程步骤、删除过程和函数、过程与函数的比较
这个"Oracle存储过程学习经典(实例)"资源显然是为初学者设计的,旨在帮助他们掌握如何创建、执行和管理存储过程。 存储过程在数据库管理中扮演着关键角色,它可以提升系统的性能,通过减少网络流量和提供预编译的...
在本学习资料中,你将深入理解Oracle存储过程的创建、调用、调试以及优化等多个方面。 1. **存储过程的创建**: Oracle存储过程通过`CREATE PROCEDURE`语句来定义。你可以指定输入参数、输出参数、输入输出参数,...
在"Oracle存储过程学习"这个主题中,我们可以深入探讨以下几个关键知识点: 1. **定义与创建**: 存储过程通过`CREATE PROCEDURE`语句创建。例如: ```sql CREATE OR REPLACE PROCEDURE proc_name (param1 ...
在学习Oracle存储过程时,结合详细的文档如《oracle存储过程超详细使用手册.doc》和实例资料《oracle存储过程学习经典[语法+实例+调用].doc》会非常有帮助。这些文档通常会涵盖基础语法、实例解析、调用方法、异常...
oracle存储过程学习经典[语法+实例+调用].doc
oracle 存储过程学习经典,主要适合初学oracle存储过程的.
oracle存储过程学习经典[语法+实例+调用].pdf
在本篇“Oracle存储过程学习笔记(四)”中,我们将深入探讨存储过程的概念、创建、执行以及在实际应用中的优势。 1. **存储过程的概念** 存储过程是一组预先编译的SQL和PL/SQL语句,存储在数据库服务器中。当需要...
在这个“Oracle存储过程学习实例文档”中,我们将深入探讨如何创建存储过程,以及如何在Java应用程序中调用这些过程。 1. **创建Oracle存储过程** 创建存储过程的基本语法如下: ```sql CREATE OR REPLACE ...
1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字
这个压缩包文件"oracle存储过程学习经典入门.rar_oracle"显然包含了帮助初学者理解并掌握Oracle存储过程的基础教程。下面将详细讲解Oracle存储过程的相关知识点。 首先,存储过程是预编译的SQL语句集合,它在数据库...
该文档比较详细地介绍了Oracle存储过程,有例子