The important thing in life is to have a great aim , and the determination

          導(dǎo)航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          留言簿(7)

          隨筆分類

          隨筆檔案

          文章檔案

          相冊

          閱讀排行榜

          評論排行榜

          常用鏈接

          統(tǒng)計

          IT技術(shù)鏈接

          保險相關(guān)

          友情鏈接

          基金知識

          生活相關(guān)

          最新評論

          #

          在python中獲取mac和ip地址

          python 獲得本機MAC地址:
          import uuid
               def get_mac_address():
               mac=uuid.UUID(int=uuid.getnode()).hex[-12:]
               return ":".join([mac[e:e+2] for e in range(0,11,2)])


          python獲取IP的方法:使用socket

          import socket

          myname=socket.getfqdn(socket.gethostname( ))
              myaddr=socket.gethostbyname(myname)
              print(myname)
              print(myaddr)

          posted @ 2017-05-15 23:26 鴻雁 閱讀(256) | 評論 (0)編輯 收藏

          Spring—Quartz定時調(diào)度CronTrigger時間配置格式說明與實例

          spring中使用Quartz時 時間配置例子:

          <!-- 定義調(diào)用對象和調(diào)用對象的方法 end   -->
          <!-- 定義調(diào)用時間 begin -->
          <bean id="realweatherTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
          <property name="jobDetail">
          <ref bean="realweatherTask" />
          </property>
          <property name="cronExpression">
          <value>0 10/30 * * * ?</value><!-- 表示每小時的10,40時執(zhí)行任務(wù) -->
          </property>
          </bean>
          <!-- 定義調(diào)用時間 end   -->


          <!-- 定義調(diào)用對象和調(diào)用對象的方法 end   -->
          <!-- 定義調(diào)用時間 begin -->
          <bean id="weatherTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
          <property name="jobDetail">
          <ref bean="weatherTask" />
          </property>
          <property name="cronExpression">
          <!--  <value>0 30 8,13 * * ?</value>  --><!-- 表示每天的8:30和13:30時執(zhí)行任務(wù) -->
          <value>0 0,30 0-23 * * ?</value><!---表示每天從0-23時中每時的整點或半點執(zhí)行任務(wù)->
          </property>
          </bean>

          <!-- 定義調(diào)用時間 end   -->1、   CronTrigger時間格式配置說明

          CronTrigger配置格式:

          格式: [秒] [分] [小時] [日] [月] [周] [年]

          序號

          說明

          是否必填

          允許填寫的值

          允許的通配符

          1

          0-59 

          , - * /

          2

          0-59

          , - * /

          3

          小時

          0-23

          , - * /

          4

          1-31

          , - * ? / L W

          5

          1-12 or JAN-DEC

          , - * /

          6

          1-7 or SUN-SAT

          , - * ? / L #

          7

          empty 或 1970-2099

          , - * /

          通配符說明:

          :表示所有值. 例如:在分的字段上設(shè)置 "*",表示每一分鐘都會觸發(fā)。
          ? 
          :表示不指定值。使用的場景為不需要關(guān)心當(dāng)前設(shè)置這個字段的值。例如:要在每月的10號觸發(fā)一個操作,但不關(guān)心是周幾,所以需要周位置的那個字段設(shè)置為"?" 具體設(shè)置為 0 0 0 10 * ?
          - 
          :表示區(qū)間。例如 在小時上設(shè)置 "10-12",表示 10,11,12點都會觸發(fā)。

          , :表示指定多個值,例如在周字段上設(shè)置 "MON,WED,FRI" 表示周一,周三和周五觸發(fā)
          :用于遞增觸發(fā)。如在秒上面設(shè)置"5/15" 表示從5秒開始,每增15秒觸發(fā)(5,20,35,50)。 在月字段上設(shè)置'1/3'所示每月1號開始,每隔三天觸發(fā)一次。
          L :表示最后的意思。在日字段設(shè)置上,表示當(dāng)月的最后一天(依據(jù)當(dāng)前月份,如果是二月還會依據(jù)是否是潤年[leap]), 在周字段上表示星期六,相當(dāng)于"7"或"SAT"。如果在"L"前加上數(shù)字,則表示該數(shù)據(jù)的最后一個。

          例如在周字段上設(shè)置"6L"這樣的格式,則表示“本月最后一個星期五"

          W :表示離指定日期的最近那個工作日(周一至周五). 例如在日字段上設(shè)置"15W",表示離每月15號最近的那個工作日觸發(fā)。如果15號正好是周六,則找最近的周五(14號)觸發(fā), 如果15號是周未,則找最近的下周一(16號)觸發(fā).如果15號正好在工作日(周一至周五),則就在該天觸發(fā)。如果指定格式為 "1W",它則表示每月1號往后最近的工作日觸發(fā)。如果1號正是周六,則將在3號下周一觸發(fā)。(注,"W"前只能設(shè)置具體的數(shù)字,不允許區(qū)間"-").

          'L'和 'W'可以一組合使用。如果在日字段上設(shè)置"LW",則表示在本月的最后一個工作日觸發(fā)

           

          # :序號(表示每月的第幾周星期幾),例如在周字段上設(shè)置"6#3"表示在每月的第三個周星期六.注意如果指定"6#5",正好第五周沒有星期六,則不會觸發(fā)該配置(用在母親節(jié)和父親節(jié)再合適不過了)

          周字段的設(shè)置,若使用英文字母是不區(qū)分大小寫的 MON 與mon相同.

          常用示例:

          格式: [秒] [分] [小時] [日] [月] [周] [年]

          0 0 12 * * ?           每天12點觸發(fā) 
          0 15 10 ? * *          每天10點15分觸發(fā)
           
          0 15 10 * * ?          每天10點15分觸發(fā)
            
          0 15 10 * * ? *        每天10點15分觸發(fā)
            
          0 15 10 * * ? 2005     2005年每天10點15分觸發(fā)
           
          0 * 14 * * ?           每天下午的 2點到2點59分每分觸發(fā)
           
          0 0/5 14 * * ?         每天下午的 2點到2點59分(整點開始,每隔5分觸發(fā)
          )  
          0 0/5 14,18 * * ?        每天下午的 18點到18點59分(整點開始,每隔5分觸發(fā))

          0 0-5 14 * * ?            每天下午的 2點到2點05分每分觸發(fā) 
          0 10,44 14 ? 3 WED        3月分每周三下午的 2點10分和2點44分觸發(fā)
           
          0 15 10 ? * MON-FRI       從周一到周五每天上午的10點15分觸發(fā)
           
          0 15 10 15 * ?            每月15號上午10點15分觸發(fā)
           
          0 15 10 L * ?             每月最后一天的10點15分觸發(fā)
           
          0 15 10 ? * 6L            每月最后一周的星期五的10點15分觸發(fā)
           
          0 15 10 ? * 6L 2002-2005  從2002年到2005年每月最后一周的星期五的10點15分觸發(fā)

          0 15 10 ? * 6#3           每月的第三周的星期五開始觸發(fā) 
          0 0 12 1/5 * ?            每月的第一個中午開始每隔5天觸發(fā)一次
           
          0 11 11 11 11 ?           每年的11月11號 11點11分觸發(fā)(光棍節(jié))

          spring中使用Quartz時 時間配置例子:

          <!-- 定義調(diào)用對象和調(diào)用對象的方法 end   -->
          <!-- 定義調(diào)用時間 begin -->
          <bean id="realweatherTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
          <property name="jobDetail">
          <ref bean="realweatherTask" />
          </property>
          <property name="cronExpression">
          <value>0 10/30 * * * ?</value><!-- 表示每小時的10,40時執(zhí)行任務(wù) -->
          </property>
          </bean>
          <!-- 定義調(diào)用時間 end   -->


          <!-- 定義調(diào)用對象和調(diào)用對象的方法 end   -->
          <!-- 定義調(diào)用時間 begin -->
          <bean id="weatherTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
          <property name="jobDetail">
          <ref bean="weatherTask" />
          </property>
          <property name="cronExpression">
          <!--  <value>0 30 8,13 * * ?</value>  --><!-- 表示每天的8:30和13:30時執(zhí)行任務(wù) -->
          <value>0 0,30 0-23 * * ?</value><!---表示每天從0-23時中每時的整點或半點執(zhí)行任務(wù)->
          </property>
          </bean>
          <!-- 定義調(diào)用時間 end   -->


          posted @ 2017-04-29 12:01 鴻雁 閱讀(323) | 評論 (0)編輯 收藏

          前端內(nèi)容展示操作

          1.有時表格內(nèi)容太多,只顯示部分,其余部分已省略號表示,用css處理如下:
          .template td{
              word-break:keep-all;/* 不換行 */
              white-space:nowrap;/* 不換行 */
              overflow:hidden;/* 內(nèi)容超出寬度時隱藏超出部分的內(nèi)容 */
              text-overflow:ellipsis;/* 當(dāng)對象內(nèi)文本溢出時顯示省略標(biāo)記(...) ;需與overflow:hidden;一起使用。*/
          }

          template 是該表單所在的table class屬性。

          posted @ 2016-03-09 11:36 鴻雁 閱讀(223) | 評論 (0)編輯 收藏

          js 金額 用逗號 隔開數(shù)字格式化

          代碼如下:
          引用

          function fmoney(s, n)  
          {  
             n = n > 0 && n <= 20 ? n : 2;  
             s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";  
             var l = s.split(".")[0].split("").reverse(),  
             r = s.split(".")[1];  
             t = "";  
             for(i = 0; i < l.length; i ++ )  
             {  
                t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : "");  
             }  
             return t.split("").reverse().join("") + "." + r;  
          }


          調(diào)用:fmoney("12345.675910", 3),返回12,345.676

          還原函數(shù):
          引用

          function rmoney(s)  
          {  
             return parseFloat(s.replace(/[^\d\.-]/g, ""));  
          }


          示例(可保存一下代碼為html文件,運行查看效果):
          引用

          <SCRIPT>  
          function fmoney(s, n)  
          {  
             n = n > 0 && n <= 20 ? n : 2;  
             s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";  
             var l = s.split(".")[0].split("").reverse(),  
             r = s.split(".")[1];  
             t = "";  
             for(i = 0; i < l.length; i ++ )  
             {  
                t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : "");  
             }  
             return t.split("").reverse().join("") + "." + r;  
          }  
          function rmoney(s)  
          {  
             return parseFloat(s.replace(/[^\d\.-]/g, ""));  
          }  
          function g(id)  
          {  
             return document.getElementById(id);  
          }  
          window.onload = function()  
          {  
             var num,  
             txt = g("txt"),  
             txt2 = g("txt2"),  
             btn = g("btn"),  
             btn2 = g("btn2"),  
             span = g("span");  
             btn.onclick = function()  
             {  
                num = parseInt(g("num").value);  
                txt.value = fmoney(txt.value, num);  
                txt2.value = fmoney(txt2.value, num);  
             }  
             ;  
             btn2.onclick = function()  
             {  
                num = parseInt(g("num").value);  
                span.innerHTML = "=" + fmoney(rmoney(txt.value) + rmoney(txt2.value), num);  
             }  
             ;  
          }  
          ;  
          </SCRIPT>  
          小數(shù)點位數(shù):  
          <select id="num">  
          <option value="2">2</option>  
          <option value="3">3</option>  
          <option value="4">4</option>  
          <option value="5">5</option>  
          </select>  
          <input type="text" id="txt" value="12345.675910"> +  
          <input type="text" id="txt2" value="1223"> <span id="span"></span>  
          <br>  
          <input type="button" id="btn" value="格式化">  
          <input type="button" id="btn2" value="相加">

          posted @ 2015-09-27 10:23 鴻雁 閱讀(241) | 評論 (0)編輯 收藏

          BigDecimal用法詳解

          一、簡介
          Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進行精確的運算。雙精度浮點型變量double可以處理16位有效數(shù)。在實際應(yīng)用中,需要對更大或者更小的數(shù)進行運算和處理。float和double只能用來做科學(xué)計算或者是工程計算,在商業(yè)計算中要用java.math.BigDecimal。BigDecimal所創(chuàng)建的是對象,我們不能使用傳統(tǒng)的+、-、*、/等算術(shù)運算符直接對其對象進行數(shù)學(xué)運算,而必須調(diào)用其相對應(yīng)的方法。方法中的參數(shù)也必須是BigDecimal的對象。構(gòu)造器是類的特殊方法,專門用來創(chuàng)建對象,特別是帶有參數(shù)的對象。


          二、構(gòu)造器描述 
          BigDecimal(int)       創(chuàng)建一個具有參數(shù)所指定整數(shù)值的對象。 
          BigDecimal(double) 創(chuàng)建一個具有參數(shù)所指定雙精度值的對象。 
          BigDecimal(long)    創(chuàng)建一個具有參數(shù)所指定長整數(shù)值的對象。 
          BigDecimal(String) 創(chuàng)建一個具有參數(shù)所指定以字符串表示的數(shù)值的對象。

          三、方法描述 
          add(BigDecimal)        BigDecimal對象中的值相加,然后返回這個對象。 
          subtract(BigDecimal) BigDecimal對象中的值相減,然后返回這個對象。 
          multiply(BigDecimal)  BigDecimal對象中的值相乘,然后返回這個對象。 
          divide(BigDecimal)     BigDecimal對象中的值相除,然后返回這個對象。 
          toString()                將BigDecimal對象的數(shù)值轉(zhuǎn)換成字符串。 
          doubleValue()          將BigDecimal對象中的值以雙精度數(shù)返回。 
          floatValue()             將BigDecimal對象中的值以單精度數(shù)返回。 
          longValue()             將BigDecimal對象中的值以長整數(shù)返回。 
          intValue()               將BigDecimal對象中的值以整數(shù)返回。

          四、格式化及例子
          由于NumberFormat類的format()方法可以使用BigDecimal對象作為其參數(shù),可以利用BigDecimal對超出16位有效數(shù)字的貨幣值,百分值,以及一般數(shù)值進行格式化控制。

          以利用BigDecimal對貨幣和百分比格式化為例。首先,創(chuàng)建BigDecimal對象,進行BigDecimal的算術(shù)運算后,分別建立對貨幣和百分比格式化的引用,最后利用BigDecimal對象作為format()方法的參數(shù),輸出其格式化的貨幣值和百分比。

          復(fù)制代碼
          public static void main(String[] args) {     
              NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立貨幣格式化引用
              NumberFormat percent = NumberFormat.getPercentInstance(); //建立百分比格式化引用
              percent.setMaximumFractionDigits(3); //百分比小數(shù)點最多3位
              BigDecimal loanAmount = new BigDecimal("15000.48"); //貸款金額
              BigDecimal interestRate = new BigDecimal("0.008"); //利率
              BigDecimal interest = loanAmount.multiply(interestRate); //相乘
              System.out.println("貸款金額:\t" + currency.format(loanAmount));
              System.out.println("利率:\t" + percent.format(interestRate));
              System.out.println("利息:\t" + currency.format(interest)); }
          復(fù)制代碼

          運行結(jié)果如下:

          貸款金額:    ¥15,000.48 
          利率:
          0.8%
          利息: ¥
          120.00

          五、BigDecimal比較
          BigDecimal是通過使用compareTo(BigDecimal)來比較的,具體比較情況如下:

          復(fù)制代碼
          public static void main(String[] args) {     
              BigDecimal a = new BigDecimal("1");
              BigDecimal b = new BigDecimal("2");
              BigDecimal c = new BigDecimal("1");
              int result1 = a.compareTo(b);
              int result2 = a.compareTo(c);
              int result3 = b.compareTo(a);
              System.out.println(result1);
              System.out.println(result2);
              System.out.println(result3);
          }
          復(fù)制代碼

          打印結(jié)果是:-1、0、1,即左邊比右邊數(shù)大,返回1,相等返回0,比右邊小返回-1。
          注意不能使用equals方法來比較大小。

          使用BigDecimal的壞處是性能比double和float差,在處理龐大,復(fù)雜的運算時尤為明顯,因根據(jù)實際需求決定使用哪種類型。

          posted @ 2015-08-22 12:56 鴻雁 閱讀(395) | 評論 (0)編輯 收藏

          oracle列轉(zhuǎn)行

          如果你只是尋求多行轉(zhuǎn)換成一列,比如把同一個id的某個字段col變成一行數(shù)據(jù)庫,把多個col用逗號鏈接起來。下面幾個SQL可以立竿見影。
          《1》最簡短的方式,使用WMSYS.WM_CONCAT:
          SELECT id, REPLACE(wmsys.wm_concat(col), ',', '/') str
          FROM Table1
          GROUP BY id;
          《2》使用sys_connect_by_path:
          SELECT t.id id, MAX(substr(sys_connect_by_path(t.col, ','), 2)) str
          FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY col) rn
          FROM Table1) t
          START WITH rn = 1
          CONNECT BY rn = PRIOR rn + 1
          AND id = PRIOR id
          GROUP BY t.id;
          或者
          SELECT t.id id, substr(sys_connect_by_path(t.col, ','), 2) str
          FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY col) rn
          FROM Table1) t
          WHERE connect_by_isleaf = 1
          START WITH rn = 1
          CONNECT BY rn = PRIOR rn + 1
          AND id = PRIOR id;
          《3》使用MODEL:
          SELECT id, substr(str, 2) str FROM Table1
          MODEL
          RETURN UPDATED ROWS
          PARTITION BY(ID)
          DIMENSION BY(row_number() over(PARTITION BY ID ORDER BY col) AS rn)
          MEASURES (CAST(col AS VARCHAR2(20)) AS str)
          RULES UPSERT
          ITERATE(3) UNTIL( presentv(str[iteration_number+2],1,0)=0)
          (str[0] = str[0] || ',' || str[iteration_number+1])
          ORDER BY 1;
           
           
          下面是原文:
          1.
          概述
          最近論壇很多人提的問題都與行列轉(zhuǎn)換有關(guān)系,所以我對行列轉(zhuǎn)換的相關(guān)知識做了一個總結(jié),希望對大家有所幫助,同時有何錯疏,懇請大家指出,我也是在寫作過程中學(xué)習(xí),算是一起和大家學(xué)習(xí)吧!
          行列轉(zhuǎn)換包括以下六種情況:
          1)
          列轉(zhuǎn)行
          2)
          行轉(zhuǎn)列
          3)
          多列轉(zhuǎn)換成字符串
          4)
          多行轉(zhuǎn)換成字符串
          5)
          字符串轉(zhuǎn)換成多列
          6)
          字符串轉(zhuǎn)換成多行
          下面分別進行舉例介紹。
          首先聲明一點,有些例子需要如下10g及以后才有的知識:
          A.
          掌握model子句
          B.
          正則表達式
          C.
          加強的層次查詢
          討論的適用范圍只包括8i,9i,10g及以后版本。
          2.
          列轉(zhuǎn)行
          CREATE TABLE t_col_row(
          ID INT,
          c1 VARCHAR2(10),
          c2 VARCHAR2(10),
          c3 VARCHAR2(10));
          INSERT INTO t_col_row VALUES (1, 'v11', 'v21', 'v31');
          INSERT INTO t_col_row VALUES (2, 'v12', 'v22', NULL);
          INSERT INTO t_col_row VALUES (3, 'v13', NULL, 'v33');
          INSERT INTO t_col_row VALUES (4, NULL, 'v24', 'v34');
          INSERT INTO t_col_row VALUES (5, 'v15', NULL, NULL);
          INSERT INTO t_col_row VALUES (6, NULL, NULL, 'v35');
          INSERT INTO t_col_row VALUES (7, NULL, NULL, NULL);
          COMMIT;
          SELECT * FROM t_col_row;
          2.1
          UNION ALL
          適用范圍:8i,9i,10g及以后版本
          SELECT id, 'c1' cn, c1 cv
          FROM t_col_row
          UNION ALL
          SELECT id, 'c2' cn, c2 cv
          FROM t_col_row
          UNION ALL
          SELECT id, 'c3' cn, c3 cv FROM t_col_row;
          若空行不需要轉(zhuǎn)換,只需加一個where條件,
          WHERE COLUMN IS NOT NULL 即可。
          2.2
          MODEL
          適用范圍:10g及以后
          SELECT id, cn, cv FROM t_col_row
          MODEL
          RETURN UPDATED ROWS
          PARTITION BY (ID)
          DIMENSION BY (0 AS n)
          MEASURES ('xx' AS cn,'yyy' AS cv,c1,c2,c3)
          RULES UPSERT ALL
          (
          cn[1] = 'c1',
          cn[2] = 'c2',
          cn[3] = 'c3',
          cv[1] = c1[0],
          cv[2] = c2[0],
          cv[3] = c3[0]
          )
          ORDER BY ID,cn;
          2.3
          COLLECTION
          適用范圍:8i,9i,10g及以后版本
          要創(chuàng)建一個對象和一個集合:
          CREATE TYPE cv_pair AS OBJECT(cn VARCHAR2(10),cv VARCHAR2(10));
          CREATE TYPE cv_varr AS VARRAY(8) OF cv_pair;
          SELECT id, t.cn AS cn, t.cv AS cv
          FROM t_col_row,
          TABLE(cv_varr(cv_pair('c1', t_col_row.c1),
          cv_pair('c2', t_col_row.c2),
          cv_pair('c3', t_col_row.c3))) t
          ORDER BY 1, 2;
          3.
          行轉(zhuǎn)列
          CREATE TABLE t_row_col AS
          SELECT id, 'c1' cn, c1 cv
          FROM t_col_row
          UNION ALL
          SELECT id, 'c2' cn, c2 cv
          FROM t_col_row
          UNION ALL
          SELECT id, 'c3' cn, c3 cv FROM t_col_row;
          SELECT * FROM t_row_col ORDER BY 1,2;
          3.1
          AGGREGATE FUNCTION
          適用范圍:8i,9i,10g及以后版本
          SELECT id,
          MAX(decode(cn, 'c1', cv, NULL)) AS c1,
          MAX(decode(cn, 'c2', cv, NULL)) AS c2,
          MAX(decode(cn, 'c3', cv, NULL)) AS c3
          FROM t_row_col
          GROUP BY id
          ORDER BY 1;
          MAX聚集函數(shù)也可以用sum、min、avg等其他聚集函數(shù)替代。
          被指定的轉(zhuǎn)置列只能有一列,但固定的列可以有多列,請看下面的例子:
          SELECT mgr, deptno, empno, ename FROM emp ORDER BY 1, 2;
          SELECT mgr,
          deptno,
          MAX(decode(empno, '7788', ename, NULL)) "7788",
          MAX(decode(empno, '7902', ename, NULL)) "7902",
          MAX(decode(empno, '7844', ename, NULL)) "7844",
          MAX(decode(empno, '7521', ename, NULL)) "7521",
          MAX(decode(empno, '7900', ename, NULL)) "7900",
          MAX(decode(empno, '7499', ename, NULL)) "7499",
          MAX(decode(empno, '7654', ename, NULL)) "7654"
          FROM emp
          WHERE mgr IN (7566, 7698)
          AND deptno IN (20, 30)
          GROUP BY mgr, deptno
          ORDER BY 1, 2;
          這里轉(zhuǎn)置列為empno,固定列為mgr,deptno。
          還有一種行轉(zhuǎn)列的方式,就是相同組中的行值變?yōu)閱蝹€列值,但轉(zhuǎn)置的行值不變?yōu)榱忻?br style="word-wrap: break-word" />ID CN_1 CV_1 CN_2 CV_2 CN_3 CV_3
          1 c1 v11 c2 v21 c3 v31
          2 c1 v12 c2 v22 c3
          3 c1 v13 c2 c3 v33
          4 c1 c2 v24 c3 v34
          5 c1 v15 c2 c3
          6 c1 c2 c3 v35
          7 c1 c2 c3
          這種情況可以用分析函數(shù)實現(xiàn):
          SELECT id,
          MAX(decode(rn, 1, cn, NULL)) cn_1,
          MAX(decode(rn, 1, cv, NULL)) cv_1,
          MAX(decode(rn, 2, cn, NULL)) cn_2,
          MAX(decode(rn, 2, cv, NULL)) cv_2,
          MAX(decode(rn, 3, cn, NULL)) cn_3,
          MAX(decode(rn, 3, cv, NULL)) cv_3
          FROM (SELECT id,
          cn,
          cv,
          row_number() over(PARTITION BY id ORDER BY cn, cv) rn
          FROM t_row_col)
          GROUP BY ID;
          3.2
          PL/SQL
          適用范圍:8i,9i,10g及以后版本
          這種對于行值不固定的情況可以使用。
          下面是我寫的一個包,包中
          p_rows_column_real用于前述的第一種不限定列的轉(zhuǎn)換;
          p_rows_column用于前述的第二種不限定列的轉(zhuǎn)換。
          CREATE OR REPLACE PACKAGE pkg_dynamic_rows_column AS
          TYPE refc IS REF CURSOR;
          PROCEDURE p_print_sql(p_txt VARCHAR2);
          FUNCTION f_split_str(p_str VARCHAR2, p_division VARCHAR2, p_seq INT)
          RETURN VARCHAR2;
          PROCEDURE p_rows_column(p_table IN VARCHAR2,
          p_keep_cols IN VARCHAR2,
          p_pivot_cols IN VARCHAR2,
          p_where IN VARCHAR2 DEFAULT NULL,
          p_refc IN OUT refc);
          PROCEDURE p_rows_column_real(p_table IN VARCHAR2,
          p_keep_cols IN VARCHAR2,
          p_pivot_col IN VARCHAR2,
          p_pivot_val IN VARCHAR2,
          p_where IN VARCHAR2 DEFAULT NULL,
          p_refc IN OUT refc);
          END;
          /
          CREATE OR REPLACE PACKAGE BODY pkg_dynamic_rows_column AS
          PROCEDURE p_print_sql(p_txt VARCHAR2) IS
          v_len INT;
          BEGIN
          v_len := length(p_txt);
          FOR i IN 1 .. v_len / 250 + 1 LOOP
          dbms_output.put_line(substrb(p_txt, (i - 1) * 250 + 1, 250));
          END LOOP;
          END;
          FUNCTION f_split_str(p_str VARCHAR2, p_division VARCHAR2, p_seq INT)
          RETURN VARCHAR2 IS
          v_first INT;
          v_last INT;
          BEGIN
          IF p_seq < 1 THEN
          RETURN NULL;
          END IF;
          IF p_seq = 1 THEN
          IF instr(p_str, p_division, 1, p_seq) = 0 THEN
          RETURN p_str;
          ELSE
          RETURN substr(p_str, 1, instr(p_str, p_division, 1) - 1);
          END IF;
          ELSE
          v_first := instr(p_str, p_division, 1, p_seq - 1);
          v_last := instr(p_str, p_division, 1, p_seq);
          IF (v_last = 0) THEN
          IF (v_first > 0) THEN
          RETURN substr(p_str, v_first + 1);
          ELSE
          RETURN NULL;
          END IF;
          ELSE
          RETURN substr(p_str, v_first + 1, v_last - v_first - 1);
          END IF;
          END IF;
          END f_split_str;
          PROCEDURE p_rows_column(p_table IN VARCHAR2,
          p_keep_cols IN VARCHAR2,
          p_pivot_cols IN VARCHAR2,
          p_where IN VARCHAR2 DEFAULT NULL,
          p_refc IN OUT refc) IS
          v_sql VARCHAR2(4000);
          TYPE v_keep_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
          v_keep v_keep_ind_by;
          TYPE v_pivot_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
          v_pivot v_pivot_ind_by;
          v_keep_cnt INT;
          v_pivot_cnt INT;
          v_max_cols INT;
          v_partition VARCHAR2(4000);
          v_partition1 VARCHAR2(4000);
          v_partition2 VARCHAR2(4000);
          BEGIN
          v_keep_cnt := length(p_keep_cols) - length(REPLACE(p_keep_cols, ',')) + 1;
          v_pivot_cnt := length(p_pivot_cols) -
          length(REPLACE(p_pivot_cols, ',')) + 1;
          FOR i IN 1 .. v_keep_cnt LOOP
          v_keep(i) := f_split_str(p_keep_cols, ',', i);
          END LOOP;
          FOR j IN 1 .. v_pivot_cnt LOOP
          v_pivot(j) := f_split_str(p_pivot_cols, ',', j);
          END LOOP;
          v_sql := 'select max(count(*)) from ' || p_table || ' group by ';
          FOR i IN 1 .. v_keep.LAST LOOP
          v_sql := v_sql || v_keep(i) || ',';
          END LOOP;
          v_sql := rtrim(v_sql, ',');
          EXECUTE IMMEDIATE v_sql
          INTO v_max_cols;
          v_partition := 'select ';
          FOR x IN 1 .. v_keep.COUNT LOOP
          v_partition1 := v_partition1 || v_keep(x) || ',';
          END LOOP;
          FOR y IN 1 .. v_pivot.COUNT LOOP
          v_partition2 := v_partition2 || v_pivot(y) || ',';
          END LOOP;
          v_partition1 := rtrim(v_partition1, ',');
          v_partition2 := rtrim(v_partition2, ',');
          v_partition := v_partition || v_partition1 || ',' || v_partition2 ||
          ', row_number() over (partition by ' || v_partition1 ||
          ' order by ' || v_partition2 || ') rn from ' || p_table;
          v_partition := rtrim(v_partition, ',');
          v_sql := 'select ';
          FOR i IN 1 .. v_keep.COUNT LOOP
          v_sql := v_sql || v_keep(i) || ',';
          END LOOP;
          FOR i IN 1 .. v_max_cols LOOP
          FOR j IN 1 .. v_pivot.COUNT LOOP
          v_sql := v_sql || ' max(decode(rn,' || i || ',' || v_pivot(j) ||
          ',null))' || v_pivot(j) || '_' || i || ',';
          END LOOP;
          END LOOP;
          IF p_where IS NOT NULL THEN
          v_sql := rtrim(v_sql, ',') || ' from (' || v_partition || ' ' ||
          p_where || ') group by ';
          ELSE
          v_sql := rtrim(v_sql, ',') || ' from (' || v_partition ||
          ') group by ';
          END IF;
          FOR i IN 1 .. v_keep.COUNT LOOP
          v_sql := v_sql || v_keep(i) || ',';
          END LOOP;
          v_sql := rtrim(v_sql, ',');
          p_print_sql(v_sql);
          OPEN p_refc FOR v_sql;
          EXCEPTION
          WHEN OTHERS THEN
          OPEN p_refc FOR
          SELECT 'x' FROM dual WHERE 0 = 1;
          END;
          PROCEDURE p_rows_column_real(p_table IN VARCHAR2,
          p_keep_cols IN VARCHAR2,
          p_pivot_col IN VARCHAR2,
          p_pivot_val IN VARCHAR2,
          p_where IN VARCHAR2 DEFAULT NULL,
          p_refc IN OUT refc) IS
          v_sql VARCHAR2(4000);
          TYPE v_keep_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
          v_keep v_keep_ind_by;
          TYPE v_pivot_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
          v_pivot v_pivot_ind_by;
          v_keep_cnt INT;
          v_group_by VARCHAR2(2000);
          BEGIN
          v_keep_cnt := length(p_keep_cols) - length(REPLACE(p_keep_cols, ',')) + 1;
          FOR i IN 1 .. v_keep_cnt LOOP
          v_keep(i) := f_split_str(p_keep_cols, ',', i);
          END LOOP;
          v_sql := 'select ' || 'cast(' || p_pivot_col ||
          ' as varchar2(200)) as ' || p_pivot_col || ' from ' || p_table ||
          ' group by ' || p_pivot_col;
          EXECUTE IMMEDIATE v_sql BULK COLLECT
          INTO v_pivot;
          FOR i IN 1 .. v_keep.COUNT LOOP
          v_group_by := v_group_by || v_keep(i) || ',';
          END LOOP;
          v_group_by := rtrim(v_group_by, ',');
          v_sql := 'select ' || v_group_by || ',';
          FOR x IN 1 .. v_pivot.COUNT LOOP
          v_sql := v_sql || ' max(decode(' || p_pivot_col || ',' || chr(39) ||
          v_pivot(x) || chr(39) || ',' || p_pivot_val ||
          ',null)) as "' || v_pivot(x) || '",';
          END LOOP;
          v_sql := rtrim(v_sql, ',');
          IF p_where IS NOT NULL THEN
          v_sql := v_sql || ' from ' || p_table || p_where || ' group by ' ||
          v_group_by;
          ELSE
          v_sql := v_sql || ' from ' || p_table || ' group by ' || v_group_by;
          END IF;
          p_print_sql(v_sql);
          OPEN p_refc FOR v_sql;
          EXCEPTION
          WHEN OTHERS THEN
          OPEN p_refc FOR
          SELECT 'x' FROM dual WHERE 0 = 1;
          END;
          END;
          /
          4.
          多列轉(zhuǎn)換成字符串
          CREATE TABLE t_col_str AS
          SELECT * FROM t_col_row;
          這個比較簡單,用||或concat函數(shù)可以實現(xiàn):
          SELECT concat('a','b') FROM dual;
          4.1
          || OR CONCAT
          適用范圍:8i,9i,10g及以后版本
          SELECT * FROM t_col_str;
          SELECT ID,c1||','||c2||','||c3 AS c123
          FROM t_col_str;
          5.
          多行轉(zhuǎn)換成字符串
          CREATE TABLE t_row_str(
          ID INT,
          col VARCHAR2(10));
          INSERT INTO t_row_str VALUES(1,'a');
          INSERT INTO t_row_str VALUES(1,'b');
          INSERT INTO t_row_str VALUES(1,'c');
          INSERT INTO t_row_str VALUES(2,'a');
          INSERT INTO t_row_str VALUES(2,'d');
          INSERT INTO t_row_str VALUES(2,'e');
          INSERT INTO t_row_str VALUES(3,'c');
          COMMIT;
          SELECT * FROM t_row_str;
          5.1
          MAX + DECODE
          適用范圍:8i,9i,10g及以后版本
          SELECT id,
          MAX(decode(rn, 1, col, NULL)) ||
          MAX(decode(rn, 2, ',' || col, NULL)) ||
          MAX(decode(rn, 3, ',' || col, NULL)) str
          FROM (SELECT id,
          col,
          row_number() over(PARTITION BY id ORDER BY col) AS rn
          FROM t_row_str) t
          GROUP BY id
          ORDER BY 1;
          5.2
          ROW_NUMBER + LEAD
          適用范圍:8i,9i,10g及以后版本
          SELECT id, str
          FROM (SELECT id,
          row_number() over(PARTITION BY id ORDER BY col) AS rn,
          col || lead(',' || col, 1) over(PARTITION BY id ORDER BY col) ||
          lead(',' || col, 2) over(PARTITION BY id ORDER BY col) ||
          lead(',' || col, 3) over(PARTITION BY id ORDER BY col) AS str
          FROM t_row_str)
          WHERE rn = 1
          ORDER BY 1;
          5.3
          MODEL
          適用范圍:10g及以后版本
          SELECT id, substr(str, 2) str FROM t_row_str
          MODEL
          RETURN UPDATED ROWS
          PARTITION BY(ID)
          DIMENSION BY(row_number() over(PARTITION BY ID ORDER BY col) AS rn)
          MEASURES (CAST(col AS VARCHAR2(20)) AS str)
          RULES UPSERT
          ITERATE(3) UNTIL( presentv(str[iteration_number+2],1,0)=0)
          (str[0] = str[0] || ',' || str[iteration_number+1])
          ORDER BY 1;
          5.4
          SYS_CONNECT_BY_PATH
          適用范圍:8i,9i,10g及以后版本
          SELECT t.id id, MAX(substr(sys_connect_by_path(t.col, ','), 2)) str
          FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY col) rn
          FROM t_row_str) t
          START WITH rn = 1
          CONNECT BY rn = PRIOR rn + 1
          AND id = PRIOR id
          GROUP BY t.id;
          適用范圍:10g及以后版本
          SELECT t.id id, substr(sys_connect_by_path(t.col, ','), 2) str
          FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY col) rn
          FROM t_row_str) t
          WHERE connect_by_isleaf = 1
          START WITH rn = 1
          CONNECT BY rn = PRIOR rn + 1
          AND id = PRIOR id;
          5.5
          WMSYS.WM_CONCAT
          適用范圍:10g及以后版本
          這個函數(shù)預(yù)定義按','分隔字符串,若要用其他符號分隔可以用,replace將','替換。
          SELECT id, REPLACE(wmsys.wm_concat(col), ',', '/') str
          FROM t_row_str
          GROUP BY id;
          6.
          字符串轉(zhuǎn)換成多列
          其實際上就是一個字符串拆分的問題。
          CREATE TABLE t_str_col AS
          SELECT ID,c1||','||c2||','||c3 AS c123
          FROM t_col_str;
          SELECT * FROM t_str_col;
          6.1
          SUBSTR + INSTR
          適用范圍:8i,9i,10g及以后版本
          SELECT id,
          c123,
          substr(c123, 1, instr(c123 || ',', ',', 1, 1) - 1) c1,
          substr(c123,
          instr(c123 || ',', ',', 1, 1) + 1,
          instr(c123 || ',', ',', 1, 2) - instr(c123 || ',', ',', 1, 1) - 1) c2,
          substr(c123,
          instr(c123 || ',', ',', 1, 2) + 1,
          instr(c123 || ',', ',', 1, 3) - instr(c123 || ',', ',', 1, 2) - 1) c3
          FROM t_str_col
          ORDER BY 1;
          6.2
          REGEXP_SUBSTR
          適用范圍:10g及以后版本
          SELECT id,
          c123,
          rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 1), ',') AS c1,
          rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 2), ',') AS c2,
          rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 3), ',') AS c3
          FROM t_str_col
          ORDER BY 1;
          7.
          字符串轉(zhuǎn)換成多行
          CREATE TABLE t_str_row AS
          SELECT id,
          MAX(decode(rn, 1, col, NULL)) ||
          MAX(decode(rn, 2, ',' || col, NULL)) ||
          MAX(decode(rn, 3, ',' || col, NULL)) str
          FROM (SELECT id,
          col,
          row_number() over(PARTITION BY id ORDER BY col) AS rn
          FROM t_row_str) t
          GROUP BY id
          ORDER BY 1;
          SELECT * FROM t_str_row;
          7.1
          UNION ALL
          適用范圍:8i,9i,10g及以后版本
          SELECT id, 1 AS p, substr(str, 1, instr(str || ',', ',', 1, 1) - 1) AS cv
          FROM t_str_row
          UNION ALL
          SELECT id,
          2 AS p,
          substr(str,
          instr(str || ',', ',', 1, 1) + 1,
          instr(str || ',', ',', 1, 2) - instr(str || ',', ',', 1, 1) - 1) AS cv
          FROM t_str_row
          UNION ALL
          SELECT id,
          3 AS p,
          substr(str,
          instr(str || ',', ',', 1, 1) + 1,
          instr(str || ',', ',', 1, 2) - instr(str || ',', ',', 1, 1) - 1) AS cv
          FROM t_str_row
          ORDER BY 1, 2;
          適用范圍:10g及以后版本
          SELECT id, 1 AS p, rtrim(regexp_substr(str||',', '.*?' || ',', 1, 1), ',') AS cv
          FROM t_str_row
          UNION ALL
          SELECT id, 2 AS p, rtrim(regexp_substr(str||',', '.*?' || ',', 1, 2), ',') AS cv
          FROM t_str_row
          UNION ALL
          SELECT id, 3 AS p, rtrim(regexp_substr(str||',', '.*?' || ',',1,3), ',') AS cv
          FROM t_str_row
          ORDER BY 1, 2;
          7.2
          VARRAY
          適用范圍:8i,9i,10g及以后版本
          要創(chuàng)建一個可變數(shù)組:
          CREATE OR REPLACE TYPE ins_seq_type IS VARRAY(8) OF NUMBER;
          SELECT * FROM TABLE(ins_seq_type(1, 2, 3, 4, 5));
          SELECT t.id,
          c.column_value AS p,
          substr(t.ca,
          instr(t.ca, ',', 1, c.column_value) + 1,
          instr(t.ca, ',', 1, c.column_value + 1) -
          (instr(t.ca, ',', 1, c.column_value) + 1)) AS cv
          FROM (SELECT id,
          ',' || str || ',' AS ca,
          length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt
          FROM t_str_row) t
          INNER JOIN TABLE(ins_seq_type(1, 2, 3)) c ON c.column_value <=
          t.cnt
          ORDER BY 1, 2;
          7.3
          SEQUENCE SERIES
          這類方法主要是要產(chǎn)生一個連續(xù)的整數(shù)列,產(chǎn)生連續(xù)整數(shù)列的方法有很多,主要有:
          CONNECT BY,ROWNUM+all_objects,CUBE等。
          適用范圍:8i,9i,10g及以后版本
          SELECT t.id,
          c.lv AS p,
          substr(t.ca,
          instr(t.ca, ',', 1, c.lv) + 1,
          instr(t.ca, ',', 1, c.lv + 1) -
          (instr(t.ca, ',', 1, c.lv) + 1)) AS cv
          FROM (SELECT id,
          ',' || str || ',' AS ca,
          length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt
          FROM t_str_row) t,
          (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 5) c
          WHERE c.lv <= t.cnt
          ORDER BY 1, 2;
          SELECT t.id,
          c.rn AS p,
          substr(t.ca,
          instr(t.ca, ',', 1, c.rn) + 1,
          instr(t.ca, ',', 1, c.rn + 1) -
          (instr(t.ca, ',', 1, c.rn) + 1)) AS cv
          FROM (SELECT id,
          ',' || str || ',' AS ca,
          length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt
          FROM t_str_row) t,
          (SELECT rownum rn FROM all_objects WHERE rownum <= 5) c
          WHERE c.rn <= t.cnt
          ORDER BY 1, 2;
          SELECT t.id,
          c.cb AS p,
          substr(t.ca,
          instr(t.ca, ',', 1, c.cb) + 1,
          instr(t.ca, ',', 1, c.cb + 1) -
          (instr(t.ca, ',', 1, c.cb) + 1)) AS cv
          FROM (SELECT id,
          ',' || str || ',' AS ca,
          length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt
          FROM t_str_row) t,
          (SELECT rownum cb FROM (SELECT 1 FROM dual GROUP BY CUBE(1, 2))) c
          WHERE c.cb <= t.cnt
          ORDER BY 1, 2;
          適用范圍:10g及以后版本
          SELECT t.id,
          c.lv AS p,
          rtrim(regexp_substr(t.str || ',', '.*?' || ',', 1, c.lv), ',') AS cv
          FROM (SELECT id,
          str,
          length(regexp_replace(str || ',', '[^' || ',' || ']', NULL)) AS cnt
          FROM t_str_row) t
          INNER JOIN (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 5) c ON c.lv <= t.cnt
          ORDER BY 1, 2;
          7.4
          HIERARCHICAL + DBMS_RANDOM
          適用范圍:10g及以后版本
          SELECT id,
          LEVEL AS p,
          rtrim(regexp_substr(str || ',', '.*?' || ',', 1, LEVEL), ',') AS cv
          FROM t_str_row
          CONNECT BY id = PRIOR id
          AND PRIOR dbms_random.VALUE IS NOT NULL
          AND LEVEL <=
          length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))
          ORDER BY 1, 2;
          7.5
          HIERARCHICAL + CONNECT_BY_ROOT
          適用范圍:10g及以后版本
          SELECT id,
          LEVEL AS p,
          rtrim(regexp_substr(str || ',', '.*?' || ',', 1, LEVEL), ',') AS cv
          FROM t_str_row
          CONNECT BY id = connect_by_root id
          AND LEVEL <=
          length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))
          ORDER BY 1, 2;
          7.6
          MODEL
          適用范圍:10g及以后版本
          SELECT id, p, cv FROM t_str_row
          MODEL
          RETURN UPDATED ROWS
          PARTITION BY(ID)
          DIMENSION BY( 0 AS p)
          MEASURES( str||',' AS cv)
          RULES UPSERT
          (cv
          [ FOR p
          FROM 1 TO length(regexp_replace(cv[0],'[^'||','||']',null))

          例子:
          SELECT t.dutyname , substr(sys_connect_by_path(t.username, ','), 2) str
          FROM (SELECT dutyname, username, row_number() over(PARTITION BY dutyname ORDER BY username) rn
          FROM test) t
          WHERE connect_by_isleaf = 1
          START WITH rn = 1
          CONNECT BY rn = PRIOR rn + 1
          AND dutyname = PRIOR dutyname;


          posted @ 2015-07-27 23:52 鴻雁 閱讀(263) | 評論 (0)編輯 收藏

          Https通訊原理

          Https是什么? Https是基于安全目的的Http通道,其安全基礎(chǔ)由SSL層來保證。最初由netscape公司研發(fā),主要提供了通訊雙方的身份認(rèn)證和加密通信方法。現(xiàn)在廣泛應(yīng)用于互聯(lián)網(wǎng)上安全敏感通訊。 Https與Http主要區(qū)別 協(xié)議基礎(chǔ)不同:Https在Http下加入了SSL層, 通訊方式不同:Https在數(shù)據(jù)通信之前需要客戶端、服務(wù)器進行握手(身份認(rèn)證),建立連接后,傳輸數(shù)據(jù)經(jīng)過加密,通信端口443。 Http傳輸數(shù)據(jù)不加密,明文,通信端口80。 SSL協(xié)議基礎(chǔ) SSL協(xié)議位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間,本身又分為兩層: SSL記錄協(xié)議(SSL Record Protocol):建立在可靠傳輸層協(xié)議(TCP)之上,為上層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能。 SSL握手協(xié)議(SSL Handshake Procotol):在SSL記錄協(xié)議之上,用于實際數(shù)據(jù)傳輸前,通訊雙方進行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等。 SSL協(xié)議通信過程 (1) 瀏覽器發(fā)送一個連接請求給服務(wù)器;服務(wù)器將自己的證書(包含服務(wù)器公鑰S_PuKey)、對稱加密算法種類及其他相關(guān)信息返回客戶端; (2) 客戶端瀏覽器檢查服務(wù)器傳送到CA證書是否由自己信賴的CA中心簽發(fā)。若是,執(zhí)行4步;否則,給客戶一個警告信息:詢問是否繼續(xù)訪問。 (3) 客戶端瀏覽器比較證書里的信息,如證書有效期、服務(wù)器域名和公鑰S_PK,與服務(wù)器傳回的信息是否一致,如果一致,則瀏覽器完成對服務(wù)器的身份認(rèn)證。 (4) 服務(wù)器要求客戶端發(fā)送客戶端證書(包含客戶端公鑰C_PuKey)、支持的對稱加密方案及其他相關(guān)信息。收到后,服務(wù)器進行相同的身份認(rèn)證,若沒有通過驗證,則拒絕連接; (5) 服務(wù)器根據(jù)客戶端瀏覽器發(fā)送到密碼種類,選擇一種加密程度最高的方案,用客戶端公鑰C_PuKey加密后通知到瀏覽器; (6) 客戶端通過私鑰C_PrKey解密后,得知服務(wù)器選擇的加密方案,并選擇一個通話密鑰key,接著用服務(wù)器公鑰S_PuKey加密后發(fā)送給服務(wù)器; (7) 服務(wù)器接收到的瀏覽器傳送到消息,用私鑰S_PrKey解密,獲得通話密鑰key。 (8) 接下來的數(shù)據(jù)傳輸都使用該對稱密鑰key進行加密。 上面所述的是雙向認(rèn)證 SSL 協(xié)議的具體通訊過程,服務(wù)器和用戶雙方必須都有證書。由此可見,SSL協(xié)議是通過非對稱密鑰機制保證雙方身份認(rèn)證,并完成建立連接,在實際數(shù)據(jù)通信時通過對稱密鑰機制保障數(shù)據(jù)安全性

          posted @ 2014-06-13 16:16 鴻雁 閱讀(231) | 評論 (0)編輯 收藏

          8種Nosql數(shù)據(jù)庫系統(tǒng)對比

          1. CouchDB
          •所用語言: Erlang
          •特點:DB一致性,易于使用
          •使用許可: Apache
          •協(xié)議: HTTP/REST
          •雙向數(shù)據(jù)復(fù)制,
          •持續(xù)進行或臨時處理,
          •處理時帶沖突檢查,
          •因此,采用的是master-master復(fù)制(見編注2)
          •MVCC – 寫操作不阻塞讀操作
          •可保存文件之前的版本
          •Crash-only(可靠的)設(shè)計
          •需要不時地進行數(shù)據(jù)壓縮
          •視圖:嵌入式 映射/減少
          •格式化視圖:列表顯示
          •支持進行服務(wù)器端文檔驗證
          •支持認(rèn)證
          •根據(jù)變化實時更新
          •支持附件處理
          •因此, CouchApps(獨立的 js應(yīng)用程序)
          •需要 jQuery程序庫
          最佳應(yīng)用場景:適用于數(shù)據(jù)變化較少,執(zhí)行預(yù)定義查詢,進行數(shù)據(jù)統(tǒng)計的應(yīng)用程序。適用于需要提供數(shù)據(jù)版本支持的應(yīng)用程序。 例如: CRM、CMS系統(tǒng)。
          master-master復(fù)制對于多站點部署是非常有用的。 (編注2:master-master復(fù)制:是一種數(shù)據(jù)庫同步方法,允許數(shù)據(jù)在一組計算機之間共享數(shù)據(jù),
          并且可以通過小組中任意成員在組內(nèi)進行數(shù)據(jù)更新。)

          2. Redis
          •所用語言:C/C++
          •特點:運行異常快
          •使用許可: BSD
          •協(xié)議:類 Telnet
          •有硬盤存儲支持的內(nèi)存數(shù)據(jù)庫,
          •但自2.0版本以后可以將數(shù)據(jù)交換到硬盤(注意, 2.4以后版本不支持該特性!)
          •Master-slave復(fù)制(見編注3)
          •雖然采用簡單數(shù)據(jù)或以鍵值索引的哈希表,但也支持復(fù)雜操作,例如 ZREVRANGEBYSCORE。
          •INCR & co (適合計算極限值或統(tǒng)計數(shù)據(jù))
          •支持 sets(同時也支持 union/diff/inter)
          •支持列表(同時也支持隊列;阻塞式 pop操作)
          •支持哈希表(帶有多個域的對象)
          •支持排序 sets(高得分表,適用于范圍查詢)
          •Redis支持事務(wù) •支持將數(shù)據(jù)設(shè)置成過期數(shù)據(jù)(類似快速緩沖區(qū)設(shè)計)
          •Pub/Sub允許用戶實現(xiàn)消息機制
          最佳應(yīng)用場景:適用于數(shù)據(jù)變化快且數(shù)據(jù)庫大小可遇見(適合內(nèi)存容量)的應(yīng)用程序。 例如:股票價格、數(shù)據(jù)分析、實時數(shù)據(jù)搜集、實時通訊。
          (編注3:Master-slave復(fù)制:如果同一時刻只有一臺服務(wù)器處理所有的復(fù)制請求,這被稱為 Master-slave復(fù)制,通常應(yīng)用在需要提供高可用性的服務(wù)器集群。)

           3. MongoDB
          •所用語言:C++
          •特點:保留了SQL一些友好的特性(查詢,索引)。
          •使用許可: AGPL(發(fā)起者: Apache)
          •協(xié)議: Custom, binary( BSON)
          •Master/slave復(fù)制(支持自動錯誤恢復(fù),使用 sets 復(fù)制)
          •內(nèi)建分片機制
          •支持 javascript表達式查詢
          •可在服務(wù)器端執(zhí)行任意的 javascript函數(shù)
          •update-in-place支持比CouchDB更好
          •在數(shù)據(jù)存儲時采用內(nèi)存到文件映射
          •對性能的關(guān)注超過對功能的要求
          •建議最好打開日志功能(參數(shù) –journal)
          •在32位操作系統(tǒng)上,數(shù)據(jù)庫大小限制在約2.5Gb
          •空數(shù)據(jù)庫大約占 192Mb
          •采用 GridFS存儲大數(shù)據(jù)或元數(shù)據(jù)(不是真正的文件系統(tǒng))
          最佳應(yīng)用場景:適用于需要動態(tài)查詢支持;需要使用索引而不是 map/reduce功能;需要對大數(shù)據(jù)庫有性能要求;需要使用 CouchDB但因為數(shù)據(jù)改變太頻繁而占滿內(nèi)存的應(yīng)用程序。 例如:你本打算采用 MySQL或 PostgreSQL,但因為它們本身自帶的預(yù)定義欄讓你望而卻步。

          4. Riak
           •所用語言:Erlang和C,以及一些Javascript
          •特點:具備容錯能力
          •使用許可: Apache
          •協(xié)議: HTTP/REST或者 custom binary
          •可調(diào)節(jié)的分發(fā)及復(fù)制(N, R, W)
          •用 JavaScript or Erlang在操作前或操作后進行驗證和安全支持。
          •使用JavaScript或Erlang進行 Map/reduce
          •連接及連接遍歷:可作為圖形數(shù)據(jù)庫使用
          •索引:輸入元數(shù)據(jù)進行搜索(1.0版本即將支持)
          •大數(shù)據(jù)對象支持( Luwak)
          •提供“開源”和“企業(yè)”兩個版本
          •全文本搜索,索引,通過 Riak搜索服務(wù)器查詢( beta版)
          •支持Masterless多站點復(fù)制及商業(yè)許可的 SNMP監(jiān)控
          最佳應(yīng)用場景:適用于想使用類似 Cassandra(類似Dynamo)數(shù)據(jù)庫但無法處理 bloat及復(fù)雜性的情況。適用于你打算做多站點復(fù)制,但又需要對單個站點的擴展性,可用性及出錯處理有要求的情況。 例如:銷售數(shù)據(jù)搜集,工廠控制系統(tǒng);對宕機時間有嚴(yán)格要求;可以作為易于更新的 web服務(wù)器使用。
           
          5. Membase
          •所用語言: Erlang和C
          •特點:兼容 Memcache,但同時兼具持久化和支持集群
          •使用許可: Apache 2.0
          •協(xié)議:分布式緩存及擴展
          •非常快速(200k+/秒),通過鍵值索引數(shù)據(jù)
          •可持久化存儲到硬盤
          •所有節(jié)點都是唯一的( master-master復(fù)制)
          •在內(nèi)存中同樣支持類似分布式緩存的緩存單元
          •寫數(shù)據(jù)時通過去除重復(fù)數(shù)據(jù)來減少 IO
          •提供非常好的集群管理 web界面
          •更新軟件時軟無需停止數(shù)據(jù)庫服務(wù)
          •支持連接池和多路復(fù)用的連接代理
          最佳應(yīng)用場景:適用于需要低延遲數(shù)據(jù)訪問,高并發(fā)支持以及高可用性的應(yīng)用程序 例如:低延遲數(shù)據(jù)訪問比如以廣告為目標(biāo)的應(yīng)用,高并發(fā)的 web 應(yīng)用比如網(wǎng)絡(luò)游戲(例如 Zynga)

          6. Neo4j
          •所用語言: Java
          •特點:基于關(guān)系的圖形數(shù)據(jù)庫
          •使用許可: GPL,其中一些特性使用 AGPL/商業(yè)許可
          •協(xié)議: HTTP/REST(或嵌入在 Java中)
          •可獨立使用或嵌入到 Java應(yīng)用程序
          •圖形的節(jié)點和邊都可以帶有元數(shù)據(jù)
          •很好的自帶web管理功能
          •使用多種算法支持路徑搜索
          •使用鍵值和關(guān)系進行索引
          •為讀操作進行優(yōu)化
          •支持事務(wù)(用 Java api)
          •使用 Gremlin圖形遍歷語言
          •支持 Groovy腳本
          •支持在線備份,高級監(jiān)控及高可靠性支持使用 AGPL/商業(yè)許可 最佳應(yīng)用場景:適用于圖形一類數(shù)據(jù)。這是 Neo4j與其他nosql數(shù)據(jù)庫的最顯著區(qū)別 例如:社會關(guān)系,公共交通網(wǎng)絡(luò),地圖及網(wǎng)絡(luò)拓譜

          7. Cassandra
          •所用語言: Java
          •特點:對大型表格和 Dynamo支持得最好
          •使用許可: Apache
          •協(xié)議: Custom, binary (節(jié)約型)
          •可調(diào)節(jié)的分發(fā)及復(fù)制(N, R, W)
          •支持以某個范圍的鍵值通過列查詢
          •類似大表格的功能:列,某個特性的列集合
          •寫操作比讀操作更快
          •基于 Apache分布式平臺盡可能地 Map/reduce
          •我承認(rèn)對 Cassandra有偏見,一部分是因為它本身的臃腫和復(fù)雜性,也因為 Java的問題(配置,出現(xiàn)異常,等等)
          最佳應(yīng)用場景:當(dāng)使用寫操作多過讀操作(記錄日志)如果每個系統(tǒng)組建都必須用 Java編寫(沒有人因為選用 Apache的軟件被解雇) 例如:銀行業(yè),金融業(yè)(雖然對于金融交易不是必須的,但這些產(chǎn)業(yè)對數(shù)據(jù)庫的要求會比它們更大)寫比讀更快,所以一個自然的特性就是實時數(shù)據(jù)分析

          8. HBase (配合 ghshephard使用)
          •所用語言: Java
          •特點:支持?jǐn)?shù)十億行X上百萬列
          •使用許可: Apache
          •協(xié)議:HTTP/REST (支持 Thrift,見編注4)
          •在 BigTable之后建模
          •采用分布式架構(gòu) Map/reduce
          •對實時查詢進行優(yōu)化
          •高性能 Thrift網(wǎng)關(guān)
          •通過在server端掃描及過濾實現(xiàn)對查詢操作預(yù)判
          •支持 XML, Protobuf, 和binary的HTTP
          •Cascading, hive, and pig source and sink modules
          •基于 Jruby( JIRB)的shell
          •對配置改變和較小的升級都會重新回滾
          •不會出現(xiàn)單點故障
          •堪比MySQL的隨機訪問性能 最佳應(yīng)用場景:適用于偏好BigTable:)并且需要對大數(shù)據(jù)進行隨機、實時訪問的場合。 例如: Facebook消息數(shù)據(jù)庫(更多通用的用例即將出現(xiàn))

          posted @ 2014-05-23 11:19 鴻雁 閱讀(326) | 評論 (0)編輯 收藏

          Oracle 10g內(nèi)存結(jié)構(gòu)之共享池的相關(guān)知識及使用簡介

          SGA中的第三個組成部分是共享池。共享池是對sql ,pl/sql 程序進行語法分析、編譯、執(zhí)行的內(nèi)存區(qū)域。共享池包括庫緩沖區(qū)(library cache)、數(shù)據(jù)字典緩沖區(qū)(Data Directory Cache)用戶全局區(qū)(User Global Area)。其中庫緩沖區(qū)含有Sql 語句的分析碼、執(zhí)行計劃;數(shù)據(jù)字典緩沖區(qū)含有從數(shù)據(jù)字典中得到的表、列定義、權(quán)限。用戶全局區(qū)包含用戶的MTS 會話信息。

          共享池主要用于對SQL 、pl/sql 程序語句進行語法分析、編譯、執(zhí)行、所以,如果應(yīng)用中藥運行大量存儲過程或包,則要增加共享池的尺寸。共享池的大小由參數(shù)SHARE_POOL_SIZE確定。要了解共享池大小,可以用以下方法:

          方法一:

           

          1. ………  
          2. Shared_Pool_size = 52428800 
          3. ….. 

           

          方法二:

           

          1. SQL> select name,value from v$parameter where name like ‘%size’; 

           

          方法三:

           

          1. SQL> show parameter share_pool_size 

           

          共享池應(yīng)計算存儲過程、包等的成功率。

          可以查詢數(shù)據(jù)字典 v$rowcache 了解數(shù)據(jù)字典的成功與失敗次數(shù)。

           

          1. SQL> select sum(gets) “dictionary gets”,  
          2. Sum(getmisses) “dictionary cache getmisses”  
          3. From v$rowcache ; 

           

          其中g(shù)ets 表示讀取某一類數(shù)據(jù)字典的成功次數(shù),getsmisses 表示讀取某一類數(shù)據(jù)字典的失敗次數(shù)。此外還可以通過查詢結(jié)果計算共享池中讀取數(shù)據(jù)字典的成功率

           

          1. SQL> select parameter, get, getmisses, getmisses/(getmisses+gets)*100 “miss ratio”,  
          2. (1-    (sum(getmisses)/(sum(getmisses)+sum(gets)) ) ) *100 “hit ratio”  
          3. From v$rowcache  
          4. Where gets+getmisses<>0  
          5. Group by parameter,gets,getmisses; 

           

          查詢數(shù)據(jù)字典 v$librarycache 可以計算共享池中庫緩存的失敗率,結(jié)果應(yīng)該小于1%。

           

          1. SQL>select sum(pins) “ total pins”, sum(reloads) “ total reloads”, sum(reloads)/sum(pins)*100 libarycache  from  v$librarycache; 

           

          其中 total pins 表示駐留內(nèi)存的次數(shù), total reloads 表示重新加載到內(nèi)存的次數(shù),librarycache 表示失敗率。

          上面分析了系統(tǒng)全局區(qū)的三個組成部分-----數(shù)據(jù)緩沖區(qū)、日志緩沖區(qū)及共享池,如果要得到SGA的總大小,可以在SQL*Plus中使用show sga 命令。

          SQL>show sga或查詢數(shù)據(jù)字典

          SQL> select * from v$sga;

          如果要查詢某個參數(shù)的大小,可以查詢數(shù)據(jù)字典v_$sagstat,通過計算可以知道sga的使用空間與空閑空間的比。

           

          1. SQL>col OBJECT_NAME format a20  
          2. SQL> col 空閑空間百分比(%) format 90.99  
          3. SQL> select name,  
          4. Sgasize/1024/1024  “allocated(M)” ,  
          5. Bytes/1024        “空閑空間(k)” ,  
          6. Round(bytes/sagsize*100,2)  “空閑空間百分比(%)”  
          7. From ( select sum(bytes) sgasize from sys.v_$sgastat) s ,sys.v_$sgastat f  
          8. Where f.name=’free memory’ ;  

           

          關(guān)于Oracle 10g內(nèi)存結(jié)構(gòu)之共享池的相關(guān)知識及使用方法就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!

          posted @ 2014-05-17 23:37 鴻雁 閱讀(173) | 評論 (0)編輯 收藏

          Oracle 10g內(nèi)存結(jié)構(gòu)之系統(tǒng)全局區(qū)簡介

          我們知道,內(nèi)存結(jié)構(gòu)是Oracle體系結(jié)構(gòu)中最重要的部分之一。按照系統(tǒng)對內(nèi)存使用方法的不同,可以分為系統(tǒng)全局區(qū)(SGA)、程序全局區(qū)(PGA)、排序區(qū)(Sort Area)、大池(Large Pool)、及java池(java Pool),本文我們先介紹一下Oracle 10g內(nèi)存結(jié)構(gòu)之系統(tǒng)全局區(qū)的內(nèi)容,接下來我們就開始介紹這部分內(nèi)容。

          系統(tǒng)全局區(qū)(System Global Area)

          它是一組為系統(tǒng)分配的內(nèi)存共享結(jié)構(gòu),可以包含一個數(shù)據(jù)庫實例的數(shù)據(jù)和控制信息。如果多個用戶連接到一個實例,在實例的系統(tǒng)全局區(qū)中,數(shù)據(jù)可以被多個用戶共享,所以又稱共享全局區(qū)。系統(tǒng)全局區(qū)按其作用不同,可以分為數(shù)據(jù)緩沖區(qū)、日志緩沖區(qū)及共享池。

          數(shù)據(jù)緩沖區(qū):

          數(shù)據(jù)緩沖區(qū)用于從磁盤讀入的數(shù)據(jù),供所有用戶共享。

          修改的數(shù)據(jù)、插入的數(shù)據(jù)存儲在數(shù)據(jù)緩沖區(qū)中,修改完成或DBWR進程的其他條件引發(fā)時,數(shù)據(jù)被寫入數(shù)據(jù)文件

          數(shù)據(jù)緩沖區(qū)工作原理:

          LRU (Least recently used):最近最少使用原則的縮寫,是一種數(shù)據(jù)緩沖區(qū)的一種管理機制,,只保留最近數(shù)據(jù),不保留舊數(shù)據(jù)。

          Dirty:表示臟數(shù)據(jù),臟數(shù)據(jù)是修改后還沒有寫到數(shù)據(jù)文件的數(shù)據(jù)。

          Oracle10g 的數(shù)據(jù)庫內(nèi)存的設(shè)置參數(shù)不再由DB_BLOCK_BUFFERS確定,而是由oracle的新參數(shù)DB_CACHE_SIZE 和DB_nK_CACHE_SIZE確定,不同的數(shù)據(jù)段可以使用不同的數(shù)據(jù)塊。大表可以存儲在大的數(shù)據(jù)塊表空間中,小表可以存儲在小的數(shù)據(jù)塊表空間中,以優(yōu)化i/o性能。對于系統(tǒng)表空間、臨時表空間、及其它默認(rèn)設(shè)置的表空間,可以使用標(biāo)準(zhǔn)的數(shù)據(jù)塊DB_BLOCK_SIZE確定。

          標(biāo)準(zhǔn)數(shù)據(jù)塊DB_BLOCK_SIZE用于系統(tǒng)表空間及默認(rèn)表空間,其他表空間可以使用非標(biāo)準(zhǔn)數(shù)據(jù)塊BLOCKSIZE(創(chuàng)建表空間時使用),其值分別為 2k 4k 8k 16k 32k ,非標(biāo)準(zhǔn)數(shù)據(jù)塊的數(shù)據(jù)緩沖區(qū)使用參數(shù)DB_Nk_CACHE_SIZE確定。

          需要注意的是BLOCKSIZE不得用于標(biāo)準(zhǔn)塊。如果設(shè)置了DB_BLOCK_SIZE=2048,則不得設(shè)置DB_2K_CACHE_SIZE,標(biāo)準(zhǔn)塊必須使用參數(shù)DB_CACHE_SIZE 來設(shè)置。同時可以在線修改數(shù)據(jù)緩沖區(qū)參數(shù):SQL> alter system set db_2k_cache_size = 10M ;如果要查詢數(shù)據(jù)緩沖區(qū)大小,可以如下:SQL> show parameter db。

          在創(chuàng)建不同數(shù)據(jù)塊表空間時,要使用參數(shù)BLOCKSIZE指出數(shù)據(jù)塊的大小,同時在參數(shù)文件中要使用DB_Nk_CACHE_SIZE 進行配置,與BLOCKSIZE的個數(shù)相對應(yīng),否則會出現(xiàn)錯誤。

          設(shè)置動態(tài)內(nèi)存時,可以將多個參數(shù)全部寫入?yún)?shù)文件,格式如下:

          1. # cache and i/o  
          2.  DB_BLOCK_SIZE=4096 
          3.  DB_CACHE_SIZE=20971520 
          4.  DB_2K_CACHE_SIZE=8M 
          5.  DB_8K_CACHE_SIZE=4M 
          6.  …….. 

          其中,參數(shù) DB_CACHE_SIZE 只適用于系統(tǒng)表空間、臨時表空間、及默認(rèn)表空間,DB_2K_CACHE_SIZE  適合 BLOCKSIZE 為2K的表空間。8K 也是一樣的道理。

          數(shù)據(jù)緩沖區(qū)對數(shù)據(jù)庫德存取速度又直接影響。一般的緩沖區(qū)命中率應(yīng)該在90% 以上。例如,使用數(shù)據(jù)字典 v$sysstat 計算數(shù)據(jù)緩沖區(qū)命中率:

          1. SQL> select a.value+b.value “logical_reads” , c.value “phys_reads”,  
          2.       Round(100* ( ( a.value+b.value)- c.value) /  
          3.       ( a.value+b.value ) ) “buffer hit radio “  
          4.       From v$sysstat a, v$sysstat b,v$sysstat c  
          5.       Where a.statistic#=38 and b.statistic#=39 and c.statistic#=40; 

          下面是計算數(shù)據(jù)緩沖命中率的另一種方法:

          1. SQL> select name, value  
          2.       From v$sysstat  
          3.       Where name in ( ‘session logical reads’,’physical reads’,physical reads direct’, ‘physical reads direct (lob)’); 

          其中:Session logical reads 為讀的總量。Physical reads為從數(shù)據(jù)文件讀。Physical reads direct 為從緩沖區(qū)讀(不含lobs)。Physical reads direct (lobs) 為從緩沖區(qū)讀(含lobs)。Hit Ratio = 1- ( ( physical reads- physical reads direct – physical reads direct(lob) ) /session logical reads) = 95%。

          日志緩沖區(qū)

          日志緩沖區(qū)用來存儲數(shù)據(jù)庫的修改信息。日志信息首先在日志緩沖區(qū)中產(chǎn)生,當(dāng)日志緩沖區(qū)的日志達到一定數(shù)量時,由日志寫入進程LGWR將日志數(shù)據(jù)寫入日志文件組,再經(jīng)過切換,由歸檔進程ARCH將日志數(shù)據(jù)寫入歸檔介質(zhì)。

          日志緩沖區(qū)大小由參數(shù)LOG_BUFFER確定,要查詢?nèi)罩揪彌_區(qū)大小可以用以下方法:

          方法一:參數(shù)文件中:

          1.  ……  
          2.  Processes = 150 
          3.  Parallel_max_servers = 5 
          4. Log_buffer = 32768 
          5. …….. 

          方法二:

          1. SQL> select name,value from v$parameter where name like ‘%buffer’; 

          方法三:

          1. SQL> show parameter log_buffer 

          對于日志緩沖區(qū)而言可以計算失敗率,使用數(shù)據(jù)字典v$latch 計算日志緩沖區(qū)的失敗率

          1. SQL>select name,gets,misses,immediate_gets,immediate_misses,  
          2.      Decode(gets,0,0,misses/gets*100) ratiol,  
          3.      Decode (immediate_gets+immediate_misses,0,0,  
          4. immediate_misses/(immediate_gets+immediate_misses)*100)   ratio2  
          5.      from v$latch  
          6.      where name in (‘redo allocation’, ‘redo copy’); 

          其中

          Gets 表示成功等待日志緩沖區(qū)的次數(shù)。

          Immediate gets 表示成功立即得到日志緩沖區(qū)的次數(shù)。

          Immediate misses 表示未成功立即得到日志緩沖區(qū)的次數(shù)。

          等待表示日志在進入日志緩沖區(qū)時,因為日志緩沖區(qū)過小而沒有空閑空間,所以日志緩沖區(qū)的失敗可以表示日志緩沖區(qū)是否足夠大,不夠大時,用戶的日志寫將產(chǎn)生等待過程。日志緩沖區(qū)的失敗率應(yīng)該小于1%。

          此外,可以查詢用戶進程等待日志緩沖區(qū)時的次數(shù),通過數(shù)據(jù)字典v$sysstat 得到:

          1. SQL> select name,value from v$sysstat  
          2.       Where name = ‘ redo buffer allocation retries’ ; 

          關(guān)于Oracle 10g內(nèi)存結(jié)構(gòu)之系統(tǒng)全局區(qū)的相關(guān)知識就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!

          posted @ 2014-05-17 23:31 鴻雁 閱讀(205) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共18頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 浙江省| 新源县| 辛集市| 惠水县| 永川市| 崇阳县| 无极县| 甘泉县| 平和县| 安西县| 蒙自县| 油尖旺区| 比如县| 海原县| 榆社县| 青浦区| 景东| 兴安盟| 阜新市| 和林格尔县| 平果县| 江津市| 方城县| 齐河县| 武邑县| 雅安市| 江山市| 台湾省| 湖口县| 孟村| 林周县| 满城县| 封丘县| 灵武市| 平度市| 新蔡县| 南丹县| 顺平县| 秀山| 右玉县| 上杭县|