Oracle中的LONG類型有兩種:
峰峰礦網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)公司成立于2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
LONG文本類型,能存儲2GB的文本。與VARCHAR2或CHAR類型一樣,存儲在LONG類型中的文本要進(jìn)行字符集轉(zhuǎn)換。
LONG RAW類型,能存儲2GB的原始二進(jìn)制數(shù)據(jù)(不用進(jìn)行字符集轉(zhuǎn)換的數(shù)據(jù))。
在此并不解釋如何使用LONG類型,而是會解釋為什么你不希望在應(yīng)用中使用LONG(或LONG RAW)類型。首先要注意的是,Oracle文檔在如何處理LONG類型方面描述得很明確。Oracle SQL Reference手冊指出:
不要創(chuàng)建帶LONG列的表,而應(yīng)該使用LOB列(CLOB、NCLOB、BLOB)。支持LONG列只是為了保證向后兼容性。
沒有內(nèi)置的函數(shù)處理,得自己寫處理函數(shù),可以參考:網(wǎng)頁鏈接
創(chuàng)建測試表:
create?table?test
(score?varchar2(100));
insert?into?test?values?('50,60,70');
insert?into?test?values?('60,70,80');
commit;
執(zhí)行:
select?wm_concat(case
when?t.score??60?then
'不及格'
else
'及格'
end)?score
from?(select?a.rowid?rd,?REGEXP_SUBSTR(a.score,?'[^,]+',?1,?l)?score
from?test?a,?(SELECT?LEVEL?l?FROM?DUAL?CONNECT?BY?LEVEL?=?100)?b
WHERE?l?=?LENGTH(a.score)?-?LENGTH(REPLACE(score,?','))?+?1)?t
group?by?t.rd
結(jié)果:
在oracle中提供了許多內(nèi)置的程序包,它們用于擴(kuò)展數(shù)據(jù)庫的功能。在開發(fā)應(yīng)用程序時,可以利用這些程序包。數(shù)據(jù)庫用戶sys擁有oracle提供的所有程序包。他們被定義為共有同義詞,并將執(zhí)行權(quán)限授予了public用戶組,任何用戶都可以訪問它們。其中DBMS_XMLQUERY包用于將查詢結(jié)果轉(zhuǎn)換為XML格式,DBMS_LOB程序包包含雨處理大型對象的過程和函數(shù)。下面我們看一下DBMS_XMLQUERY和DBMS_LOB的用法:
SQL DECLARE
result CLOB;
xmlstr VARCHAR2(32767);
line VARCHAR2(2000);
line_no INTEGER :=1;
BEGIN
result :=DBMS_XMLQUERY.getXml('select empno,empname from employee');
xmlstr :=DBMS_LOB.SUBSTR(result,32767);
LOOP
EXIT WHEN xmlstr IS NULL;
line :=SUBSTR(xmlstr,1,INSTR(xmlstr,CHR(10)-1));
DBMS_OUTPUT.PUT_LINE(line_no || ':' || line);
xmlstr :=SUBSTR(xmlstr,INSTR(xmlstr,CHR(10)+1));
line_no :=line_no + 1;
END LOOP;
END;
在上面的例子中我們聲明了一個CLOB數(shù)據(jù)類型的result變量,以及VARCHAR2類型的xmlstr和line兩個變量。其中,getXml函數(shù)用于將查詢結(jié)果轉(zhuǎn)換為XML格式,SUBSTR函數(shù)檢索子字符串,32767值指定要從CLOB數(shù)據(jù)類型讀取的最大字節(jié)數(shù)。檢索到的字符串存儲xmlstr變量中。LOOP塊循環(huán)執(zhí)行,每次從xmlstr中讀取一行。INSTR函數(shù)返回一個字符串在另一個字符串首次出現(xiàn)的位置。在此,該函數(shù)返回?fù)Q行符在字符串中的位置,直到遇到下一行。
大家覺得例子的結(jié)果能不能讀出我們預(yù)期的結(jié)果呢?試試就知道了?。。?/p>
結(jié)果如下:
?xml version='1.0'?
ROWSET
ROW num="1"
EMPNOE001/EMPNO
EMPNAMEJane/EMPNAME
/ROW
ROW num="2"
EMPNOE002/EMPNO
EMPNAMEJohn/EMPNAME
/ROW
ROW num="3"
EMPNOE003/EMPNO
EMPNAMEJoe/EMPNAME
/ROW
/ROWSET
select 姓名,sum(decode(考試時間,'2014/4',數(shù)學(xué)成績,0)) as 201404數(shù)學(xué)成績,
sum(decode(考試時間,'2014/4',英語成績,0)) as 201404英語成績,
sum(decode(考試時間,'2014/5,數(shù)學(xué)成績,0)) as 201405數(shù)學(xué)成績,
sum(decode(考試時間,'2014/5,英語成績,0)) as 201405英語成績,
sum(decode(考試時間,'2014/6,數(shù)學(xué)成績,0)) as 201406數(shù)學(xué)成績,
sum(decode(考試時間,'2014/6,英語成績,0)) as 201406英語成績
group by 姓名
通常這種問題都是用分組函數(shù)和decode來解決的,網(wǎng)上還有不少這方面的例子,你可以查一下。
1。select * from v$nls_parameters 查詢nls的參數(shù),獲得數(shù)據(jù)庫服務(wù)器端的字符編碼 NLS_LANGUAGE NLS_CHARACTERSET 2。修改本地環(huán)境變量,設(shè)置 NLS_LANG = SIMPLIFIED CHINESE.ZHS16GBK //這個是我們的數(shù)據(jù)庫字符編碼 NLS_LANG格式: NLS_LANG = language_territory.charset 有三個組成部分(語言、地域和字符集),每個成分控制了NLS子集的特性。其中:language 指定服務(wù)器消息的語言。 territory 指定服務(wù)器的日期和數(shù)字格式。 charset 指定字符集 需要保證要設(shè)置客戶端字符集與服務(wù)器端字符集一致
當(dāng)我們面對一個數(shù)據(jù)表,且表結(jié)構(gòu)為:
span style="font-size:18px;"create table R_ExtSubFina_Month(rptdate date not null,rptname varchar2(10) not null,rptNum varchar2(10) not null,SaleMoney number(18,3),proMoney number(18,3),,Status varchar2(2) );/span
現(xiàn)在表中已經(jīng)存在的數(shù)據(jù)如下(PS:這里的報送編碼需要從別的表中獲?。?/p>
但是我們需要從當(dāng)前表中統(tǒng)計出今年的本月,去年的本月和今年上個月的銷售額和定金的數(shù)據(jù),那么我們的sql語句應(yīng)該怎么寫??
方案一:union
我們都知道union是對表格進(jìn)行聯(lián)合查詢的,當(dāng)我們需要對兩個表的數(shù)據(jù)進(jìn)行查詢我們可以使用,但是要遵守:
1.要求我們獲取兩個表的字段個數(shù)和字段數(shù)據(jù)類型是要完全一致的;2.如果數(shù)據(jù)類型一致,但是個數(shù)不一致,我們可以對某個表中設(shè)計空字段,比如需要查詢A表中的兩個字段,需要B表中的1個字段,那么我們就要將語句這樣寫:
select * from A
union
select a, ' ' from B
此處的 ‘ ’ 就保證了A 和B表的字段數(shù)量一致;但是我們的sql語句不單單是為了查詢結(jié)果,對結(jié)果進(jìn)行顯示和分析,更重要的是性能;所以union不能入圍我們的選擇方案(具體原因稍后在方案2中講解)方案二:union all
使用union 需要將兩個表的字段數(shù)量和字段的數(shù)據(jù)類型都一致,為了避免這種問題,我們使用union all,這樣我們可以直接將上面的語句修改為:
select * from A union all(select * from B);雖然可以解決這個查詢的問題,但是顯示的結(jié)果中需要三個不同日期的結(jié)果,而這三個日期需要我們手動進(jìn)行加減計算,然后再同一個表的同一個字段中取不同的值,那么問題來了,當(dāng)我們使用union all 我們需要以每一個日期作為條件對表進(jìn)行查詢,這樣就對表進(jìn)行了至少三次的掃描,所以我們需要擔(dān)心這樣的語句帶來的性能問題;那么相比方案一我們有沒有一些進(jìn)步呢?答案是有的;Union:對兩個結(jié)果集進(jìn)行并集操作,不包括重復(fù)行,同時進(jìn)行默認(rèn)規(guī)則的排序;Union All:對兩個結(jié)果集進(jìn)行并集操作,包括重復(fù)行,不進(jìn)行排序;Union因?yàn)橐M(jìn)行重復(fù)值掃描,所以效率低。如果合并沒有刻意要刪除重復(fù)行,那么就使用Union All方案三:decode轉(zhuǎn)碼求和
原理:我們將每一個日期作為條件一次性將所有的數(shù)據(jù)都查詢出來,這樣我們會查詢出來三條數(shù)據(jù),詳細(xì)如下:
我們可以發(fā)現(xiàn)紅色框內(nèi)的數(shù)據(jù)有為0的數(shù)據(jù),這樣我們想要的數(shù)據(jù)已經(jīng)呈現(xiàn)出來,但是我們?nèi)绾伟讶龡l數(shù)據(jù)合成一條(不含0)呢??
思路: 行專列--decode--求和
我們將上面的數(shù)據(jù)看成一個矩陣,矩陣行專列之后結(jié)果是不變的,所以上圖中的數(shù)據(jù)就會變成下圖中的數(shù)據(jù):
這樣我們可以對每一列求和,然后和剛才的三個日期進(jìn)行合并,這樣三條數(shù)據(jù)就會被我們合成一條;實(shí)現(xiàn)代碼如下:
PS:參數(shù)設(shè)置:l_year :當(dāng)前的年月 ; l_curLastMonth :今年的上個月; l_lastYear :去年的這個月span style="font-size:18px;"select l_year year, l_curLastMonth lmon,l_lastYear lymon, decode(A.rptdate,l_year,A.saleMoney ,0) AS , decode(A.rptdate, l_curLastMonth,A.saleMoney ,0) ASS, decode(A.rptdate,l_lastYear,A.saleMoney ,0) ASSS from A /span
網(wǎng)站題目:oracle查詢怎么轉(zhuǎn)碼,oracle轉(zhuǎn)換數(shù)字
本文路徑:http://sd-ha.com/article0/hdhsoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、App開發(fā)、App設(shè)計、微信小程序、移動網(wǎng)站建設(shè)、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)