oracle全库搜索(oracle数据库实现全文检索)

本文目录
oracle数据库实现全文检索
Oracle全文检索配置方法:
1.检查数据库是否具有全文检索功能(这是针对已经建成使用的数据库)
查看用户中是否存在ctxsys用户,查询角色里是否存在ctxapp角色。以上两个中的1个不满足(不存在),则说明没有装过全文检索功能。
使用contains函数的时候,若没有全文检索则会报错的。
2.若没有,则需要手动建立,先建立全文检索要使用的空间
sqlplus / as sysdba --进入控制台
create tablespace Idx_ctxsys datafile ’/oradata/sg186fx/ctxsys01.dbf size 10240M autoextend on next 32M maxsize 20480M;--创建全文检索使用的表空间
3.创建全文检索使用的用户和角色及相应的包,则需要执行oracle自带的一个脚本:cd $ORACLE_HOME/ctx/admin/catctx.sql
还是在sqlplus中执行:
@?/ctx/admin/catctx.sql ctxsys Idx_ctxsys temp nolock
在执行这个脚本的时候,输入了几个参数,第一个参数ctxsys为ctxsys用户的密码
第二个参数Idx_ctxsys为ctxsys用户要使用的表空间
第三个参数temp为ctxsys用户使用的临时表空间
第四个参数nolock为ctxsys用户处于解锁状态。
4.创建完成后,要登录ctxsys用户
connect ctxsys/ctxsys
执行以下脚本:@?/ctx/admin/defaults/drdefus.sql(这是个很重要的脚本,后面创建索引会使用该脚本创建的信息)
5.创建全文索引语法分析器
先要明确使用全文索引的用户,我要使用全文索引的是sgpm用户
因此
grant execute on ctxsys.ctx_ddl to sgpm with grant option;
connect sgpm/sgpm
设置语法分析器:
exec ctx_ddl.drop_preference(’chinalexer’);
exec ctx_ddl.create_preference(’chinalexer’,’chinese_lexer’);
设置词法属性:
exec ctx_ddl.drop_preference(’idx_c_store’);
begin
ctx_ddl.create_preference(’idx_c_store’,’BASIC_STORAGE’);
ctx_ddl.set_attribut(’idx_c_store’,’I_TABLE_CLAUSE’,’tablespaces Idx_ctxsy’);
ctx_ddl.set_attribute(’idx_c_store’,’I_INDEX_CLAUSE’,’tablespace Idx_ctxsy compress 2’);
end;
/
6.创建索引
create index sgpm.idx_c_cons_name on sgpm.c_cons(cons_name) indextype is ctxsys.context parameters(’lexer chinalexer storage idx_c_store’);
7.同步索引
variable jobno number;
begin
dbms_job.submit(:jobno,’pkg_sp_tools.p_cont_sys_index();’,sysdate,’trunc(sysdate)+19/24+1’); --执行的是个性化方法。
end;
/
普通的就是用:
exec ctx_ddl.sync_index(’idx_c_cons_name’);
到此,全文检索创建成功,contains函数就可以正常使用了。
注意:创建的过程中会出现ORA-29879:cannot create multiple domain index on a column listusing same indextype ,这说明在其他用户下已经建立了该索引。
Oracle中表空间内全局搜索字符串的问题
问一下:
你拿数据来说明一下呗?
你要输入一串字符譬如“abc”
最后你要输出
这个abc所在的表名,字段名,及这个abc吗?
---------补充-------
我先建了一个表
create table data_table
(tablename varchar2(40),
clo varchar2(40),
data varchar2(40),
exe_date date);
四个字段分别是“表名”,“字段名”,“数据”(就是上边我说的abc)和“执行时间”,便于以后查询用的
存储过程我不是直接输出,而是把结果输入到这张表里了,到时候你只要把表里的东西展现就行了,下边是存储过程,功能没测,我怕全库遍历太慢了,但是编译已经通过
内容如下,我会给你加上注释
create or replace procedure p_data
(
in_data in varchar2 --输入的参数,就是上边我输入的abc
)
is
--设置变量,你看名字应该基本都能看懂
v_data varchar2(40);
v_tablename varchar2(40);
v_cloumn_name varchar2(40);
v_date_type varchar2(40);
v_count int;
v_sql varchar2(2000);
--按照如下条件取出游标,其中USERS是表空间,那个地方你可以改
cursor cur_data is
select A.TABLE_NAME,A.COLUMN_NAME from USER_TAB_COLUMNS A,TABS B WHERE A.TABLE_NAME=B.TABLE_NAME
AND B.tablespace_name=’USERS’ ORDER BY A.TABLE_NAME,A.COLUMN_NAME;
begin
open cur_data;
loop
fetch cur_data
into v_tablename,v_cloumn_name;
exit when cur_data%notfound;
--取出游标里的各个变量,拼成动态sql语句,
v_sql:=’select count(*) into v_count from ’||v_tablename||’ where ’||v_cloumn_name||’=’||in_data||’ and counts》0’;
--如果查询出来的条数大于0,则将查询中的表名,字段名和输入的内容插入到我建的那个表中
if v_count》0
then
v_sql:=’insert into data_table values (’||v_tablename||’,’||v_cloumn_name||’,’||in_data||’,sysdate)’;
commit;
end if;
end loop;
close cur_data;
end p_data;
----------补充--------
还有一点要说一下,就是取游标的那个位置,我是从USER_TAB_COLUMNS 里取的,这里就是当前用户所拥有的表
oracle 如何进行全库查询
用pl/sql写,先检索出所有的表select table_name from tabs;然后根据检索的出表名 select * from table_name;.
Oracle进行数据库查询的小技巧
数据查询 是数据库操作中最主要的功能之一;有时候数据库查询性能的好坏 直接关系到数据库的运行效率 关系到数据库的选型 下面笔者不谈大道理 只是对其中对一些平时大家容易忽略的查询小技巧做一些总结 或许大家可能正在为此犯愁呢?
第一个技巧 利用连接符连接多个字段
如在员工基本信息表中 有员工姓名 员工职位 出身日期等等 如果现在视图中这三个字段显示在同一个字段中 并且中间有分割符 如我现在想显示的结果为 经理Victor出身于 年 月 日 这该如何处理呢?其实 这是比较简单的 我们可以在Select查询语句中 利用连接符把这些字段连接起来
如可以这么写查询语句
SELECT员工职位 || ||员工姓名|| 出身于 ||出身日期 as 员工出身信息 FROM 员工基本信息表;
通过这条语句就可以实现如上的需求 也就是说 我们在平时查询中 可以利用||连接符把一些相关的字段连接起来 这在报表视图中非常的有用 如笔者以前在设计图书馆管理系统的时候 在书的基本信息处有图书的出版社 出版序列号等等内容 但是 有时会在打印报表的时候 需要把这些字段合并成一个字段打印 为此 就需要利用这个连接符把这些字段连接起来 而且 利用连接符还可以在字段中间加入一些说明性的文字 以方便大家阅读 如上面我在员工职位与员工姓名之间加入了空格;并且在员工姓名与出身日期之间加入了出身于几个注释性的文字 这些功能看起来比较小 但是却可以大大的提高内容的可读性 这也是我们在数据库设计过程中需要关注的一个内容
总之 令后采用连接符 可以提高我们报表的可读性于灵活性
第二个技巧 取消重复的行
如在人事管理系统中 有员工基本信息基本表 在这张表中 可能会有部门 职位 员工姓名 身份证件号码等字段 若查询这些内容 可能不会有重复的行 但是 我若想知道 在公司内部设置了哪些部门与职位的时候 并且这些部门与职位配置了相关人员 此时 又该如何查询呢?
若我现在直接查询部门表 其可以知道系统中具体设置了哪些部门与职位 但是 很有可能这些部门或者职位由于人事变动的关系 现在已经没有人了 所以 这里查询出来的是所有的部门与职位信息 而不能够保证这个部门或者职位一定有职员存在 也就是说 这不能够满足于我们上面的要求
若我现在直接从员工信息表中查询 虽然可以保证所查询出来的部门与职位信息 一定有员工信息的存在 但是 此时查询出来的部门与职位信息会有重复的行 如采购部门分工合作 可能会有采购采购小组长 此时 在查询出来的部门与职位的信息中 就会有三条重复的记录
所以 以上两种处理方式 都不能够百分之百的满足企业用户的需求 此时 我们其实可以利用一个DISTINCT函数 来消除其中查询出来的重复行
如我们可以利用SELECT DISTINCT 部门信息 职位信息 FROM 员工基本信息表 通过这条加了DISTINCT约束的查询语句 不但可以查询出所有有员工的职位与部门信息 而且 会把重复的记录过滤掉 从而提高可阅读性
所以 在数据库设计过程中 特别是在查询语句的使用中 这个函数特别有用
第三个技巧 勤用WHERE语句
我们都知道 数据库查询效率高不高 是我们评价数据库设计好坏的一个重要标准 毋庸置疑 在数据库查询中勤用Where条件语句 是提高数据库查询性能的一个很重要的手段之一 特别是在设计到比较大的表中查询符合条件的记录过程中 利用WHERE条件语句加以限制 可以大幅度的提高查询的响应速度
如在图书馆管理系统中 现在有人想查询 注册会计师 辅导用书的时候 虽然不在书的类别或者名称中输入 注册会计师 先查询出全部的纪录 然后再一条条的看是否有相关的书籍信息 也是可行的 但是 这么处理的话 一方面系统响应的速度会非常的慢 因为里面记录很多 另一方面 查询的结果看起来也会非常的头疼
其实 我们只需要在查询中加入一些查询的参数 利用Where条件语句加以限制 则即可以提高数据库响应的速度 也可以找出最符合用户需求的数据
另外 我也接触过一些在Oracle数据库上设计的平台型管理软件 他们可以自定义相关的报表 在报表设计中 只要用户在前台设计平台中 选中 大表查询 的话 则这个平台会在生成报表的时候 自动应用Where条件语句 以提高前台系统从数据库查询数据的效率
所以 笔者认为在Oracle数据库系统设计中 要勤于使用Where语句 利用Where语句来提高数据库查询的效率
第四个技巧 灵活使用COUNT函数
在查询处理的时候 COUNT函数可以说是我们应用的比较多的函数之一 如我们有时候需要统计员工的人数 统计图书的种类数的时候 都需要使用到这个函数 不过 这个函数很多人可能会用 但是到灵活应用的地步 还是有一点差距
下面笔者就COUNT函数的一些应用技巧谈谈自己的心得
一是要灵活放置COUNT函数的位置 因为利用COUNT函数统计记录数的时候 是会考虑空行的记录的 如在数据表中一般有序列字段与其它的有意义字段两类 有时候可能序列字段中有内容而其它字段中没有内容 则在利用COUNT函数统计记录数量的时候 会把这个空记录也考虑进去 很明显 则就会发生统计的错误 所以 这个COUNT函数该放在哪个位置上 还是比较讲究的 一般的话 笔者试建议不要放在序列号字段上 而要放在一些关键的实体字段中 如统计员工人数的时候 则就可以放在员工姓名或者编号上等等
二是灵活跟其它函数搭配使用 如在上面的例子中 笔者谈到有时候用户需要知道现在有员工编制的部门与职位有哪一些 我们可以利用DISTINCT函数来找出具体的部门 但是 我现在只想知道有编制的部门与职位具体有多少 此时 我们也可以利用COUNT 与DISTINCT函数结合应用 找出我们所需要的数据 在COUNT函数中 可以指定ALL与DISTINCT选项 默认的情况下 是ALL选项 表示统计所有的行 其中也包括重复的行 而DISTINCT就表示只统计不重复的行 可见 COUNT函数跟其它函数搭配使用的话 可以简化我们的查询语句 提高查询效率
第五个技巧 只查询时必须的字段
有时候 用户不同的查询需求都要用到同一张表 如在员工信息表中包含了很多内容 有时候用户想要知道正式员工有多少;管理层员工有多少;生产线员工又有哪些;或者想知道合同即将到期的员工有哪些 为此 就遇到一个问题 因为这些内容基本上都是在同一张表中 那是在同一个视图中实现 而是根据需求不同 设计不同的视图呢?
若单从技术上考虑 两这都是可以实现的 不会有多大的难度 但是 若是从数据库性能上考虑在 则还是采用不同的视图来实现不同的需求为好
一方面 若从安全方面讲 则可以根据不同的视图来控制相关的访问权限 可见 把视图细化 在权限控制上则会更加的灵活
lishixinzhi/Article/program/Oracle/201311/17049Oracle数据库查询十个小技巧(三)
第八个技巧 慎用Like等通配符
Like关键字 从技术上来说 是一个非常友善的通配符 利用这个通配符 我们可以实现很多模糊查询 如现在在一个人事档案系统中 用户想知道身份证号码以 开头的人事信息 此时 就可以利用Like语句实现 我们可以利用下面的条件语句 实现我们的需求 where 身份证号码 like % 通过这个条件语句 可以查到所有身份证以 开头的号码
但是 当用户在一张大表中采用这个LIKE语句的话 就会发现这个查询语句的运行效率非常的慢 这是什么原因造成的呢?其实 不管是Like 关键字 若采用MATCHES关键字的话 若在大量数据中查找符合条件的记录 则其运行效率也比较低 这主要是其技术特性所造成的
Like与Matches两个关键字 其支持通配符匹配 在有些专业书籍上把这个叫做 正规表达式 不过由于在利用这些关键字查询的时候 数据库系统不是通过索引来查询 而是采用顺序扫描的方式来查询 显然 真是这种技术特性 造成了Like与Mateches两个关键字查询效率的低下 特别是在复杂查询或者大表查询中 用户可以明显感觉到速度比较慢
索引是数据库中的一个重要的数据结构 索引如果利用的合理的话 可以大幅度的提升数据库的查询性能 一般情况下 我们在数据库设计的时候 要充分的利用索引 来提高数据库的运行效率 如对于一些经常需要用到的查询功能 我们需要为没有指定外键的列建立索引;如有查询大表数据 而且又需根据好几个字段的值对其进行排序 也需要在这些列上建立复合索引 特别是在一些应用系统上 往往可以按以下字段的名称 就会对这个字段进行排序 遇到这种情况的话 更加需要在这些频繁进行排序的列上建立索引 以提高重新排序的效率 可见 若在查询的时候 若不能利用索引提高查询效率的话 则就好像跑车失去四轮驱动 速度会大受影响
所以 在数据库系统设计中 要尽量避免采用Like或者Matche关键字 有时候 我们可以利用其他运算符号来代替 如我们可以利用〉(大于)或者《(小于)符号来达到类似的需求 若真的要采用这两个关键字的话 则就需要做好查询优化方面的工作 如不要在基础表中直接利用这个两个关键字 而是通过报表视图 或者临时表等来查询 以减少其不良影响
第九个技巧 利用注释提高查询语句的可读性
在数据库设计中 有一个非常奇怪的现象 一些专家级的数据库设计人员 在写查询语句的时候 非对语句进行详细的注释 有时会 注释的内容大大超过了查询代码本身的篇幅 可是 往往一些入门不久的数据库设计人员 不喜欢写注释语句 这是一个很反常的现象
笔者刚开始接触数据库的时候 也不喜欢写注释语句 觉得写注释语句太浪费时间 但是 一个偶然的事件让笔者改掉了这个坏习惯 那时笔者在观摩一个专家设计数据库的时候 被其密密麻麻的注释惊呆了 看了其代码之后 笔者可以非常轻松的阅读完其所有的代码 不愧为是专家级的人物 看了他的注释之后 在看看自己编写的代码注视 那真是大巫见小巫了 从此之后 笔者也在慢慢培养自己编写代码的习惯 现在笔者在数据库设计的时候 注释已经写的很详细了 至少笔者的同事在看到我的注释之后 不用看源代码就知道笔者要实现的目的了
在编写注释的时候 要注意几个问题
一是注释越详细越好 其实 注释最多牺牲一点磁盘空间 而不会对数据库的性能产生任何不良的影响 相反 注释详细的话 对于后续数据库维护与管理 系统二次开发的等等 都会提供很大的帮助
二是最好采用英文注释 若采用中文注释的话 有时候数据库语言设置不当 在数据库实例安装的时候 不会把中文的注释带过去 所以 作为数据库管理员 要有一定的英语基础 学会利用英语写注释 其实 这也不是很难 只要多看看别人设计的数据库注释 把他们常用的注释复制下来 通过选择合适的进行复制 粘贴就可以完成任务
三是不仅在写查询语句的时候 要做好代码的注释工作 在编写其他代码的时候 如过程 函数等等 也要添加详细的代码 以增加这些复杂功能的可读性
四是注释的内容 一般注释应该包含如下几方面的内容 一是这段代码要实现的功能;二是这段代码需要调用的参数;三是这段代码输出的结果 若是多表关联查询的话 最好能够说明表之间的对应关系 若在查询语句中 直接调用了函数的话 则最好能够注明这个函数的功能;等等 终止一个原则就是 让其他人看到这个注释 不再需要去查询其他的资料 就可以明白这段代码的含义
详细的注释内容 不仅不会降低数据库的运行性能 而且还可以提高数据库的管理与维护的效率;同时也可以加快前台应用程序开发设计的速度 又因为查询语句是系统中利用的最多的语句 也是引用的最频繁的语句 故在查询语句中 更加需要做好相关的注释
第十个技巧 必要的时候 限制用户所使用的行
在使用一些大型管理系统的时候 如ERP系统 我们若查询产品信息 默认的情况下 若记录比较多的时候 其不会把所有的记录都查询出来 如在ERP系统的数据库中 其有 个产品信息 而端子类的产品信息就占据到 个 此时 我们在查询条件中 若产品类别限制为 端子 的话 则其查询出来的结果也可能不是所有的端子 默认显示的话 可能只有前面的 个端子类产品 若用户需要看到全部的产品信息 就需要点击 显示全部 按钮 才可以显示出全部的信息
其实 不管是一些应用程序如此设计 在Oracle数据库中 本身也有这方面的限制 如直接在PL/SQL客户端中查询数据的话 其显示的记录默认情况下也是有限制的 而不会把所有符合条件的语句查询出来 若用户需要查询所有符合条件的记录 则需要点击 继续 按钮 以让数据库显示所有的记录
为什么要做类似的限制呢?这主要就是为了提高数据库查询的性能 我们直接在数据库服务器上 在几百万条记录中查询的话 显示几百条记录跟现实几千条记录所花费的时间明显不同 前者可能只需要 秒即可 而后者可能需要 分钟 所以 为了减少用户等待的时间 我们往往需要限制首次查询默认显示的记录数字
如我们往往在查询语句中 利用top 来让数据库只显示前 条记录 如此的话 可以明显的缩短用户的等待时间 默认情况下 是根据记录创建的时间顺序 来显示记录的 最迟创建的记录 其显示在最前 以此类推
lishixinzhi/Article/program/Oracle/201311/16756
更多文章:
he agreed to help(用need to do sth.和agree to do sth. 造句)
2026年8月31日 01:00
instr函数的返回值(关于vb中InStr函数的一个小问题)
2026年1月26日 22:30
slcp是什么意思(matlab.*和matlab. s有什么区别)
2026年1月3日 12:00
db2数据库update后想恢复(你好,SQL修改错了,修改前没有备份,请问怎么还原到修改前的数据,你知道吗可以给联系方式我请教一下)
2026年9月17日 12:00
assert python用法(python:assert_raises() 怎么用啊,有哪些参数 请说得详细些,先谢谢了!)
2026年7月11日 08:30
this is it歌词好诡异(Turn The Lights On的歌词翻译)
2025年7月26日 02:30
tabletennis安卓游戏(table tennis touch多人游戏时提示game center断开链接怎么解决)
2025年8月8日 17:15
迷你qq头像(2021头像可爱呆萌男生,寻找一些头像小男孩的那种)
2026年2月14日 13:00












