为一个公司做一个项目,结果他们的项目需要用oracle数据库,所以就用了一个月的时间学习了oracle数据库的使用,并完成了这个项目。在这里总结一下oracle数据库的使用方法。
(一)安装oracle数据库
我的电脑为64位windows操作系统,所以装的64位11.2版本。安装过程中需要注意的有:
- 安装选项:创建和配置数据库
- 系统类:服务器类(我没有选择桌面类,据说服务器类功能更多,为了以防万一,我选择了服务器类)
- 选择实例安装:单实例安装
- 安装类型:高级安装
- 数据库版本:企业版
- Oracle主目录选择:设置用户名和密码。一定要记住,我第一次忘了,又重新安装了一遍,当然当时也出现了很多其他的问题。
- 配置选项:字符集选择中文编码。实例方案:勾选创建具有示例方案的数据库。
(二)安装plsql developer
其实这一步可以不用安装,直接使用oracle developer,但是我后来发现oracle自带的developer占用内存特别大,而且特别容易卡,操作起来不方便,不过我后期都是两个一起穿插用的。
由于plsql developer仅有32位版本,所以需要一些配置。
详见http://jingyan.baidu.com/article/fb48e8be4c7c206e622e1491.html
这里简单总结一下。
首先要下载Instant Client Downloads for Microsoft Windows (32-bit),网址http://www.oracle.com/technetwork/topics/winsoft-085727.html
我现在的最新版本为instantclient-basic-nt-12.1.0.2.0.zip。解压放到oracle product文件夹下。我的为D:\app\cat\product
listener.ora和tnsnames.ora这两个文件需要复制
找到你的PLSQL_Developer安装的目录,在里面新建一个记事本,写入以下类似代码:
@echo off set path=D:\app\cat\product\instantclient_12_1 set ORACLE_HOME=D:\app\cat\product\instantclient_12_1 set TNS_ADMIN=D:\app\cat\product\instantclient_12_1 set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK start plsqldev.exe
(三)使用oracle数据库
我开发这个项目,主要涉及到写存储过程,然后使用jdbc连接池连接数据库,在java里调用存储过程。
1、首先写存储过程。
示例1,返回一个值
create or replace procedure ksh.proc_CGL_getTsknum( p_sumcount out integer, p_unitid in varchar2, p_tasktype in varchar2, p_timetype in number, p_starttime in varchar2, p_endtime in varchar2)is begin if p_timetype=0 then select sum(RWCOUNT) as sumcount into p_sumcount from KSH.jxtj_rw_cgl where UNITID=p_unitid and TASKTYPE=p_tasktype and TIMETYPE=p_timetype and (to_char(TIMESTART,'yyyy') between p_starttime and p_endtime or to_char(TIMESTART,'yyyy')= p_starttime or to_char(TIMESTART,'yyyy')= p_endtime) group by TASKTYPE; end if; if p_timetype=1 then select sum(RWCOUNT) as sumcount into p_sumcount from KSH.jxtj_rw_cgl where UNITID=p_unitid and TASKTYPE=p_tasktype and TIMETYPE=p_timetype and (to_char(TIMESTART,'yyyymm') between p_starttime and p_endtime or to_char(TIMESTART,'yyyymm')=p_starttime or to_char(TIMESTART,'yyyymm')=p_endtime) group by TASKTYPE; end if; if p_timetype=2 then select sum(RWCOUNT) as sumcount into p_sumcount from KSH.jxtj_rw_cgl where UNITID=p_unitid and TASKTYPE=p_tasktype and TIMETYPE=p_timetype and (to_char(TIMESTART,'yyyymmdd') between p_starttime and p_endtime or to_char(TIMESTART,'yyyymmdd')=p_starttime or to_char(TIMESTART,'yyyymmdd')=p_endtime) group by TASKTYPE; end if; if p_timetype=3 then select sum(RWCOUNT) as sumcount into p_sumcount from KSH.jxtj_rw_cgl where UNITID=p_unitid and TASKTYPE=p_tasktype and TIMETYPE=p_timetype and (to_char(TIMESTART,'yyyymmdd') between p_starttime and p_endtime or to_char(TIMESTART,'yyyymmdd')=p_starttime or to_char(TIMESTART,'yyyymmdd')=p_endtime) group by TASKTYPE; end if; if p_timetype=4 then select sum(RWCOUNT) as sumcount into p_sumcount from KSH.jxtj_rw_cgl where UNITID=p_unitid and TASKTYPE=p_tasktype and TIMETYPE=p_timetype and (to_char(TIMESTART,'yyyymmdd hh24') between p_starttime and p_endtime or to_char(TIMESTART,'yyyymmdd hh24')=p_starttime or to_char(TIMESTART,'yyyymmdd hh24')=p_endtime) group by TASKTYPE; end if; --dbms_output.put_line(p_sumcount); end;
示例2,返回一个列表。
首先新建一个包,示例如下:
create or replace package ksh.pkg_return_list as type list_cursor is ref cursor; end;建立存储过程,此存储过程返回两个列表
create or replace procedure p_device_getTypeNum(p_cursor1 out pkg_hardtype_list.list_cursor,p_cursor2 out pkg_hardtype_list.list_cursor) is begin open p_cursor1 for select TYPEID,COUNT(*) as type_number from QJJS.Qjjs_Zb_Harddevice_Inst GROUP BY TYPEID; open p_cursor2 for select TYPEID,COUNT(*) as type_number from QJJS.Qjjs_Zb_Service_Inst GROUP BY TYPEID; end p_device_getTypeNum;
2、存储过程测试
PLSQL developer有一个方便测试的工具。
可以设置输入参数,在DBMS窗口输出。
3、在java里调用部分。
导入java连接池到项目中。结构如下。
其中proxoo.xml配置文件需要修改。
<driver-url>jdbc:oracle:thin:@localhost:orcl</driver-url>
<pre name="code" class="plain" style="color: rgb(51, 51, 51); line-height: 28px; text-align: justify;"><driver-properties> <property name="user" value="sys" /> <property name="password" value="12345" /> </driver-properties>
<?xml version="1.0" encoding="utf-8"?> <something-else-entirely> <use-proxool>xml-websms</use-proxool> <model>1</model> <proxool> <alias>xml-websms</alias> <driver-url>jdbc:oracle:thin:@localhost:orcl</driver-url> <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <driver-properties> <property name="user" value="sys" /> <property name="password" value="12345" /> </driver-properties> <minimum-connection-count>50</minimum-connection-count> <maximum-connection-count>500</maximum-connection-count> <maximum-active-time>360000000</maximum-active-time> <statistics>10s,5m</statistics> <house-keeping-test-sql> select CURRENT_DATE() </house-keeping-test-sql> </proxool> </something-else-entirely>java调用存储过程,示例代码
DBConnect dbc = new DBConnect(); try{ CallableStatement cs = dbc.getConnection().prepareCall("{call ksh.proc_XH_SC_getSCL(?,?,?,?,?)}"); cs.registerOutParameter(1, oracle.jdbc.OracleTypes.INTEGER); cs.setString(2, signalid); cs.setInt(3, timetype); cs.setString(4, starttime); cs.setString(5, endtime); cs.execute(); // ResultSet rs = (ResultSet)cs.getObject(1); int tasknum = cs.getInt(1); cs.close(); return tasknum; }catch(SQLException e) { e.printStackTrace(); return 0; }finally { dbc.close(); }
DBConnect dbc = new DBConnect(); try{ CallableStatement cs = dbc.getConnection().prepareCall("{call ksh.proc_WML_getWMLs(?,?,?,?)}"); cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); cs.setString(2, signalid); cs.setString(3,starttime); cs.setString(4,endtime); cs.execute(); ResultSet rs = (ResultSet)cs.getObject(1); List<SignalQuality> list = new ArrayList<SignalQuality>(); while(rs.next()) { SignalQuality sq = new SignalQuality(); sq.setFetchtime(rs.getString("FETCHTIME")); sq.setWMV(rs.getDouble("WML")); list.add(sq); } cs.close(); rs.close(); return list; }catch(SQLException e) { e.printStackTrace(); return null; }finally { dbc.close(); }