oracle使用方法总结

时间:2022-01-08 22:42:05

    为一个公司做一个项目,结果他们的项目需要用oracle数据库,所以就用了一个月的时间学习了oracle数据库的使用,并完成了这个项目。在这里总结一下oracle数据库的使用方法。

(一)安装oracle数据库

    我的电脑为64位windows操作系统,所以装的64位11.2版本。安装过程中需要注意的有:
  1. 安装选项:创建和配置数据库
  2. 系统类:服务器类(我没有选择桌面类,据说服务器类功能更多,为了以防万一,我选择了服务器类)
  3. 选择实例安装:单实例安装
  4. 安装类型:高级安装
  5. 数据库版本:企业版
  6. Oracle主目录选择:设置用户名和密码。一定要记住,我第一次忘了,又重新安装了一遍,当然当时也出现了很多其他的问题。
  7. 配置选项:字符集选择中文编码。实例方案:勾选创建具有示例方案的数据库。

(二)安装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有一个方便测试的工具。

oracle使用方法总结
    可以设置输入参数,在DBMS窗口输出。

oracle使用方法总结

    3、在java里调用部分。

    导入java连接池到项目中。结构如下。

oracle使用方法总结

其中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();
		}