设为首页 收藏本站
查看: 970|回复: 0

[经验分享] java执行数组类型的ORACLE 存储过程相关问题记录,oracle 全文索引

[复制链接]

尚未签到

发表于 2016-7-24 10:10:41 | 显示全部楼层 |阅读模式
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进行简单树查询(递归查询)
DEPTIDPAREDEPTIDNAME
NUMBERNUMBERCHAR (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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-248529-1-1.html 上篇帖子: Oracle XQuery查询、构建和转换XML 下篇帖子: ORACLE 10G OCP 043 笔记(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表