版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
xx有限公司ORACLE編碼規(guī)范1南京軌道交通系統(tǒng)工程有限公司ORACLE編碼規(guī)范ORACLE編碼規(guī)范文檔版本號(hào):V1.0文檔編號(hào):XXXX_TS_REGU_ORA文檔密級(jí):內(nèi)部公開(kāi)歸屬部門/項(xiàng)目:研發(fā)部編寫(xiě)人:xxxx生效日期:xxxx-xx-xx版權(quán)信息本文件涉及之信息,屬xxxx有限公司所有。未經(jīng)xxxx有限公司允許,文件中的任何部分都不能以任何形式向第三方散發(fā)。網(wǎng)址:/
文檔修訂記錄版本號(hào)修訂日期修訂人修訂說(shuō)明修訂狀態(tài)審核日期審核人批準(zhǔn)人V1.02012-08-16xxxx正式版A2012-08-20xxxxxxxx修訂狀態(tài):A--增加,M--修改,D--刪除日期格式:YYYY-MM-DD目錄TOC\o"1-3"\h\z1. 前提 前提數(shù)據(jù)庫(kù)設(shè)計(jì)工具使用PowerDesigner。英文使用原則使用英文名稱時(shí),統(tǒng)一使用大寫(xiě)。
單詞之間用下劃線“_”進(jìn)行分隔。使用范圍包括表、視圖、序列號(hào)、字段、函數(shù)、存儲(chǔ)過(guò)程、過(guò)程包、用戶名、角色名、同義詞名、表空間名等。單詞長(zhǎng)度大于7的可以考慮用縮寫(xiě),但需報(bào)備數(shù)據(jù)庫(kù)審核小組,由數(shù)據(jù)庫(kù)審核小組負(fù)責(zé)形成英文單詞縮寫(xiě)匯總表,統(tǒng)一所有英文單詞的縮寫(xiě)格式。邏輯對(duì)象的定義規(guī)范ORACLE表空間定義原則每個(gè)用戶定義自已的表空間,每個(gè)用戶至少一個(gè)表空間,非SYSTEM用戶不得使用SYSTEM表空間。表和索引分開(kāi)存儲(chǔ),存放在不同的表空間,為每個(gè)用戶建立單獨(dú)的用于專門存放索引的表空間。如果條件允許,應(yīng)將數(shù)據(jù)量較大的表歸類(大于100萬(wàn)條記錄)單獨(dú)指定表空間,并將該表空間的BLOCK_SIZE指定大于等于16K隨時(shí)間推移不斷增大的流水表應(yīng)考慮采用分區(qū)的方式進(jìn)行存儲(chǔ)。每個(gè)分區(qū)單獨(dú)指定一個(gè)表空間與之對(duì)應(yīng)。命名用戶表表空間命名格式:TBS_UserName或TBS_UserName_BlockSize例如:TBS_OLAP或TBS_OLAP_16K索引表空間命名格式:TBS_UserName_IDX或TBS_UserName_BlockSize例如:TBS_OLAP_IDX或TBS_OLAP_IDX_8KORACLE數(shù)據(jù)文件數(shù)據(jù)文件的存放為了便于管理,數(shù)據(jù)文件應(yīng)統(tǒng)一存放在指定目錄數(shù)據(jù)文件的命名數(shù)據(jù)文件命名前綴應(yīng)與表空間名一致,并加擴(kuò)展名以示區(qū)別,例如:TBS_E_METADB.ORA當(dāng)一個(gè)表空間有多個(gè)數(shù)據(jù)文件時(shí),分別以表空間名加序號(hào)并加擴(kuò)展名來(lái)命名各個(gè)數(shù)據(jù)文件,例如:TBS_E_ODS.ORA、TBS_E_ODS_2.ORA數(shù)據(jù)文件的大小每個(gè)數(shù)據(jù)文件的大小建議不超過(guò)2G數(shù)據(jù)文件屬性將數(shù)據(jù)文件屬性設(shè)置成自動(dòng)擴(kuò)展,以防止表空間滿后出現(xiàn)無(wú)法插入的錯(cuò)誤用戶管理用戶創(chuàng)建每個(gè)相對(duì)獨(dú)立的模型建立一個(gè)用戶每個(gè)數(shù)據(jù)庫(kù)實(shí)例建議另外單獨(dú)建一個(gè)DBA用戶,如E_DBA,平常數(shù)據(jù)庫(kù)管理員用該用戶進(jìn)行數(shù)據(jù)庫(kù)管理,只有在數(shù)據(jù)庫(kù)啟動(dòng)和關(guān)閉時(shí)才用SYS用戶進(jìn)行登錄。用戶授權(quán)普通用戶僅授予CONNECT和RESOURCE角色權(quán)限,除DBA用戶外,不得給普通用戶授予DBA角色權(quán)限。密碼管理用戶密碼設(shè)置應(yīng)避免使用弱密碼,特別是SYS/SYSTEM和另外單獨(dú)建的DBA用戶。用戶命名規(guī)范用戶名由公司標(biāo)識(shí)+數(shù)據(jù)邏輯層+“_”+用途簡(jiǎn)稱(英文)命名如下:系統(tǒng)管理層:ES_(System)ES_SYSTEM:系統(tǒng)管理庫(kù);ES_METADB:元數(shù)據(jù)庫(kù);ES_WF:工作流管理;ES_...:其它系統(tǒng)管理數(shù)據(jù)庫(kù)接口層:EI_(Interface)EI_HA:滬A接口EI_SA:深A(yù)接口EI_HB:滬B接口EI_SB:深B接口EI_ST:三板接口EI_OF:開(kāi)放式基金接口EI_...:其它外部接口應(yīng)用程:EA_(Application)EA_PUB:公用業(yè)務(wù)管理EA_FUND:資金賬務(wù)管理EA_SEC:股份賬務(wù)管理EA_...:其它應(yīng)用數(shù)據(jù)庫(kù)一級(jí)歷史數(shù)據(jù)原庫(kù)名+_HIST:如E_FUND歷史庫(kù),E_FUND_HIST二級(jí)歷史數(shù)據(jù)同一級(jí)歷史數(shù)據(jù),具體可以等到確定二級(jí)歷史數(shù)據(jù)的管理規(guī)范后再確定。表定義表名在PowerDesigner中建模時(shí),表的中文名稱統(tǒng)一使用,代碼+名稱的格式,如柜臺(tái)客戶信息表的中文名稱:TR_CUST_INFO客戶信息表。一般情況下,不使用前綴,但是如果一個(gè)庫(kù)中的表很多(如開(kāi)放式基金接口庫(kù)等),為便于分類管理,也可以采用前綴標(biāo)進(jìn)行分類。主鍵(PRIMARYKEY)根據(jù)實(shí)際情況,盡可能為每張表建一個(gè)唯一主鍵,主鍵字段類型最好用整數(shù)。選擇有意義的,不太長(zhǎng)且能唯一標(biāo)識(shí)記錄行的列做主鍵,沒(méi)有這種列時(shí),才考慮使用SEQUENCE做主鍵。列列類型字符型字段使用VARCHAR2類型,除了能明確定長(zhǎng)的字段,應(yīng)盡量避免使用CHAR類型(ORACLE的CHAR類型在位數(shù)不足時(shí)會(huì)自動(dòng)補(bǔ)空格)VARCHAR2的定義最多4000字符,如超出應(yīng)考慮使用其它字段類型數(shù)字型字段統(tǒng)一使用NUMBER型,并指定長(zhǎng)度,整型使用NUMBER(m),如NUMBER(6);浮點(diǎn)型使用NUMBER(m,n),如NUMBER(8,2)等。日期、時(shí)間型字段使用視情況采用DATE型或CHAR型,一般記錄日志的日期、時(shí)間字段用DATE型。如果日期和時(shí)間分成兩個(gè)字段,可以考慮日期采用NUMBER(8),可節(jié)省存儲(chǔ)空間和提高效率。盡量使用VARCHAR2(1)代替布爾值使用CLOB代替LOXXXX,BLOB代替LOXXXXRAW字段名縮寫(xiě)應(yīng)有專門英文單詞縮寫(xiě)表進(jìn)行統(tǒng)一維護(hù)列長(zhǎng)度應(yīng)當(dāng)根據(jù)實(shí)際需要選擇列長(zhǎng)度。有對(duì)應(yīng)web
頁(yè)面的,與頁(yè)面上對(duì)應(yīng)列長(zhǎng)度一致。對(duì)數(shù)據(jù)長(zhǎng)度的驗(yàn)證除數(shù)據(jù)庫(kù)端實(shí)現(xiàn)外還要盡可能在表現(xiàn)層控制。索引索引名統(tǒng)一為IDX_TableName[_x],例如IDX_TR_CUST_INFO或IDX_M_OPLOG_2每張表的索引不超過(guò)4個(gè)復(fù)合索引的列不超過(guò)4個(gè)分區(qū)表的索引統(tǒng)一建成本地索引(即建索引時(shí),加LOCAL)對(duì)于表中的數(shù)據(jù)記錄頻繁地被刪除或插入,對(duì)這些表要經(jīng)常性重建索引,使用Alterindexrebuild命令。主鍵主鍵名統(tǒng)一為PK_TABLENAME外鍵外鍵名統(tǒng)一為FK_TABLENAME[_X]表分析定期對(duì)所有的表和索引進(jìn)行分析,可提高查詢的性能。ANALYZETABLETaGTameCOMPUTESTATISTICS;ANALYZEINDEXIndexNameCOMPUTESTATISTICS;可寫(xiě)個(gè)后臺(tái)定時(shí)腳本,每天晚上對(duì)用戶表和索引進(jìn)行一次全面的分析。不可以對(duì)SYSTEM用戶和SYS用戶的表和索引進(jìn)行分析!PL/SQL存儲(chǔ)過(guò)程編寫(xiě)規(guī)范命名總體原則:名稱必須能準(zhǔn)確描述出該標(biāo)識(shí)符的功能、效用存儲(chǔ)過(guò)程、函數(shù)命名沿用公司原有《DatabaseServer端編碼規(guī)范》中的命名規(guī)范。參數(shù)、變量命名沿用公司原有《DatabaseServer端編碼規(guī)范》中的命名規(guī)范。格式標(biāo)準(zhǔn)函數(shù)格式FUNCTIONname[{parameter[,parameter,...]}]RETURNdatatypesIS
[localdeclarations]
BEGIN
executestatements
[EXCEPTION
exceptionhandlers]
END[name];標(biāo)準(zhǔn)過(guò)程格式PROCEDUREname[(parameter[,parameter,...])]IS
[localdeclarations]
BEGIN
executestatements
[EXCEPTION
exceptionhandlers]
END[name]TAB的轉(zhuǎn)換為了保證不同編輯器中瀏覽的版式一致,統(tǒng)一將編輯器設(shè)置為TAB轉(zhuǎn)換為4個(gè)空格??s進(jìn)保證對(duì)應(yīng)的begin-exception-end和if-endif的字符頭在同一垂直線上,縮進(jìn)排版全部用PL/SQLDeveloper中的PL/SQLBeautifier進(jìn)行自動(dòng)排版。大小寫(xiě)規(guī)則為了方便代碼的統(tǒng)一,除引號(hào)內(nèi)的字符,所有PL/SQL或SQL代碼都使用大寫(xiě)。(注:關(guān)鍵字、變量等可以通過(guò)PL/SQL中的設(shè)置,用顏色及字體來(lái)區(qū)分)語(yǔ)句規(guī)范SELECT語(yǔ)句的格式標(biāo)準(zhǔn):SELECTColumn_name1,Column_name2INTO:Parameter1,:Parameter2FROMTable1A,Table2BWHEREA.Column_name=B.Column_name;在寫(xiě)查詢語(yǔ)句的時(shí)候,要求語(yǔ)句的條件排列先后順序要考慮語(yǔ)句執(zhí)行的性能,要做到語(yǔ)句能很好的利用到現(xiàn)有的索引,一般原則上不允許在一條查詢語(yǔ)句中有超過(guò)五張以上的表進(jìn)行關(guān)聯(lián),因?yàn)楫?dāng)超過(guò)五張表關(guān)聯(lián)時(shí)Oracle將不再做語(yǔ)句的優(yōu)化處理;對(duì)語(yǔ)句的性能可以通過(guò)“執(zhí)行計(jì)劃”來(lái)跟蹤,在PL/SQLDeveloper中的ExplainPlanWindow中可分析ORACLE的執(zhí)行計(jì)劃。以下是SELECT的語(yǔ)法,詳細(xì)的使用方法請(qǐng)查閱相關(guān)資料SELECT[DISTINCT|ALL]{*|column1[,column2]...}FROM{table_1|(subquery)}[alias][,{table_2|(subquery)}[alias]]...[WHEREcondition][CONNECTBYcondition[STARTWITHcondition][GROUPBYexpn][HAVIXXXXexpn][{UNION[ALL]|INTERSECT|MINUS}SELECT...][ORDERBY[expn][ASC|DESC][FORUPDATE[OF[user.]table|view]column][NOWAIT]UPDATE語(yǔ)句的格式標(biāo)準(zhǔn):UPDATETableSETColumn_name1=:Parameter1,Column_name2=:Parameter2WHEREColumn_name=:Pareameter;以下是UPDATE的語(yǔ)法,詳細(xì)的使用方法請(qǐng)查閱相關(guān)資料UPDATE[user.]table[@db_link][alias]SET{column1=express1[,column2=experss2]...|(column1[,column2]...)=(subquery)}[WHEREcondition|currentofcursor];INSERT語(yǔ)句的格式標(biāo)準(zhǔn):INSERTINTOTableName(Column_name1,Column_name2)VALUES(:Parameter1,:Parameter2)或INSERTINTOTableName(Column_name1,Column_name2)SELECTColumn_name1,Column_name2FROMTableWHEREColumn_name=:Pareameter不允許出現(xiàn)INSERTINTOTableNameVALUES(:Parameter1,:Parameter2)的寫(xiě)法。也不允許出現(xiàn)INSERTINTOTableNameSELECT*FROMTable的寫(xiě)法DELETE語(yǔ)句的格式標(biāo)準(zhǔn):DELETEFROMTableNameWHEREColumn_name1=:Parameter1以下是DELETE的語(yǔ)法,詳細(xì)的使用方法請(qǐng)查閱相關(guān)資料DELETE[FROM][user.]table[@db_link][Alias][WHEREcondition];UNION,INTERSECT及MINUS有時(shí)需要從多個(gè)表中組合具有一種相似類型的信息。Union可以完成將兩個(gè)以上的表的相類似的查詢結(jié)果合并在一起,并且相同的只取其一;如果unionall則表示返回所有行(不管是否重復(fù))。Intersect返回在兩個(gè)表中都有相同內(nèi)容的信息。Minus則返回只在一個(gè)表中出現(xiàn)的信息1.語(yǔ)法:select...union[all]ersectselect...select...minusselect...盡量避免使用GOTO......LABEL語(yǔ)句;除非有特殊的需求,否則應(yīng)盡量避免使用GOTO......LABEL語(yǔ)句。ORACLE的偽表與偽列:Oracle系統(tǒng)為了實(shí)現(xiàn)完整的關(guān)系數(shù)據(jù)庫(kù)功能,系統(tǒng)專門提供了一組稱為偽列(Pseudocolumn)的數(shù)據(jù)庫(kù)列,這些列不是在建立對(duì)象(如建表)時(shí)由我們完成的,而是在我們建立對(duì)象時(shí)由自動(dòng)Oracle完成的。Oracle目前有以下的偽列:CURRVALandNEXTVAL使用序列號(hào)的保留字LEVEL查詢數(shù)據(jù)所對(duì)應(yīng)的級(jí)ROWID記錄的唯一標(biāo)識(shí)ROWNUM限制查詢結(jié)果集的數(shù)量Oracle還提供了一個(gè)DUAL的偽表,該表主要目的是保證在使用SELECT語(yǔ)句中語(yǔ)句的完整性而提供的,如:我們要查詢當(dāng)前的系統(tǒng)日期及時(shí)間,而系統(tǒng)的日期和時(shí)間并是放在一個(gè)指定的表里。所以在from語(yǔ)句后就沒(méi)有表名給出。為了使用from后有個(gè)表名,我們就用DUAL代替。如:例1:查詢Oracle系統(tǒng)日期及時(shí)間:SQL>selectto_char(sysdate,'yyyy.mm.ddhh24:mi:ss')fromDUAL;TO_CHAR(SYSDATE,'YY2004.09.2417:28:09例2:計(jì)算一下5000+5000*0.1的結(jié)果是多少,則:SQL>select5000+5000*0.1fromDUAL;5000+5000*0.15500使用%ROWTYPE和%TYPEPL/SQL可以聲明與數(shù)據(jù)庫(kù)行有相同類型的記錄或者與數(shù)據(jù)庫(kù)字段相同的變量類型例:DECLAREV_CUST_CODETR_CUSTINFO.CUST_CODE%TYPE;R_D_CODENOTED_CODENOTE%TYPE;BEGIN……END;盡量不使用NOTIN子句;盡量不使用NOTIN子句,而用NOEXISTS或MINUS等其它方法替代它。不要在WHERE子句中使用函數(shù)作為條件;除非你不考慮執(zhí)行效率問(wèn)題,否則請(qǐng)不要在WHERE子句中使用函數(shù)作為條件。例如WHERETO_NUMBER(TEL_NBR)=7654321這種寫(xiě)法是效率非常低下的。使用SELECTCOUNT(1)SELECTCOUNT(*)改為SELECTCOUNT(1)能提高速度;EXISTS子句中,使用SELECT1;EXISTS子句中,SELECT*改為SELECT1能提高速度;使用CREATETABLEAS;如果可能,請(qǐng)使用CREATETABLETaGTame來(lái)替代INSERTINTOTaGTameSELECT*FROM……,特別是在記錄數(shù)比較多的情況下,前者的速度上會(huì)有非常明顯的優(yōu)勢(shì)。使用TRUNCATETABLE;如果是刪除全表,請(qǐng)使用TRUNCATETABLETaGTame來(lái)替代DELETEFROMTaGTame,能有效提高速度,并釋放該表所占的存儲(chǔ)空間,減少磁盤(pán)碎片。由于TRUNCATETABLE是DDL語(yǔ)言,在存儲(chǔ)過(guò)程中不能直接使用,應(yīng)加上EXECUTEIMMEDIATE,使用方法如下:EXECUTEIMMEDIATE‘TRUNCATETABLETaGTame’;使用前請(qǐng)注意是否有權(quán)限問(wèn)題。在PL/SQL中使用sqlcode,sqlerrm當(dāng)存儲(chǔ)過(guò)程執(zhí)行出錯(cuò)拋出EXCEPTION時(shí),可通過(guò)sqlcode和sqlerrm取得當(dāng)前的ORACLE錯(cuò)誤代碼和錯(cuò)誤信息,以下是使用范例:DECLAREV_SQLCODEnumber(6);V_ERRMSGvarchar2(512);BEGINUPDATEdeptSETusername=(SELECTusernameFROMwork_group)WHERErownum=1;EXCEPTIONWHENOTHERSTHENV_SQLCODE:=sqlcode;V_ERRMSG:=sqlerrm;Dmbs_output.put_line(‘程序出錯(cuò),錯(cuò)誤代碼:’||V_SQLCODE||’錯(cuò)誤信息:’||V_ERRMSG);END;適當(dāng)使用ORACLE的HINT;在大數(shù)據(jù)量地進(jìn)行INSERTINTO……SELECT……的時(shí)候,可使用/*+append*/這個(gè)HINT加快執(zhí)行速度,使用方法如下:INSERT/*+append*/INTO…….SELECT……使用該HINT之后,必須馬上提交或回滾,否則對(duì)該表的任何讀寫(xiě)操作都會(huì)報(bào)錯(cuò)。在多個(gè)表進(jìn)行關(guān)聯(lián)操作的時(shí)候,有時(shí)用/*+rule*/這個(gè)HINT可能帶來(lái)意想不到的效果,這要根據(jù)實(shí)際情況比較分析使用前后的速度,適當(dāng)取舍。使用方法如下:SELECT/*+rule*/……FROM……WHERE……注釋要求位置要求注釋行的長(zhǎng)度以在最大化窗口內(nèi)可以看到全部?jī)?nèi)容為宜,如果一行不夠顯示需要換行,下一行注釋語(yǔ)句與上一行注釋語(yǔ)句應(yīng)對(duì)齊。變量申明的注釋放在變量申明語(yǔ)句的后面,并以--為注釋語(yǔ)句注釋行一律放在被注釋語(yǔ)句的上一行。注釋行中,注釋命令與注釋內(nèi)容空一個(gè)空格,如:V_BpModeVARCHAR2(10);--用戶服務(wù)類型BEGIN--選取用戶服務(wù)類型BEGINSELECTBpModeINTOV_BpModeFROMACC_BPWHEREUser_ID=I_User_ID;EXCEPTIONWHENNO_DATA_FOUNDTHENWHENOTHERSTHENEND;存儲(chǔ)過(guò)程注釋要求/******************************************************************概要說(shuō)明:中文名稱:用途:語(yǔ)法信息:調(diào)用舉例:功能修訂:簡(jiǎn)要說(shuō)明:修訂記錄:<修訂日期><修訂人> :修改內(nèi)容簡(jiǎn)要說(shuō)明〈續(xù)簡(jiǎn)要說(shuō)明>******************************************************************/代碼片斷注釋要求當(dāng)處理流程比較復(fù)雜,不容易讓其它人看懂時(shí),應(yīng)該加以注釋注釋行放在被注釋的代碼片斷上一行,并與代碼片斷第一行對(duì)齊。代碼片斷處理要求變量的聲明函數(shù)內(nèi)部變量的聲明統(tǒng)一放在函數(shù)代碼段的開(kāi)始部分,不允許分散在函數(shù)內(nèi)小代碼片斷中。全局公共變量統(tǒng)一放在一個(gè)包聲明內(nèi),并放在包聲明代碼段開(kāi)始部分。包體內(nèi)局部公共變量放在包體代碼段開(kāi)始部分。數(shù)據(jù)選取為了規(guī)避觸發(fā)Oracle意外錯(cuò)誤,應(yīng)遵守如下規(guī)則1)從數(shù)據(jù)表中選取一行數(shù)據(jù)到變量范例BEGINSELECT*INTOV_AccFROMAcc_BpWHEREUser_ID=I_User_ID;EXCEPTIONWHENNO_DATA_FOUNDTHEN……相應(yīng)處理;WHENOTHERSTHEN……相應(yīng)處理;END;2)做類型轉(zhuǎn)換時(shí)BEGINV_PensonId=TO_NUMBER(I_In);EXCEPTIONWHENOTHERSTHEN……相應(yīng)處理;END;游標(biāo)的使用除非特殊需要,統(tǒng)一使用如下范例BEGINFORrecIN(SELECT*FROMAcc_BpWHEREBpMode=‘省網(wǎng)中文’)LOOP……ENDLOOP;END;錯(cuò)誤處理要求可預(yù)見(jiàn)的錯(cuò)誤處理,并使得流程無(wú)法繼續(xù)時(shí),應(yīng)向操作員報(bào)告發(fā)生這些錯(cuò)誤的原因,可能發(fā)生的影響。不可以預(yù)見(jiàn)的Oracle系統(tǒng)內(nèi)部錯(cuò)誤,則應(yīng)向操作員報(bào)告如下信息:錯(cuò)誤發(fā)生地點(diǎn)、錯(cuò)誤發(fā)生的環(huán)境或關(guān)鍵條件、關(guān)鍵性的幫助信息、錯(cuò)誤信息。備注:錯(cuò)誤發(fā)生地點(diǎn)包括:包名稱函數(shù)名錯(cuò)誤發(fā)生的環(huán)境或關(guān)鍵條件、關(guān)鍵性的幫助信息的取舍與多寡,取決于如何能使系統(tǒng)管理員或開(kāi)發(fā)人員掌握發(fā)生錯(cuò)誤的具體原因信息報(bào)告的組織格式如下:(包名稱.函數(shù)名)發(fā)生的條件或關(guān)鍵條件關(guān)鍵性的幫組信息:SQLERRM范例FUNCTIONPayToAcnt(IN_PayINJf_PayList%ROWTYPE)RETURNVARCHAR2ISV_AccAcc_Bp%ROWTYPE;SYSTEM_ERROREXCEPTION;BEGINBEGINSELECT*INTOV_AccFROMAcc_BpWHEREUser_ID=I_Pay.User_Id;EXCEPTIONWHENNO_DATA_FOUNDTHENPub.SetErrMsg(‘無(wú)法找到用戶(User_ID=’||I_Pay.User_ID||‘)’);RAISESYSTEM_ERROR;WHENOTHERSTHENPub.SetErrMsg(‘(S_ToAcnt.PayToAcnt)取Acc_Bp表,User_ID=’||I_Pay.User_ID||‘意外錯(cuò)誤:’||SQLERRM);RAISESYSTEM_ERROR;WHENEND;RETURN‘成功’EXCEPTIONWHENSYSTEM_ERRORTHENRETURN‘失敗’;WHENOTHERSTHENPub.SetErrMsg(‘(S_ToAcnt.PayToAcnt)User_Id=’||I_Pay.User_ID||‘,Money=’||I_Pay.PayMoney||‘,Free=’||I_PayList.PayFree||‘意外錯(cuò)誤:’||SQLERRM);RAISE‘失敗’;ENDPayToAcnt;尾注要求如果存在3重以上的循環(huán),應(yīng)加尾注,尾注內(nèi)容為L(zhǎng)OOP+循環(huán)層級(jí),LOOP與ENDLOOP都應(yīng)該加注,如:LOOP--LOOP1……LOOP--LOOP2……LOOP--LOOP3……ENDLOOP;--LOOP3……ENDLOOP--LOOP2……ENDLOOP--LOOP1如果存在3重以上條件,應(yīng)加尾注。只要在ENDIF上加尾注,尾注內(nèi)容為條件內(nèi)容如:IF條件1THENIF條件2THENIF條件3THENENDIF;--條件3ENDIF;--條件2ENDIF;--條件1如果條件內(nèi)部代碼片斷超過(guò)10行,應(yīng)加尾注,如:IF條件1THEN……--10行以上處理代碼ENDIF;--條件1C/C++嵌入式SQL書(shū)寫(xiě)規(guī)范首先聲明,因公司原有的開(kāi)發(fā)規(guī)范不建議采用C/C++中直接嵌入SQL的作法。而是將嵌入式SQL統(tǒng)一放在存儲(chǔ)過(guò)程作實(shí)現(xiàn)。以下只是制定書(shū)寫(xiě)規(guī)范,如有特殊的需求要采用嵌入式SQL時(shí),應(yīng)遵從以下書(shū)定規(guī)范。大多數(shù)嵌入式SQL語(yǔ)句與交互式SQL語(yǔ)句的區(qū)別僅僅是增加了一些子句或使用了一些SQL變量。在定義SQL語(yǔ)句時(shí),把變量和所要賦的值分兩行來(lái)表達(dá),把SQL的賦值同其變量定義起始相同,以減少此語(yǔ)句中的空格數(shù)。為了保證UNIX下各個(gè)平臺(tái)的兼容,規(guī)定在寫(xiě)長(zhǎng)字符串定義包括SQL語(yǔ)句定義時(shí),都要在字符串定義的每行結(jié)束用反斜杠“\”進(jìn)行字符串連接,而且要保證反斜杠“\”前至少要有一個(gè)空格。Select語(yǔ)句格式標(biāo)準(zhǔn)Char*p_cSelStmt=“SELECTColumn_name1,Column_name2\INTO:Parameter1,:Parameter2\FROMTable1A,Table2B\WHEREA.Column_name=B.Column_name”;在寫(xiě)查詢語(yǔ)句的時(shí)候,要求語(yǔ)句的條件排列先后順序要考慮語(yǔ)句執(zhí)行的性能,要做到語(yǔ)句能很好的利用到現(xiàn)有的索引,一般原則上不允許在一條查詢語(yǔ)句中有超過(guò)五張以上的表進(jìn)行關(guān)聯(lián),因?yàn)楫?dāng)超過(guò)五張表關(guān)聯(lián)時(shí)Oracle將不再做語(yǔ)句的優(yōu)化處理;對(duì)語(yǔ)句的性能可以通過(guò)“執(zhí)行計(jì)劃”來(lái)跟蹤,在SQL/PLUS下運(yùn)行:setautotraceon,然后運(yùn)行要跟蹤的語(yǔ)句,通過(guò)分析系統(tǒng)的結(jié)果值來(lái)確定是否已經(jīng)利用索引,運(yùn)行:setautotraceoff將關(guān)閉“執(zhí)行計(jì)劃”。Update語(yǔ)句格式標(biāo)準(zhǔn)Char*p_cUpdStmt=“UPDATETableSet\Column_name1=:Parameter1,\Column_name2=:Parameter2\WHEREColumn_name=:Pareameter”;Delete語(yǔ)句格式標(biāo)準(zhǔn)Char*p_cDelStmt=“DELETEfromTableName\WHEREColumn_name1=:Parameter1,\Column_name2=:Parameter2”;Insert語(yǔ)句格式標(biāo)準(zhǔn)Char*p_cInsStmt=“INSERTINTOTableName(Column_name1,Column_name2)\Values(:Parameter1,:Parameter2);“日期、時(shí)間使用格式在每個(gè)SQL語(yǔ)句中,需要用到時(shí)間值的,都以如下格式出入: to_date(ParamOfDate,”YYYY-MM-DD”); to_char(ParamOfDate,”YYYY-MM-DD[HH24:MI:SS]”);除需要由操作員輸入所要插入的日期和時(shí)間外,其他需要往數(shù)據(jù)庫(kù)產(chǎn)生日期和時(shí)間的動(dòng)作都通過(guò)系統(tǒng)時(shí)間(sysdate)來(lái)插入。JDBC&Oracle使用注意點(diǎn)關(guān)閉自動(dòng)提交功能,提高系統(tǒng)性能在第一次建立與數(shù)據(jù)庫(kù)的連接時(shí),在缺省情況下,連接是在自動(dòng)提交模式下的。為了獲得更好的性能,可以通過(guò)調(diào)用帶布爾值false參數(shù)的Connection類的setAutoCommit()方法關(guān)閉自動(dòng)提交功能,如下所示:conn.setAutoCommit(false);值得注意的是,一旦關(guān)閉了自動(dòng)提交功能,我們就需要通過(guò)調(diào)用Connection類的commit()和rollback()方法來(lái)人工的方式對(duì)事務(wù)進(jìn)行管理。在動(dòng)態(tài)SQL或有時(shí)間限制的命令中使用Statement對(duì)象在執(zhí)行SQL命令時(shí),我們有二種選擇:可以使用PreparedStatement對(duì)象,也可以使用Statement對(duì)象。無(wú)論多少次地使用同一個(gè)SQL命令,PreparedStatement都只對(duì)它解析和編譯一次。當(dāng)使用Statement對(duì)象時(shí),每次執(zhí)行一個(gè)SQL命令時(shí),都會(huì)對(duì)它進(jìn)行解析和編譯。因此,在有時(shí)間限制的SQL操作中,除非成批地處理SQL命令,我們應(yīng)當(dāng)考慮使用Statement對(duì)象。在成批處理重復(fù)的插入或更新操作中使用PreparedStatement對(duì)象如果成批地處理插入和更新操作,就能夠顯著地減少它們所需要的時(shí)間。Oracle提供的Statement和CallableStatement并不真正地支持批處理,只有PreparedStatement對(duì)象才真正地支持批處理。我們可以使用addBatch()和executeBatch()方法選擇標(biāo)準(zhǔn)的JDBC批處理,或者通過(guò)利用PreparedStatement對(duì)象的setExecuteBatch()方法和標(biāo)準(zhǔn)的executeUpdate()方法選擇速度更快的Oracle專有的方法。要使用Oracle專有的批處理機(jī)制,可以以如下所示的方式調(diào)用setExecuteBatch():PreparedStatementpstmt3Dnull;try{((OraclePreparedStatement)pstmt).setExecuteBatch(30);...pstmt.executeUpdate();}調(diào)用setExecuteBatch()時(shí)指定的值是一個(gè)上限,當(dāng)達(dá)到該值時(shí),就會(huì)自動(dòng)地引發(fā)SQL命令執(zhí)行,標(biāo)準(zhǔn)的executeUpdate()方法就會(huì)被作為批處理送到數(shù)據(jù)庫(kù)中。我們可以通過(guò)調(diào)用PreparedStatement類的sendBatch()方法隨時(shí)傳輸批處理任務(wù)。利用SQL完成數(shù)據(jù)庫(kù)內(nèi)的操作要充分利用SQL的面向集合的方法來(lái)解決數(shù)據(jù)庫(kù)處理需求,而不是使用Java等過(guò)程化的編程語(yǔ)言。如果要在一個(gè)表中查找許多行,結(jié)果中的每個(gè)行都會(huì)查找其他表中的數(shù)據(jù),最后,編程人員創(chuàng)建了獨(dú)立的UPDATE命令來(lái)成批地更新第一個(gè)表中的數(shù)據(jù)。與此類似的任務(wù)可以通過(guò)在set子句中使用多列子查詢而在一個(gè)UPDATE命令中完成。為了規(guī)范獨(dú)立存管系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)和開(kāi)發(fā),考慮到SQLSERVER與ORACLE數(shù)據(jù)庫(kù)之間的一些差異,特作如下約定:數(shù)據(jù)庫(kù)設(shè)計(jì)開(kāi)發(fā)約定英文命名全部大寫(xiě),單詞之間用下劃線分隔為了統(tǒng)一書(shū)寫(xiě)規(guī)范,在表名、字段名、存儲(chǔ)過(guò)程命名時(shí),采用的英文單詞全部使用大寫(xiě),單詞之間使用下劃線“_”進(jìn)行分隔。VARCHAR類型字段最長(zhǎng)為4000為了考慮兼容ORACLE數(shù)據(jù)庫(kù)的VARCHAR長(zhǎng)度,在數(shù)據(jù)庫(kù)模型設(shè)計(jì)時(shí),所有的VARCHAR類型字段最長(zhǎng)為4000,如字段內(nèi)容超過(guò)此限制,應(yīng)考慮采用其它數(shù)據(jù)類型。所有數(shù)值型的字段統(tǒng)一使用number(x)/numeric(x)因?yàn)椴煌瑪?shù)據(jù)庫(kù)的integer類型所表示的數(shù)據(jù)范圍可能不同,因此,數(shù)據(jù)庫(kù)模型設(shè)計(jì)時(shí),所有數(shù)值型的字段統(tǒng)一使用number(x),視字段的長(zhǎng)度需要指定x的大小,比如number(6)。索引名統(tǒng)一為IDX_TableName[_x]索引名統(tǒng)一為IDX_TableName[_x],例如IDX_TR_CustInfo或IDX_M_OPLOG_2。SQL查詢條件中注意字段的類型要一致比如A表的B字段是字符型,那么SELECT時(shí)就應(yīng)該寫(xiě)成
SELECT*FROMAWHEREB='1'
而不是寫(xiě)成
SELECT*FROMAWHEREB=1字段別名統(tǒng)一用AS方式SQL那邊給字段取別名時(shí)統(tǒng)一用AS的方式,這樣可以跟ORACLE兼容.比如ORACLE不支持SELECTAAA=COLUMN_NAME的方式
寫(xiě)成SELECTCOLUMN_NAMEASAAA這樣就可以統(tǒng)一了存儲(chǔ)過(guò)程開(kāi)發(fā)約定存儲(chǔ)過(guò)程命名約定存儲(chǔ)過(guò)程的命名必須符合P_功能分類[_功能子類]_詳細(xì)名稱格式,其中1,P表示是存儲(chǔ)過(guò)程;2,功能分類、功能子類采用約定好的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 雞肉炒肉課程設(shè)計(jì)
- 年度固定照明設(shè)備市場(chǎng)分析及競(jìng)爭(zhēng)策略分析報(bào)告
- 鐵路軌道工程課程設(shè)計(jì)
- 2025年度個(gè)人車輛購(gòu)置擔(dān)保合同4篇
- 2025年度個(gè)人藝術(shù)品買賣合同示范文本4篇
- 二零二五年度高端別墅租賃合同樣本匯編4篇
- 2025年度環(huán)保材料采購(gòu)與資源循環(huán)利用合同3篇
- 2025年度珠寶首飾代銷合同范本8篇
- 防水保溫施工方案
- 2025年度原創(chuàng)劇本征集與獎(jiǎng)金激勵(lì)合同3篇
- 心力衰竭的治療(基層診療與指南2024)
- 2024-2025學(xué)年冀教新版八年級(jí)上冊(cè)數(shù)學(xué)期末復(fù)習(xí)試卷(含詳解)
- 《子宮肉瘤》課件
- 《機(jī)器人驅(qū)動(dòng)與運(yùn)動(dòng)控制》全套教學(xué)課件
- 電子商務(wù)平臺(tái)技術(shù)服務(wù)合同范本1
- 期末 (試題) -2024-2025學(xué)年川教版(三起)英語(yǔ)四年級(jí)上冊(cè)
- 2024年國(guó)家公務(wù)員考試公共基礎(chǔ)知識(shí)復(fù)習(xí)題庫(kù)及答案(共三套)
- 《社會(huì)工作實(shí)務(wù)》全冊(cè)配套完整課件3
- 單位違反會(huì)風(fēng)會(huì)書(shū)檢討書(shū)
- 《哪吒之魔童降世》中的哪吒形象分析
- 信息化運(yùn)維服務(wù)信息化運(yùn)維方案
評(píng)論
0/150
提交評(píng)論