java系统采用的SSH以及从C3p0连接池。数据库为oracle 10g
完成目标:
通过java调用oracle存储过程。其中存储过程用到数组参数和事务及临时表。
碰到的问题:
1 更倾向于用会话级临时表。但从一些资料上看,采用连接池的话会出现数据混乱问题。该删的未删。这个未验证。有谁做过,请指点。
2 C3P0貌似不支持JDBC4,故不支持创建oracle数组类型,因而采用原生JDBC代替。基于第二点的话第一点看起来就不是问题了(如果是同一个存储过程的话)
第一步 建立了一个number类型的数组类型
create or replace
type myvarray_list as varray(50) of number;
第二步 创建存储过程使用数组参数
create or replace
procedure test_proc
(
totalCount out NUMBER,
dataType in myvarray_list
)
is
begin
select count(*) into totalCount from test where typeid in
(select column_value from table(cast(dataType as myvarray_list)));
commit;
end test_proc;
java JDBC执行此存储过程
public Long excuteProcByJDBC() throws SQLException {
CallableStatement cs = null;
Connection c=null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
c = java.sql.DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.245:1521:orcl", "test", "test");
List<Object> list = new ArrayList<Object>();
list.add(1);
list.add(2);
Object[] data = list.toArray(new Object[list.size()]);
ArrayDescriptor arrDesc = ArrayDescriptor.createDescriptor("MYVARRAY_LIST", c);
ARRAY a = new ARRAY(arrDesc, c, data);
cs = c.prepareCall("call SHOW_LIST(?,?)");
cs.registerOutParameter(1, OracleTypes.INTEGER);
cs.setArray(2, a);
cs.execute();
Long co = cs.getLong(1);
System.out.println(co);
return co;
} catch (Exception e) {
return 0L;
} finally {
if (cs!=null&&!cs.isClosed()) {
cs.close();
}
if (c!=null&&!c.isClosed()) {
c.close();
}
}
}
要下班了,有时间再写,继续
10g下手工安装全文检索组件(参考盖国强的文章和网上的一些资料)
1. 创建表空间
SQL> create tablespace oratext
2 datafile '+DISKGROUP/dbrac/datafile/oratext01.dbf' size 200m
3 extent management local uniform size 128k
4 ;
Tablespace created
.
2. 创建CTXSYS用户和CTXAPP角色
SQL> connect sys/<PASSWORD> as sysdba
Connected.
SQL> start ?/ctx/admin/catctx.sql ctxsys oratext temp unlock
...creating user CTXSYS
<省略>
Procedure created.
Grant succeeded.
Session altered.
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
Session altered.
3. 以CTXSYS用户登录执行drdefus.sql脚本
SQL> connect ctxsys/ctxsys;
Connected.
SQL> start ?/ctx/admin/defaults/drdefus.sql;
# 如果不执行这个脚本, 会出现如下错误: (10g中也一样)
# ERROR atline 1:
# ORA-29855: error occurred in the execution of ODCIINDEXCREATEroutine
# ORA-20000: Oracle Text error:
# DRG-10700: preference does notexist: CTXSYS.DEFAULT_LEXER
# ORA-06512: at "CTXSYS.DRUE", line 126
# ORA-06512:at "CTXSYS.TEXTINDEXMETHODS", line 54
# ORA-06512: at line 1
Creating lexer preference...
PL/SQL procedure successfully completed.
Creating wordlist preference...
PL/SQL procedure successfully completed.
Creating stoplist...
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
Creating default policy...
PL/SQL procedure successfully completed.
SQL> quit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
4. 查询CTXSYS和CTXAPP的状态
[oracle@dbhost1 admin]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.2.0 - Production on Fri Jan 18 15:35:39 2008
Copyright (c) 1982, 2005, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
SQL> select username,user_id,account_status,lock_date,expiry_date,created,profile from dba_users where username = 'CTXSYS';
USERNAME USER_ID ACCOUNT_STATUS LOCK_DATE EXPIRY_DA CREATED PROFILE
------------------------------ ---------- ----------------------------------------- --------- --------- ------------------------------
CTXSYS 72 OPEN 12-AUG-07 DEFAULT
SQL> select * from dba_roles where role = 'CTXAPP';
ROLE PASSWORD
------------------------------ --------
CTXAPP NO
SQL> quit
赋予需要使用全文索引的账号执行语句的权限
GRANT EXECUTE ON CTX_DDL TO test;
默认采用英文的那个分词需要使用中文分词的需要执行语句设置
EXEC CTX_DDL.create_preference('CN_LEXER','chinese_vgram_lexer');
创建全文索引
使用中文分词的
CREATE INDEX index1 ON tablename(columename) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('LEXER CN_LEXER');
使用英文分词的
create index index1 on tablename(columename)
indextype is ctxsys.context;
SELECT * FROM tablename WHERE CONTAINS(索引列,'索引条件')>0
PS 为了防止出现oracle 全文索引的 drg-50901 错误
可以这样使用语句
SELECT * FROM tablename WHERE CONTAINS(索引列,'/索引条件')>0
在索引条件前加上'/'
卸载Oracle text 组件
SQL> connect SYS/password as SYSDBA
SQL> spool text_deinstall.log
SQL> @?/ctx/admin/catnoctx.sql
SQL> drop procedure sys.validate_context;
SQL> spool off
ORACLE 递归查询
Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。
创建示例表:
CREATE TABLE TBL_TEST
(
ID NUMBER,
NAME VARCHAR2(100 BYTE),
PID NUMBER DEFAULT 0
);
插入测试数据:
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
从Root往树末梢递归
select * from TBL_TEST
start with id=1
connect by prior id = pid
从末梢往树ROOT递归
select * from TBL_TEST
start with id=5
connect by prior pid = id
=====
对于oracle进行简单树查询(递归查询)
DEPTID PAREDEPTID NAME
NUMBER NUMBER CHAR (40 Byte)
部门id 父部门id(所属部门id) 部门名称
通过子节点向根节点追朔.
select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid
select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid
通过根节点遍历子节点.
select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid
select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid
可通过level 关键字查询所在层次.
select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid
select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid
再次复习一下:start with ...connect by 的用法, start with 后面所跟的就是就是递归的种子。
递归的种子也就是递归开始的地方 connect by 后面的"prior" 如果缺省:则只能查询到符合条件的起始行,并不进行递归查询;
connect by prior 后面所放的字段是有关系的,它指明了查询的方向。
练习: 通过子节点获得顶节点
select FIRST_VALUE(deptid) OVER (ORDER BY LEVEL DESC ROWS UNBOUNDED PRECEDING) AS firstdeptid from persons.dept start with deptid=76 connect by prior paredeptid=deptid
分享到:
相关推荐
存储过程是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。创建存储过程的例子如创建一个简单的 MySQL 存储过程,名为...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,日期选择 Java语言开发的简洁实用的日期选择控件,源码文件功能说明: [DateChooser.java] Java 日期选择控件(主体类) [public] ...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
在Oracle数据库中,CLOB(Character Large Object)数据类型用于存储大文本数据,如文章、文档等,最大容量可达4GB或更大。由于其特殊性,处理CLOB字段需要一些特定的方法。以下是一些关键点的详细介绍: 1. **插入...
了解数据库的索引类型(主键索引、唯一索引、普通索引、全文索引等)并合理利用。 - 使用EXPLAIN分析查询计划,找出可能导致全表扫描或者索引未被使用的SQL语句并进行优化。 - 减少嵌套查询,尽量使用JOIN操作合并...
集成过程涉及配置Spring的数据源、定义Elasticsearch的客户端以及编写数据访问对象(DAO)来执行实际的查询和索引操作。 **数据处理** 在数据处理方面,结构化数据如Oracle数据库中的数据,通过Logstash导入到...
然后,配置Compass连接到你的数据源(如MySQL、Oracle等),并指定索引的存储位置。 2. **索引数据**:使用Hibernate的事件监听器或注解,自动将持久化对象转换为Compass文档,建立索引。这一步确保了数据库中的新...
索引过程包括分析、分割和存储文本,以便快速查询。 - **文档与字段**:在Solr中,数据被组织成文档,每个文档包含多个字段,每个字段都有特定的类型,如字符串、数字或日期。 2. **数据导入**: - **Solr Data ...