ETL開(kāi)發(fā)規(guī)范.doc_第1頁(yè)
ETL開(kāi)發(fā)規(guī)范.doc_第2頁(yè)
ETL開(kāi)發(fā)規(guī)范.doc_第3頁(yè)
ETL開(kāi)發(fā)規(guī)范.doc_第4頁(yè)
ETL開(kāi)發(fā)規(guī)范.doc_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

ETL 開(kāi)發(fā)規(guī)范 第 1 頁(yè) 共 27 頁(yè) ID LC CMM PE TEMPLATE 22 中國(guó)電信省級(jí)經(jīng)營(yíng)分析概要設(shè)計(jì)規(guī)格書(shū)中國(guó)電信省級(jí)經(jīng)營(yíng)分析概要設(shè)計(jì)規(guī)格書(shū) 業(yè)務(wù)分冊(cè) V 1 0 南京聯(lián)創(chuàng)科技股份有限公司 文文 檔檔 信信 息息 項(xiàng)項(xiàng) 目目 名名 稱稱XX 項(xiàng)目 項(xiàng)項(xiàng) 目目 經(jīng)經(jīng) 理理XXX 文文 檔檔 編編 號(hào)號(hào) LC CMM PE TEMPLATE 22 ETL 開(kāi)發(fā)規(guī)范 第 2 頁(yè) 共 27 頁(yè) 文文 檔檔 變變 更更 記記 錄錄 版版 本本 編編 號(hào)號(hào)版版 本本 日日 期期作作 者者說(shuō)說(shuō) 明明 V1 02003 11 11 XXX XXX初稿 審審 核核 審核組織審核組織審核代表審核代表簽字簽字時(shí)間時(shí)間 批批 準(zhǔn)準(zhǔn) 批準(zhǔn)組織批準(zhǔn)組織批準(zhǔn)代表批準(zhǔn)代表簽字簽字時(shí)間時(shí)間 ETL 開(kāi)發(fā)規(guī)范 第 3 頁(yè) 共 27 頁(yè) 目 錄 1總則總則 4 1 1概述 4 1 2設(shè)計(jì)原則 4 1 2 1統(tǒng)一設(shè)計(jì) 規(guī)范開(kāi)發(fā) 4 1 3數(shù)據(jù)獲取和 ETL 處理 4 1 3 1數(shù)據(jù)獲取 4 1 3 2ETL處理 5 1 4數(shù)據(jù)存儲(chǔ) 5 1 4 1數(shù)據(jù)分表 5 1 4 2數(shù)據(jù)分區(qū) 5 1 4 3關(guān)于兩個(gè)特征字段 5 2ETL 規(guī)范規(guī)范 6 2 1數(shù)據(jù)處理規(guī)范 6 2 1 1標(biāo)識(shí)統(tǒng)一規(guī)范 6 2 1 2數(shù)據(jù)分表命名規(guī)范 6 2 1 3程序命名規(guī)范 6 2 1 4日志規(guī)范 7 2 1 5動(dòng)態(tài)建表規(guī)范 7 2 1 6參數(shù)規(guī)范 7 2 2ETL 模塊劃分 7 2 3代碼編寫(xiě)規(guī)范 8 2 3 1編寫(xiě)目的 8 2 3 2代碼編寫(xiě)通用規(guī)范 8 2 3 3SQL代碼編寫(xiě)規(guī)范 11 2 3 4C C 編程規(guī)范 16 ETL 開(kāi)發(fā)規(guī)范 第 4 頁(yè) 共 27 頁(yè) 1 總則總則 1 1 概述概述 本規(guī)范定義聯(lián)創(chuàng)科技在中國(guó)電信公司省級(jí)經(jīng)營(yíng)分析系統(tǒng) PBI 項(xiàng)目中 ETL 相關(guān)的設(shè)計(jì) 建設(shè)基本原 則和規(guī)范 1 2 設(shè)計(jì)原則設(shè)計(jì)原則 本規(guī)范適用于聯(lián)創(chuàng)科技股份公司省級(jí)電信經(jīng)營(yíng)分析項(xiàng)目 ETL 小組 1 2 1 統(tǒng)一設(shè)計(jì) 統(tǒng)一設(shè)計(jì) 規(guī)范開(kāi)發(fā)規(guī)范開(kāi)發(fā) 1 省級(jí)經(jīng)營(yíng)分析系統(tǒng)由于數(shù)據(jù)龐大 因此 在數(shù)據(jù) ETL 上花費(fèi)的工作量是巨大的 為了減輕系統(tǒng)負(fù) 擔(dān) 提高系統(tǒng)效率 繁雜的統(tǒng)一編碼 統(tǒng)一維度標(biāo)識(shí)等工作需要在數(shù)據(jù)進(jìn)入數(shù)據(jù)倉(cāng)庫(kù)之前完成 倉(cāng)庫(kù)區(qū) 之后只負(fù)責(zé)有限范圍內(nèi)的 ETL 工作 2 省級(jí)經(jīng)營(yíng)分析的接口為文件接口 此時(shí) 需要建立規(guī)范 清晰的文件接口格式及數(shù)據(jù)傳送協(xié)議 3 對(duì)于編程工作 需要定制統(tǒng)一的開(kāi)發(fā)模板 及開(kāi)發(fā)說(shuō)明及修改模板 以利于和測(cè)試 工程等后續(xù) 環(huán)節(jié)的良好銜接 4 ETL 編程的模塊劃分將配合系統(tǒng)規(guī)劃進(jìn)行各模塊的劃分 清晰地體現(xiàn)出各個(gè)模塊之間的依賴關(guān)系 并降低各模塊之間的耦合 保證模塊內(nèi)的穩(wěn)定性 和良好擴(kuò)展性 1 3 數(shù)據(jù)獲取和數(shù)據(jù)獲取和 ETL 處理處理 1 3 1 數(shù)據(jù)獲取數(shù)據(jù)獲取 設(shè)計(jì)點(diǎn)和評(píng)估因子說(shuō)明 業(yè)務(wù)系統(tǒng)承載能力評(píng)估 網(wǎng)絡(luò)承載能力評(píng)估 數(shù)據(jù)獲取實(shí)時(shí)性需求 接口雙方通訊機(jī)制與約定 接 口數(shù)據(jù)的維護(hù) ETL 開(kāi)發(fā)規(guī)范 第 5 頁(yè) 共 27 頁(yè) 1 3 2 ETL 處理處理 設(shè)計(jì)點(diǎn)和評(píng)估因子 數(shù)據(jù)轉(zhuǎn)換處理邏輯 重抽支持 性能評(píng)估 1 4 數(shù)據(jù)存儲(chǔ)數(shù)據(jù)存儲(chǔ) 1 4 1 數(shù)據(jù)分表數(shù)據(jù)分表 進(jìn)行按時(shí)間的數(shù)據(jù)分割處理 目的是能夠方便 可行地進(jìn)行索引建立 提取業(yè)務(wù)數(shù)據(jù)片斷 同時(shí)也 為 ETL 重抽提供基本保障 1 4 2 數(shù)據(jù)分區(qū)數(shù)據(jù)分區(qū) 分區(qū)實(shí)際上是數(shù)據(jù)分割技術(shù)更細(xì)節(jié)的延伸 對(duì)于省級(jí)經(jīng)營(yíng)分析系統(tǒng)來(lái)說(shuō) 數(shù)據(jù)量龐大 對(duì)各地傳送 的數(shù)據(jù) 需要按地域進(jìn)行分區(qū)以方便數(shù)據(jù)統(tǒng)計(jì) ETL 重抽 1 4 3 關(guān)于兩個(gè)特征字段關(guān)于兩個(gè)特征字段 說(shuō)明 數(shù)據(jù)倉(cāng)庫(kù)為所有的 RECORDS 記錄 設(shè)計(jì)了 ETL CYCLE ID ETL 周期標(biāo)識(shí) 和 ETL TIME 記錄 實(shí)際加載時(shí)間兩個(gè)特征字段 分別標(biāo)識(shí)記錄集合所屬的 ETL 周期和記錄的實(shí)際加載時(shí)間 目的 1 方便重抽處理 2 方便審核數(shù)據(jù) 例如 200308 月的帳單實(shí)際在 2003 年 10 月 01 日加載至數(shù)據(jù)倉(cāng)庫(kù) 那么這批記錄的 ETL CYCLE ID 賦值為 200308 加載時(shí)間賦值為 2003 年 10 月 01 日 ETL 開(kāi)發(fā)規(guī)范 第 6 頁(yè) 共 27 頁(yè) 2 ETL 規(guī)范規(guī)范 2 1 數(shù)據(jù)處理規(guī)范數(shù)據(jù)處理規(guī)范 2 1 1 標(biāo)識(shí)統(tǒng)一規(guī)范標(biāo)識(shí)統(tǒng)一規(guī)范 省級(jí)經(jīng)營(yíng)分析的數(shù)據(jù)來(lái)源于各個(gè)系統(tǒng) 即使在數(shù)據(jù)接口之前就已將各個(gè)本地網(wǎng)之間的數(shù)據(jù)標(biāo)識(shí)統(tǒng)一 但數(shù)據(jù)匯集之后 仍然難保證標(biāo)識(shí)的一致性 因此 ETL 小組約定 所有的標(biāo)識(shí)均按以下規(guī)則進(jìn)行數(shù)據(jù)轉(zhuǎn) 換 1 所有標(biāo)識(shí)位類型 VARCHAR2 30 2 地域編碼 兩位 接口標(biāo)識(shí) 后綴補(bǔ)碼 3 后綴補(bǔ)碼的約定為字符 9 2 1 2 數(shù)據(jù)分表命名規(guī)范數(shù)據(jù)分表命名規(guī)范 ETL 的數(shù)據(jù)分表策略如下 模板表名 分割日期 說(shuō)明 分割日期可以為天 月 年 具體由處理周期及存儲(chǔ)策略決定 分表在數(shù)據(jù)處理過(guò)程中直接 生成 2 1 3 程序命名規(guī)范程序命名規(guī)范 程序命名需要做到見(jiàn)名知義 程序名盡量起得清晰 通俗 業(yè)務(wù)模塊命名規(guī)則 程序?qū)傩院?jiǎn)寫(xiě) 處理業(yè)務(wù)模塊表名 遵循以上規(guī)則 名稱超過(guò)規(guī)范長(zhǎng)度的 可以適當(dāng)進(jìn)行簡(jiǎn)寫(xiě) 例如 對(duì)后端集市 市話主叫統(tǒng)計(jì)表 TBM LS CALLING 進(jìn)行 ETL 的函數(shù) 則函數(shù)名為 F TBM LS CALLING 對(duì)后端集市 市話主叫統(tǒng)計(jì)表 TBM LS CALLING 進(jìn)行 ETL 的程序 則程序名為 P TBM LS CALLING ETL 開(kāi)發(fā)規(guī)范 第 7 頁(yè) 共 27 頁(yè) 技術(shù)模塊的命名根據(jù)具體功能進(jìn)行命名 不強(qiáng)制進(jìn)行限定 2 1 4 日志規(guī)范日志規(guī)范 由 ETL 工具調(diào)度后統(tǒng)一記載日志 各業(yè)務(wù) ETL 代碼不需要重復(fù)記載此信息 2 1 5 動(dòng)態(tài)建表規(guī)范動(dòng)態(tài)建表規(guī)范 在程序執(zhí)行過(guò)程中由程序自動(dòng)建立的表為動(dòng)態(tài)建表 ORACLE 動(dòng)態(tài)建表時(shí)必須指定以下幾個(gè)參數(shù) 1 表空間名 TABLESPACE 2 表初始化大小 INITIAL 3 表擴(kuò)展大小 NEXT 4 模板表名 其余策略可以默認(rèn)表空間的策略 2 1 6 參數(shù)規(guī)范參數(shù)規(guī)范 所有的 ETL 程序均設(shè)置以下傳入?yún)?shù) string strCycleID cycleid string strTemplateTableName 模板表名 string strTableSpaceName 表空間名 string strInitialSpace 初始尺寸 string strNextSpace 擴(kuò)展尺寸 int iAutoPartition 是否自動(dòng)分區(qū) string strPartitionColumn 分區(qū)列名 int iPartitionNum 分區(qū)個(gè)數(shù) string strStatUserName 統(tǒng)計(jì)用戶名 string strStatPassWord 統(tǒng)計(jì)口令 string strStatServerName 統(tǒng)計(jì)服務(wù)名 所有的 ETL 程序均設(shè)置以下傳出參數(shù) psssparam strRetCode 0 返回代碼 ETL 開(kāi)發(fā)規(guī)范 第 8 頁(yè) 共 27 頁(yè) psssparam strRetMsg NULL 返回消息 說(shuō)明 錯(cuò)誤代碼及信息統(tǒng)一定制 日后將形成附加文檔 2 2 ETL 模塊劃分模塊劃分 由于 ETL 調(diào)度工具的特性 一個(gè)表對(duì)表的 ETL 過(guò)程必須單獨(dú)形成一個(gè)獨(dú)立可執(zhí)行文件供 ETL 工具調(diào)度 注 數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)由 ETL 工具直接生成 不需要編寫(xiě)代碼 2 3 代碼編寫(xiě)規(guī)范代碼編寫(xiě)規(guī)范 2 3 1 編寫(xiě)目的編寫(xiě)目的 編碼規(guī)范對(duì)于程序員而言尤為重要 有以下幾個(gè)原因 一個(gè)軟件的生命周期中 80 的花費(fèi)在于維護(hù) 幾乎沒(méi)有任何一個(gè)軟件 在其整個(gè)生命周期中 均由最初的開(kāi)發(fā)人員來(lái)維護(hù) 編碼規(guī)范可以改善軟件的可讀性 可以讓程序員盡快而徹底地理解新的代碼 如果你將源碼作為產(chǎn)品發(fā)布 就需要確任它是否被很好的打包并且清晰無(wú)誤 一如你已 構(gòu)建的其它任何產(chǎn)品 為了執(zhí)行規(guī)范 每個(gè)軟件開(kāi)發(fā)人員必須一致遵守編碼規(guī)范 好的代碼規(guī)范是產(chǎn)品開(kāi)發(fā)的生命線 制定本規(guī)范是希望在整個(gè)小組 內(nèi)形成一個(gè)統(tǒng)一的代 碼風(fēng)格 提高代碼的可維護(hù)性 2 3 2 代碼編寫(xiě)通用規(guī)范代碼編寫(xiě)通用規(guī)范 無(wú)論是 SQL 還是 C C 語(yǔ)言 ETL 小組的程序員必須遵循以下幾個(gè)共同準(zhǔn)則 2 3 2 1最重要的規(guī)則最重要的規(guī)則 保持簡(jiǎn)單 優(yōu)雅的設(shè)計(jì)通常勝過(guò)復(fù)雜的編碼 ETL 開(kāi)發(fā)規(guī)范 第 9 頁(yè) 共 27 頁(yè) 2 3 2 2代碼自文檔化代碼自文檔化 要求編碼人員將一部分基本文檔直接以注釋的形式輸入代碼中 并持續(xù)維護(hù)這些文檔 具體要求如 下 2 3 2 2 1模塊代碼頭注釋要求模塊代碼頭注釋要求 模塊頭部說(shuō)明 要求編碼人員在模塊頭部位置注釋模塊信息 包括模塊名稱 模塊標(biāo)識(shí) 模塊的主要邏輯 示例 功能 刪除保留周期之外的記錄 輸入?yún)?shù) iv c table name IN VARCHAR2 當(dāng)前進(jìn)行數(shù)據(jù)抽取表名 iv c table name IN VARCHAR2 表屬主名 iv c cycle id IN VARCHAR2 數(shù)據(jù)抽取對(duì)應(yīng)周期 iv n data cycle IN NUMBER 數(shù)據(jù)保留周期 iv c cycle col IN VARCHAR2 周期字段 輸出參數(shù) ov n sqlcode OUT NUMBER 處理結(jié)果 ov c sqlerrm OUT VARCHAR2 處理結(jié)果信息 程序說(shuō)明 因刪除記錄并不能釋放 ORACLE 里被占用的數(shù)據(jù)塊表空間 它只把那些被刪除的數(shù)據(jù)塊標(biāo)成 unused 故將數(shù)據(jù)控制在 一定保留周期之內(nèi)的時(shí)候不可以采用 DELETE 記錄的方式 而需要數(shù)據(jù)轉(zhuǎn)存后進(jìn)行表的重新生成 版本號(hào) V1 0 0 作者 魏凌 創(chuàng)建日期 2003 12 10 2 3 2 2 2代碼段落注釋要求代碼段落注釋要求 每個(gè)代碼的段落必須進(jìn)行簡(jiǎn)要注釋 內(nèi)容包括段落的大致功能 幫助讀者進(jìn)行總體理解 如果 段落邏輯比較復(fù)雜 可以增加邏輯方面的注釋 示例 修改運(yùn)行結(jié)束日志 ETL 開(kāi)發(fā)規(guī)范 第 10 頁(yè) 共 27 頁(yè) UPDATE mc APP RUN LOG SET end time iv d end time run result iv c run result err msg iv c err msg WHERE app id iv n app id AND etl cycle id iv c cycle id AND cycle seq v n max cycle seq COMMIT 2 3 2 2 3代碼行注釋要求代碼行注釋要求 1 避免不必要的行注釋 保證代碼 變量可讀的前提下建議不使用行注釋 2 使用行注釋解釋對(duì)讀者可能是晦澀的代碼 示例 20P 表示銷帳 20Q 表示欠費(fèi) SELECT COUNT INTO N CNT FROM ACCT ITEM 200308 WHERE ACCT ITEM STATE NOT IN 20P 20Q 2 3 2 2 4新增 修改注釋新增 修改注釋 修改和新增的代碼段應(yīng)該打上相應(yīng)的標(biāo)記 修改日期 動(dòng)作類型 修改者 版本號(hào) 這樣便于維護(hù) 人員了解修改的內(nèi)容 對(duì)于需要?jiǎng)h除的代碼段暫時(shí)只允許采用注釋的方式進(jìn)行刪除 在一段時(shí)間后 統(tǒng) 一整理刪除 這樣有利于代碼的回滾 2 3 2 2 5其他類型的注釋其他類型的注釋 其他類型的注釋用來(lái)幫助記錄代碼或者自文檔化時(shí)附加的信息 例如對(duì)正式發(fā)布的代碼進(jìn)行本地化 修改時(shí)的注釋等 ETL 開(kāi)發(fā)規(guī)范 第 11 頁(yè) 共 27 頁(yè) 2 3 2 2 6代碼和注釋的維護(hù)要求代碼和注釋的維護(hù)要求 1 一致性 在代碼的整個(gè)生命周期中 必須保障代碼和相應(yīng)的注釋一致性 2 歷史性 對(duì)已經(jīng)正式發(fā)布的代碼進(jìn)行維護(hù) 修改活動(dòng)必須保留一定的痕跡 2 3 3 SQL 代碼編寫(xiě)規(guī)范代碼編寫(xiě)規(guī)范 2 3 3 1統(tǒng)一編輯統(tǒng)一編輯 為避免已經(jīng)編輯好的代碼格式被打亂 影響代碼閱讀 統(tǒng)一使用編輯器 UltraEdit 32 或是 PLSQL DEVELOPER 版本不限 使用縮進(jìn)格式幫助表示代碼結(jié)構(gòu) 段落 分組 縮進(jìn)可以使用 TAB TAB 應(yīng)該設(shè)為 4 位 按照模塊代碼的大致邏輯對(duì)代碼進(jìn)行分段 并使用兩行空行進(jìn)行段落劃分 2 3 3 2注釋的位置和標(biāo)識(shí)注釋的位置和標(biāo)識(shí) 注釋一般位于相應(yīng)代碼的正上方或者尾隨對(duì)應(yīng)的代碼 注釋和相應(yīng)的代碼之間不應(yīng)有分割象征意義 的編輯符號(hào)存在 如 空行 必須使用 標(biāo)識(shí)段落注釋 必須使用 標(biāo)識(shí)頭注釋 必須使用 標(biāo)識(shí)行注釋 對(duì)于其他類型的注釋不作標(biāo)識(shí)符號(hào)的要求 2 3 3 3代碼運(yùn)行跟蹤代碼運(yùn)行跟蹤 所有的 SQL 代碼均需要定義位置變量 v c place 標(biāo)識(shí)出代碼目前執(zhí)行到的位置 程序運(yùn)行完成之后 也需要將位置信息結(jié)合完成寫(xiě)入日志 以方便快捷地定位程序執(zhí)行完成時(shí)代碼所運(yùn)行到的步驟 2 3 3 4程序版本說(shuō)明程序版本說(shuō)明 在存儲(chǔ)過(guò)程的變量區(qū)首部 必須定義一個(gè)變量 v VER 新創(chuàng)建時(shí) 值為 1 0 0 后面由 SCM 負(fù)責(zé)根據(jù) ETL 開(kāi)發(fā)規(guī)范 第 12 頁(yè) 共 27 頁(yè) 版本情況進(jìn)行更改 工程實(shí)施人員根據(jù)這個(gè)變量的值 來(lái)判定當(dāng)前的程序是否是最新的程序 2 3 3 5模塊入口和出口模塊入口和出口 每個(gè)模塊入口時(shí)必須初始化模塊返回標(biāo)志為正常狀態(tài) 每個(gè)模塊只有一個(gè)正常出口 和一個(gè)出錯(cuò)出口 可以包含多個(gè)特定的出錯(cuò)處理但是必須有一個(gè)缺省 定義的出錯(cuò)處理 要求將正常出口和出錯(cuò)出口統(tǒng)一編寫(xiě) 定義在模塊代碼的尾部 具體參見(jiàn)本小節(jié)中統(tǒng) 一模塊代碼框架項(xiàng)目 2 3 3 6模塊代碼框架例子模塊代碼框架例子 PROCEDURE P TICUST ALL iv c cycle id IN VARCHAR2 iv n cycle type IN NUMBER ov n sqlcode OUT NUMBER ov c sqlerrm OUT VARCHAR2 IS 功能 進(jìn)行接口系統(tǒng)客戶檔案相關(guān)數(shù)據(jù)抽取 輸入?yún)?shù) iv c cycle id IN VARCHAR2 數(shù)據(jù)抽取對(duì)應(yīng)周期 iv n cycle type IN NUMBER 抽取周期類型 輸出參數(shù) ov n sqlcode OUT NUMBER ORACLE 錯(cuò)誤代碼 ov c sqlerrm OUT VARCHAR2 ORACLE 錯(cuò)誤信息 版本號(hào) V1 0 0 作者 LiHui 創(chuàng)建日期 2003 11 08 v c ver VARCHAR2 10 V1 0 0 程序版本號(hào)變量 v n app id NUMBER 程序 APP ID 變量 v d start time DATE 程序開(kāi)始時(shí)間變量 v c place VARCHAR2 100 程序運(yùn)行位置變量 v n data cycle NUMBER 數(shù)據(jù)保留周期 v c sql VARCHAR2 4000 動(dòng)態(tài) SQL 變量 v c begin date VARCHAR2 14 開(kāi)始日期 v c end date VARCHAR2 14 結(jié)束日期 v c cycle id VARCHAR2 14 抽取周期 v c int type CHAR 1 增量類型 v e errs EXCEPTION v n count NUMBER ETL 開(kāi)發(fā)規(guī)范 第 13 頁(yè) 共 27 頁(yè) BEGIN ov n sqlcode 0 ov c sqlerrm 客戶檔案相關(guān)數(shù)據(jù)抽取 P TICUST ALL 保留 iv c cycle id 初值 v c cycle id iv c cycle id v c place 計(jì)算當(dāng)前周期標(biāo)識(shí) PUB PKG PUB SP GET CYCLE DATE v c cycle id iv n cycle type v c begin date v c end date ov n sqlco de ov c sqlerrm IF ov n sqlcode 0 THEN RAISE v e errs END IF v c place 讀取程序?qū)?yīng) APP ID SELECT PROCESS ID INTO v n app id FROM mc fd process WHERE PROCESS INFO P TICUST ALL v c place 寫(xiě)程序開(kāi)始日志 v d start time sysdate PKG PUB SP WRITE RUN LOG v n app id v c ver v c cycle id v d start time null null null IF ov n sqlcode 0 THEN RAISE v e errs END IF 先依據(jù)傳入的數(shù)據(jù)抽取周期調(diào)用公共函數(shù) 取出對(duì)應(yīng)的開(kāi)始和結(jié)束日期 v c place 讀取周期對(duì)應(yīng)開(kāi)始和結(jié)束時(shí)間 PKG PUB SP GET CYCLE DATE v c cycle id iv n cycle type v c begin date v c end date ov n sqlcode o v c sqlerrm IF ov n sqlcode 0 THEN RAISE v e errs END IF 判斷數(shù)據(jù)抽取方式 IF LENGTH v c cycle id 6 THEN v c int type F ELSE v c int type I ETL 開(kāi)發(fā)規(guī)范 第 14 頁(yè) 共 27 頁(yè) END IF v c place 讀取 TICUST CUST 表數(shù)據(jù)保留周期 SELECT DATA STORE CYCLE INTO v n data cycle FROM TIMAN STORE CYCLE CFG WHERE INT TABLE NAME TICUST CUST v c place 刪除保留周期之外及當(dāng)前周期的數(shù)據(jù) PKG PUB SP DEL SPILTH REC TICUST CUST IPD v c cycle id v n data cycle INT CYCLE ID ov n sql code ov c sqlerrm IF ov n sqlcode 0 THEN RAISE v e errs END IF SELECT COUNT into v n count FROM all indexes WHERE INDEX NAME IDX TICUST CUST IC AND OWNER IPD IF v n count 0 THEN v c place 刪除已存在的索引 IDX TICUST CUST IC PKG PUB SP EXEC DSQL DROP INDEX IPD IDX TICUST CUST IC ov n sqlcode IF ov n sqlcode 0 THEN RAISE v e errs END IF END IF v c place 先取 SICUST CUST 表中對(duì)應(yīng) TICUST CUST 的數(shù)據(jù) 抽取客戶檔案數(shù)據(jù) v c place 抽取客戶檔案數(shù)據(jù) v c sql INSERT INTO TICUST CUST CUST ID CUST SEQ CUST CODE CUST NAME UP CUST ID AREA ID CERT NBR VIP CUST TYPE ID CUST GRADE ID CONS GRADE ID INDUS CAT ID ZIPCODE CREATED DATE REGION MEMO MODI DATE ADDRESS ID STATE INT DATE INT FLAG INT CYCLE ID SELECT CUSTOMER ID NVL CHG SERN 0 CUSTOMER ID CUST NAME PARENT ID XJDM SOCIAL ID VIP NBR NVL CUST CLASS 3 CUST LEV CUST LEV TRIM CUST STYLE POSTCODE CREATE DATE LATN ID BZ CHG DATE LPAD CUSTOMER ID 15 0 DECODE CUST STATE 70A 10A 70H 10X 70X 10X CUST STATE ETL 開(kāi)發(fā)規(guī)范 第 15 頁(yè) 共 27 頁(yè) sysdate 0 v c cycle id FROM SICUST CUST IF v c int type I THEN v c sql v c sql WHERE CHG DATE TO DATE v c begin date YYYYMMDDHH24MISS AND CHG DATE TO DATE v c end date YYYYMMDDHH24MISS END IF EXECUTE IMMEDIATE v c sql COMMIT v c place 創(chuàng)建索引 IDX TICUST CUST IC EXECUTE IMMEDIATE CREATE INDEX IDX TICUST CUST IC ON TICUST CUST INT CYCLE ID TABLESPACE TBS IPD IDX storage initial 5M next 5M v c place 程序正常結(jié)束 ov c sqlerrm v c place ov c sqlerrm 寫(xiě)程序結(jié)束日志 PKG PUB SP WRITE RUN LOG v n app id v c ver v c cycle id v d start time sysdate 0 ov c sqlerrm EXCEPTION WHEN v e errs THEN ROLLBACK ov n sqlcode SQLCODE ov c sqlerrm ov n sqlcode v c place ov c sqlerrm SQLERRM 寫(xiě)程序結(jié)束日志 PKG PUB SP WRITE RUN LOG v n app id v c ver v c cycle id v d start time sysdate 1 ov c sqlerrm WHEN OTHERS THEN ROLLBACK ov n sqlcode SQLCODE ov c sqlerrm ov n sqlcode v c place ov c sqlerrm SQLERRM 寫(xiě)程序結(jié)束日志 PKG PUB SP WRITE RUN LOG v n app id v c ver v c cycle id v d start time sysdate 1 ov c sqlerrm END P TICUST ALL ETL 開(kāi)發(fā)規(guī)范 第 16 頁(yè) 共 27 頁(yè) 2 3 3 7SQL 語(yǔ)句書(shū)寫(xiě)要求語(yǔ)句書(shū)寫(xiě)要求 1 SQL 語(yǔ)句中 關(guān)鍵字 命令 函數(shù) 表名 字段名等一律采用大寫(xiě)字母標(biāo)識(shí) 2 SQL 語(yǔ)句中 對(duì)自定義變量 自定義表名 字段名等一律采用小寫(xiě)字母標(biāo)識(shí) 3 對(duì)復(fù)雜的 SQL 語(yǔ)句 要求使用縮進(jìn) 分層 添加括號(hào)等編輯手段以方便閱讀 維護(hù) 2 3 3 8使用系統(tǒng)資源的約定使用系統(tǒng)資源的約定 1 建立表 索引等存儲(chǔ)實(shí)體的時(shí)候 需要指定表空間及存儲(chǔ)策略 存儲(chǔ)策略需要依據(jù)存儲(chǔ)的實(shí)際容量來(lái) 計(jì)算 盡量減少存儲(chǔ)的分配次數(shù)及浪費(fèi) 2 所有臨時(shí)表均需要建立在系統(tǒng)指定的臨時(shí)表存放的空間 臨時(shí)表使用完之后立即刪除 以避免占用系 統(tǒng)空間 3 使用系統(tǒng)耦合資源時(shí) 注意釋放 如元數(shù)據(jù)和數(shù)據(jù)抽取監(jiān)控的日志表資源 INSERT UPDATE 等動(dòng)作后 必須立即 COMMIT 保障模塊執(zhí)行完畢后全部釋放占用的臨時(shí)表空間 注意根據(jù)本規(guī)范中數(shù)據(jù)庫(kù)規(guī)范 一章中的臨時(shí)表命名規(guī)范命名所使用的臨時(shí)表 避免與其他模塊所使用的臨時(shí)表的表名重復(fù) 造成耦 合錯(cuò)誤 2 3 3 9數(shù)據(jù)重抽支持?jǐn)?shù)據(jù)重抽支持 模塊代碼要求無(wú)條件支持同批數(shù)據(jù)的重新抽取 如果確實(shí)無(wú)法支持的 必須報(bào)告設(shè)計(jì)人員 進(jìn)行評(píng) 審 文檔記錄 2 3 3 10公用代碼公用代碼約定約定 1 凡是可能多處使用的代碼段 均需要考慮封裝為公用代碼 以統(tǒng)一處理口徑和程序出錯(cuò)時(shí)的代碼修改 量 2 公用代碼在處理過(guò)程中出錯(cuò)不寫(xiě)錯(cuò)誤日志 但需要但錯(cuò)誤代碼和錯(cuò)誤信息反饋給調(diào)用方 由調(diào)用方進(jìn) 行錯(cuò)誤處理 3 所有公用代碼進(jìn)行打包封裝 統(tǒng)一放在 PUB 用戶下 公用代碼指定幾個(gè)人員維護(hù) 并非所有程序員對(duì) 其都有維護(hù)的權(quán)限 2 3 4 C C 編程規(guī)范編程規(guī)范 2 3 4 1命名規(guī)則命名規(guī)則 我們?cè)诔绦蛟O(shè)計(jì)和開(kāi)發(fā)過(guò)程中 會(huì)涉及到許多各類的命名 其中有公用 所有系統(tǒng)共同使用 的和 ETL 開(kāi)發(fā)規(guī)范 第 17 頁(yè) 共 27 頁(yè) 各自私用 單一系統(tǒng)使用 的 為了使各類的命名層次整齊 清晰明了 統(tǒng)一作如下規(guī)定 2 3 4 2常量命名規(guī)則常量命名規(guī)則 常量必須全部使用大寫(xiě) 且都集中放于頭文件中 且在聲明后加上注釋 例如 HLR 的最多個(gè)數(shù) defineMAXHLRNUM 5 如為用 const 定義的常量時(shí) 也應(yīng)全部使用大寫(xiě) 且都要集中放于頭文件中 在聲明后加注釋 例如 用戶名的最大長(zhǎng)度 const int MAXIDLENGTH 30 2 3 4 3結(jié)構(gòu)命名規(guī)則結(jié)構(gòu)命名規(guī)則 結(jié)構(gòu)用大寫(xiě)的 S 作為前綴 前綴的下一個(gè)字母用大寫(xiě) 結(jié)構(gòu)中的變量需遵循變量命名規(guī)則 結(jié)構(gòu)體都集中放于頭文件中 且在聲明后加上注釋 結(jié)構(gòu)體內(nèi)各行和關(guān)鍵字行相差一個(gè) Tab 不得使用空格代替 請(qǐng)看如下的代碼 struct SVosInfo 進(jìn)程號(hào) pid t pidVospid 存放與 VOS 相連進(jìn)程的狀態(tài)信息 char cpVosmonitor O C MAXMONITORLEN 存放與 VOS 相連進(jìn)程的用途信息 char cpVosmonitorinfo O C MAXMONITORLEN 2 3 4 4類命名規(guī)則類命名規(guī)則 類用大寫(xiě)的 C 作為前綴 前綴的下一個(gè)字母用大寫(xiě) 類中的變量必須用 m 開(kāi)始 其后需遵循變量命名規(guī)則 類都集中放于頭文件中 且在聲明后加上注釋 且類中的各個(gè)變量 函數(shù)等都要加上注釋 類內(nèi)各行和關(guān)鍵字行相差一個(gè) tab 不得使用空格代替 請(qǐng)看如下的代碼 ETL 開(kāi)發(fā)規(guī)范 第 18 頁(yè) 共 27 頁(yè) class CVosInfo private 進(jìn)程號(hào) int m iVospid public 得到進(jìn)程號(hào) int fnGetpid 2 3 4 5變量的命名規(guī)則變量的命名規(guī)則 用小寫(xiě)字母的前綴表示變量的類型 前綴的下一個(gè)字母用大寫(xiě) 前綴類型例子 bBoolean 布爾 bIsParent bybyte 字節(jié) byFlag cp cchar 字符串 字符 cpText cTemp o對(duì)象實(shí)例oMain fnFunction 函數(shù) fnCallback iint 整型 iHello nunsigned int 無(wú)符號(hào)整型 nSend ppointer 指針 pFind strstring CString 類 strReceive llong 長(zhǎng)整型 lWind pidpid t 進(jìn)程類型 pidGetid sstructure 結(jié)構(gòu)實(shí)例 sVosInfo fklforkLock 進(jìn)程鎖 fklSignal trlthreadLock 線程鎖 trlPthread tidtid 線程 ID tidHello trcthrCond 線程條件變量 trcFlag lstlist 列表 lstCUserGuest f float 浮點(diǎn)數(shù) fSize ddouble 雙精度型 dHigh fpfile 文件 fpStudent stmstream 流 stmHello vpvoid 類型指針vpNULL tttime t ttStart shshort 短整數(shù) shHello 說(shuō)明 1 類指針命名 以小寫(xiě) p 開(kāi)頭 后接類名 參見(jiàn)類命名規(guī)則 或者縮寫(xiě) 縮寫(xiě)一般用類名的大寫(xiě)字 ETL 開(kāi)發(fā)規(guī)范 第 19 頁(yè) 共 27 頁(yè) 母表示 2 結(jié)構(gòu)指針命名 以小寫(xiě) p 開(kāi)頭 后接結(jié)構(gòu)名 參見(jiàn)結(jié)構(gòu)命名規(guī)則 或者 縮寫(xiě)一般用類名的大寫(xiě) 字母表示 3 由于 list 是由實(shí)體類與模板類共同組成的 因此在命名時(shí) 遵守以下規(guī)則 lst 實(shí)體類類名 列表意義名 如 實(shí)體類為 CUser列表意義名為Guest 那么列表名就為lstCUserGuest 4 普通類型的指針命名 以該類型縮寫(xiě)字母打頭 后跟指針標(biāo)記 p 如 lpIndex 表示一個(gè)長(zhǎng)整形的指針 2 3 4 6全局變量命名規(guī)則全局變量命名規(guī)則 全局變量必須以 g 開(kāi)頭 其后需符合變量命名規(guī)則 如 int g iGetindex 2 3 4 7類中類中 next 指針約定指針約定 在類中經(jīng)常會(huì)使用 next 用以指向下一個(gè)對(duì)象 對(duì)此約定命名仍為 next 如 class CTest private CTest next 2 3 4 8類中類中 prev 指針約定指針約定 在類中經(jīng)常會(huì)使用 prev 用以指向前一個(gè)對(duì)象 對(duì)此約定命名仍為 prev 如 class CTest private CTest prev 2 3 4 9類型命名規(guī)則類型命名規(guī)則 在用 typedef 定義新的類型名時(shí) 應(yīng)以 T 開(kāi)頭 用其定義的變量用 t 開(kāi)頭 其后需符合變量命名規(guī) 則 如 typedef struct double re im TComplex TComplex tProc ETL 開(kāi)發(fā)規(guī)范 第 20 頁(yè) 共 27 頁(yè) 2 3 4 10編制風(fēng)格編制風(fēng)格 本文所謂的編制風(fēng)格 僅僅指的是對(duì)編寫(xiě)程序時(shí)的書(shū)寫(xiě)表現(xiàn)形式的規(guī)定 與程序結(jié)構(gòu)和組織形式無(wú) 關(guān) 2 3 4 11類編制規(guī)則類編制規(guī)則 在編制類時(shí) 需在類的頭部進(jìn)行聲明 包括類的名稱 Class 類的用途 Purpose 請(qǐng)看如下的代碼 Class CList Purpose 一個(gè)列表類 用于存放某一對(duì)象的列表 主要實(shí)現(xiàn)有 增加對(duì)象 查找對(duì)象 得到對(duì)象以及將列表清空 2 3 4 12函數(shù)體編制規(guī)則函數(shù)體編制規(guī)則 在編制函數(shù)的時(shí)候 除了在 2 4 中提到的對(duì)放于頭文件中原型說(shuō)明的要求 在源程序文件中 函數(shù)前 需用統(tǒng)一的格式寫(xiě)清函數(shù)用途說(shuō)明 Purpose 和返回值說(shuō)明 Return 以及參數(shù) parameters 和方法 methods 請(qǐng)看如下的代碼 例 1 Function COCIInterface fnInit handles Parameters m Envhp OCI 環(huán)境句柄指針 m Srvhp 服務(wù)器上下文句柄指針 m Svchp 服務(wù)上下文句柄指針 m Errhp 出錯(cuò)報(bào)告句柄指針 m Authp 用戶會(huì)話句柄指針 mode 初始化模式 Purpose 初始化連接句柄 Return 0 成功 1 失敗 例 2 ETL 開(kāi)發(fā)規(guī)范 第 21 頁(yè) 共 27 頁(yè) Function fnAvoidRestart Purpose 防止重起的函數(shù)實(shí)現(xiàn) Method 使用文件記錄程序信息的方法 當(dāng)運(yùn)行某個(gè)程序時(shí) 先查找某特定文件 如果沒(méi)有該文件 無(wú)人為故意刪除 說(shuō)明是第一次運(yùn)行該程序 刷新 該 文件 否則 讀出里面的進(jìn)程信息 與當(dāng)前進(jìn)程信息進(jìn)行比較 如果進(jìn) 程 號(hào)與進(jìn)程名都相同的話 說(shuō)明 該程序目前正在運(yùn)行 Return 無(wú) 例 3 Function fnVosAuth Purpose 用于完成與 VOS 連接的認(rèn)證工作 Return 0 認(rèn)證成功 1 認(rèn)證失敗 繼續(xù)進(jìn)行連接 int fnVosAuth int iClientsock class OVosconnect oVosconnect struct SMainconnect sMainconnect int iVosauthflag char chReceivedata 10240 chReceivedata 0 0 if fnVosconnect iClientsock oVosconnect sMainconnect iVosauthflag chReceivedata 0 return 1 if fnHLRlogin iClientsock oVosconnect iVosauthflag chReceivedata 0 return 1 return 0 2 3 4 13過(guò)程體編制規(guī)則過(guò)程體編制規(guī)則 在程序中包括有許多的過(guò)程體 如 while for if else 等 該過(guò)程體處于一對(duì) 中 并且過(guò)程體中要 及時(shí)換行 過(guò)程體內(nèi)各行和關(guān)鍵字行相差一個(gè) tab 不得使用空格代替 另外 在定義數(shù)組時(shí)應(yīng)多使用常 量值來(lái)定義數(shù)組的大小 請(qǐng)看如下的代碼 include define MAXLEN100 int iArreyone MAXLEN ETL 開(kāi)發(fā)規(guī)范 第 22 頁(yè) 共 27 頁(yè) int iArreytwo MAXLEN 在以后的程序中 只要對(duì) worknum 進(jìn)行遍歷 就可以使用 MAXLEN 進(jìn)行控制 for iIndex 0 iIndex MAXLEN iIndex iArreyone iIndex iArreytwo iIndex 2 3 4 14嵌套體編制規(guī)則嵌套體編制規(guī)則 本為要說(shuō)明的嵌套體指的是過(guò)程體中包含過(guò)程體 要求內(nèi)部的過(guò)程體各行同其上一級(jí)過(guò)程體的各行 相差一個(gè) tab 不得使用空格代替 請(qǐng)看如下的代碼 for iIndex 0 iIndex sVoslink iIndex pidVospid pidVospid if g psLink sVoslink iIndex iSocket 0 close g psLink sVoslink iIndex iSocket break 2 3 4 15注釋注釋 注釋只能以 開(kāi)頭 以 結(jié)尾 不允許使用 為了使代碼清晰易懂 易于維護(hù) 在編寫(xiě)代碼的同時(shí) 要加注釋 且注釋要寫(xiě)在所解釋代碼的上一 行 1 1 在頭文件中 常量的聲明后要加注釋 參 2 1 2 2 在類編制時(shí)要加注釋 參 3 1 3 3 在函數(shù)編制時(shí)要加注釋 參 3 2 4 4 在過(guò)程體編制過(guò)程中 要加注釋 例如 處理 m strListOptions 中的每一項(xiàng) while m strListOptions Count 0 每次都獲取 m strListOptions 中的第一項(xiàng) strOption m strListOptions Strings 0 根據(jù) strOption 增加回答數(shù)據(jù) ETL 開(kāi)發(fā)規(guī)范 第 23 頁(yè) 共 27 頁(yè) fnArrangeReply strOption 刪除 m strListOptions 中的第一項(xiàng) m strListOptions Delete 0 5 5 在嵌套體編制 即過(guò)程體中包含過(guò)程體的編制過(guò)程中 每個(gè)過(guò)程體都要加注釋 例如 如果找到 0 x1b 則察看下一個(gè)字符是否是 0 x32 while iIndex 1 如果 0 x1b 的下一字符是 0 x32 清空 strFiltrate 并返回 0 if m strLine iIndex 1 0 x32 m strLine Delete iIndex 2 else 如果 0 x1b 的下一字符不是 0 x32 則刪掉 0 x1b m strLine Delete iIndex 1 繼續(xù)查找 0 x1b iIndex fnFind m strLine 0 x1b 2 3 4 16函數(shù)返回結(jié)果函數(shù)返回結(jié)果 函數(shù)成功 單一成功返回結(jié)果 返回 0 多成功返回結(jié)果 返回 0 1 2 函數(shù)失敗 單一失敗返回結(jié)果 返回 1 多失敗返回結(jié)果 返回 1 2 3 2 3 4 17補(bǔ)充說(shuō)明補(bǔ)充說(shuō)明 編程約定 規(guī)定了在編程中必須遵守的規(guī)則 2 3 4 18變量使用變量使用 不得大量使用全局變量 除非非常需要 對(duì)于全局變量的作用范圍需要嚴(yán)格控制 只允許在 main 函數(shù)和終止函數(shù)中允許使用全局變量 普通 函數(shù) 除 main 函數(shù)和終止函數(shù) 禁止使用全局變量 普通函數(shù)如需要使用全局變量 可通過(guò)傳遞全局變量指針或地址方式使用 普通函數(shù)使用的變量必須以參數(shù)方式傳入或在函數(shù)內(nèi)聲明 不得使用除以上兩種方式以外的變量 ETL 開(kāi)發(fā)規(guī)范 第 24 頁(yè) 共 27 頁(yè) 變量應(yīng)該由完整的單詞組成 不要用簡(jiǎn)寫(xiě) 例如 numberOfPoints 不要寫(xiě)成 numPts 或者 np 變量的作用范圍越廣 對(duì)它的說(shuō)明應(yīng)該越多 越詳細(xì) 不要再變量或函數(shù)名中使用下劃線 變量在同一程序中 不應(yīng)該被重復(fù)用于不同的意圖 如果不是被迫 避免使用無(wú)符號(hào)類型 unsigned unsigned 關(guān)鍵字混淆了函數(shù)的聲明 并且如果額外的 符號(hào)位不是必須的話 沒(méi)有什么好處 變量應(yīng)該再靠近它被使用的地方被聲明 不要把所有的變量聲明寫(xiě)在函數(shù)開(kāi)頭 不要在一個(gè)項(xiàng)目中使用全局變量除非項(xiàng)目太小 你將不能說(shuō)清楚它們?cè)谑裁吹胤?什么時(shí)候被使用 以及它們可能會(huì)有初始化次序問(wèn)題 請(qǐng)嘗試用靜態(tài)類成員和 或者 一個(gè)單件 singleton 類區(qū)管理被廣泛用到 的變量 常量應(yīng)該被定義在盡可能小的范圍 例如 如果一個(gè)常量?jī)H在一個(gè)函數(shù)范圍內(nèi)使用 它應(yīng)該被定義 在這個(gè)函數(shù)內(nèi) 對(duì)邏輯變量 bool 用 int 取代 2 3 4 19注釋使用注釋使用 簡(jiǎn)明的代碼好于有良好注釋的混亂的代碼 所有的努力應(yīng)該用于通過(guò)良好的設(shè)計(jì) 簡(jiǎn)單化 良好的 命名和 規(guī)劃產(chǎn)生簡(jiǎn)明的代碼 應(yīng)該明確注釋只出現(xiàn)在代碼不清晰的地方 避免被迫注釋一些例如作者 日期 類名 函數(shù)名 修改列表之類很快就會(huì)過(guò)期或者通常不是必要的 東西 如果需要 嘗試使用 source control 或者其它工具去加入這一類的信息 使用 來(lái)注釋掉代碼 這使你可以注釋掉大塊代碼而不妨礙使用 結(jié)構(gòu) 2 3 4 20文件使用文件使用 每一個(gè)類都應(yīng)該有與它的類名相同的一個(gè)單獨(dú)的源文件和一個(gè)單獨(dú)的頭文件 例如 類 FooBar 應(yīng)該 被定義在 FooBar h 文件里 且被定位在 FooBar cxx 文件里 實(shí)現(xiàn)文件的擴(kuò)展名 例如 c cc cpp cxx 依賴于你的編譯器 cpp 可能是最流行的 其次是 c 使用預(yù)編譯過(guò)的頭文件 這能極大的加快編譯速度 但是同時(shí)也提供了一個(gè)固定位子去 include 所有 的系統(tǒng)和庫(kù)頭文件 以至它們不必在別處再被 include 避免在 include 定義中加入絕對(duì)路徑或者相對(duì)路徑 應(yīng)該將目錄或者更目錄加入 makefile 中的包含路徑 列表中 例如把 path libraries 作為包含目錄 把 include LibrarySubDir filename h 定義在預(yù)編譯頭文件中 除了在基類頭文件中 不要在頭文件中放 include 這將極大加快編譯速度 這可能產(chǎn)生一些問(wèn)題 如 果頭文件需要一些其它類作為函數(shù)參數(shù)或者類成員 解決這個(gè)問(wèn)題的方法是 在頭文件里預(yù)先定義這個(gè) 類并保持一個(gè)成員引用 這些成員使用構(gòu)造函數(shù)在堆里產(chǎn)生 當(dāng)然使用析構(gòu)函數(shù)釋放 ETL 開(kāi)發(fā)規(guī)范 第 25 頁(yè) 共 27 頁(yè) 2 3 4 21編碼式樣編碼式樣 一行應(yīng)該只有一個(gè)表達(dá)式 例如常見(jiàn)的行如下 if doSomething false should be split into two lines result doSomething if result false 避免使用 goto 然而使用 goto 以跳出一系列嵌套的循環(huán)是有用的 一個(gè)更好的方法是將

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論