大家好,今天小編來為大家解答以下的問題,關于oracle中trunc函數,trunc函數的功能這個很多人還不知道,現在讓我們一起來看看吧!
oracle數據庫的全文檢索
Oracle全文檢索配置方法:
1.檢查數據庫是否具有全文檢索功能(這是針對已經建成使用的數據庫)
查看用戶中是否存在ctxsys用戶,查詢角色里是否存在ctxapp角色。以上兩個中的1個不滿足(不存在),則說明沒有裝過全文檢索功能。
使用contains函數的時候,若沒有全文檢索則會報錯的。
2.若沒有,則需要手動建立,先建立全文檢索要使用的空間
sqlplus/assysdba--進入控制臺
createtablespaceIdx_ctxsysdatafile'/oradata/sg186fx/ctxsys01.dbfsize10240Mautoextendonnext32Mmaxsize20480M;--創建全文檢索使用的表空間
3.創建全文檢索使用的用戶和角色及相應的包,則需要執行oracle自帶的一個腳本:cd$ORACLE_HOME/ctx/admin/catctx.sql
還是在sqlplus中執行:
@?/ctx/admin/catctx.sqlctxsysIdx_ctxsystempnolock
在執行這個腳本的時候,輸入了幾個參數,第一個參數ctxsys為ctxsys用戶的密碼
第二個參數Idx_ctxsys為ctxsys用戶要使用的表空間
第三個參數temp為ctxsys用戶使用的臨時表空間
第四個參數nolock為ctxsys用戶處于解鎖狀態。
4.創建完成后,要登錄ctxsys用戶
connectctxsys/ctxsys
執行以下腳本:@?/ctx/admin/defaults/drdefus.sql(這是個很重要的腳本,后面創建索引會使用該腳本創建的信息)
5.創建全文索引語法分析器
先要明確使用全文索引的用戶,我要使用全文索引的是sgpm用戶
因此
grantexecuteonctxsys.ctx_ddltosgpmwithgrantoption;
connectsgpm/sgpm
設置語法分析器:
execctx_ddl.drop_preference('chinalexer');execctx_ddl.create_preference('chinalexer','chinese_lexer');
設置詞法屬性:
execctx_ddl.drop_preference('idx_c_store');
beginctx_ddl.create_preference('idx_c_store','BASIC_STORAGE');ctx_ddl.set_attribut('idx_c_store','I_TABLE_CLAUSE','tablespacesIdx_ctxsy');ctx_ddl.set_attribute('idx_c_store','I_INDEX_CLAUSE','tablespaceIdx_ctxsycompress2');end;/
6.創建索引
createindexsgpm.idx_c_cons_nameonsgpm.c_cons(cons_name)indextypeisctxsys.contextparameters('lexerchinalexerstorageidx_c_store');
7.同步索引
variablejobnonumber;begindbms_job.submit(:jobno,'pkg_sp_tools.p_cont_sys_index();',sysdate,'trunc(sysdate)+19/24+1');--執行的是個性化方法。end;/
普通的就是用:
execctx_ddl.sync_index('idx_c_cons_name');
到此,全文檢索創建成功,contains函數就可以正常使用了。
注意:創建的過程中會出現ORA-29879:cannotcreatemultipledomainindexonacolumnlistusingsameindextype,這說明在其他用戶下已經建立了該索引。
如何用oracle實現行列轉換
這個問題我可以回答您。
在oracle中有兩個牛逼的函數,分別是:wmsys.wm_concat和
scott.listagg
,可以實現行列轉換,非常簡單,也是我們日常開發及運維工作中經常用得到的兩個函數。wm_concat是oracle10g推出的一個行列轉換函數,而
scott.listagg
是oracle11g中推出的,兩者作用一樣,但使用上稍有差異。例子:
我們創建一個員工信息表:EMP,表中有三個字段,分別是:
EMPNO:員工編號
NAME:員工姓名
DEPTNO:部門編號
建表SQL:
createtableEMP(empNovarchar(50),namevarchar(30),deptNovarchar2(50));手動插入部分數據:
insertintoEMPvalues('11','ZK01','1');insertintoEMPvalues('12','ZK02','2');insertintoEMPvalues('13','ZK03','3');insertintoEMPvalues('14','ZK04','4');insertintoEMPvalues('15','ZK05','1');insertintoEMPvalues('16','ZK06','2');insertintoEMPvalues('17','ZK07','3');insertintoEMPvalues('18','ZK08','4');insertintoEMPvalues('19','ZK09','1');insertintoEMPvalues('20','ZK10','2');insertintoEMPvalues('21','ZK11','3');insertintoEMPvalues('22','ZK12','4');insertintoEMPvalues('23','ZK13','5');現在我們的需求是要通過SQL查出每一個部門下都有哪些員工,員工要求在一行展示,員工之間用逗號隔開。
1、函數wmsys.wm_concat
用法:wmsys.wm_concat(列名),該函數可以把列值用逗號隔開,在一行顯示。
selectT1.deptno,to_char(wmsys.wm_concat(T1.name))fromempT1groupbyT1.deptnoorderbyT1.deptnoasc結果:已經達我們的預期。
2、函數
scott.listagg
用法:listagg(列名,分隔符)+withingroup(orderby列名)
selectT1.deptno,listagg(T1.name,',')withingroup(orderbyT1.deptno)namefromempT1groupbyT1.deptnoorderbyT1.deptnoasc結果:也達到我們的預期。
感謝聆聽,如果還有什么疑問,請在評論區留言,看到會回復,謝謝!
oracle時間四舍五入怎么做
to_number去掉,沒啥用,日期減法得出的就是數字,現在的問題是不足一分鐘按照一分鐘計算(進位),還是四舍五入,還是舍棄,不足一分鐘不算,用trunc函數,如果四舍五入用樓主的函數,如果想全部進位呢,用ceil函數,樓主可以試試
oracle取兩個時間隨機
1.隨機數包
SELECTDBMS_RANDOM.VALUE
FROMDUAL;
2.在[0..100]范圍內取隨機數
SELECTTRUNC(DBMS_RANDOM.VALUE(0,100))
FROMDUAL;
3.大于字符‘A’的10個字符隨機字符串
SELECTDBMS_RANDOM.STRING('A',10)
FROMDUAL;
4.單個小寫隨機字符
SELECTCHR(ROUND(DBMS_RANDOM.VALUE(97,122)))
FROMDUAL;
5.在過去30分鐘內取隨機時間
SELECT(SYSDATE-1/24/60*30)+DBMS_RANDOM.VALUE(1,1800)/3600/24
FROMDUAL;
sql數據庫中如何獲取“一個月前”和“最近一個月”數據
oracle
獲取一個月前的日期
trunc(add_months(sysdate,-1))
一個月前
select*fromtwheret.date
最近一個月
select*fromtwheret.date>=trunc(add_months(sysdate,-1))
oracle中trunc函數和trunc函數的功能的問題分享結束啦,以上的文章解決了您的問題嗎?歡迎您下次再來哦!