2010年12月20日 星期一

[Oracle]Update data from another Table

Web系統不免會有由Excel Upload的資料去更新資料表的需求,當然如果Excel資料一筆一筆的對Table做更新是不符合效益,這將造成對database的transaction過多,而且因為目前需Update的資料表資料量相當大,所以採用的方法如下:
1.Insert data in db temp table from excel data
2.update data from temp table

上述的從Temp table取用資料Update資料表,就切入本篇的主題,可用的方法有三:
1.Update by sub-query
2.Update table view
3.Merge

方法一:
UPDATE bigTable b
   SET (col1,col2,col3) = (
       SELECT t.col1,t.col2,t.col3
         FROM tempTable t
        WHERE b.col = t.col)
where exists(
       SELECT t.col1,t.col2,t.col3
         FROM tempTable t
        WHERE b.col = t.col);
方法二:
UPDATE (
SELECT b.col1 as old_col1,
       b.col2 as old_col2,
       b.col3 as old_col3,
       t.col1 as new_col1,
       t.col2 as new_col2,
       t.col3 as new_col3 
  FROM bigTable b, tempTable t
 WHERE b.col = t.col)
   SET old_col1 = new_col1,
       old_col2 = new_col2,
       old_col3 = new_col3;

方法三:
MERGE INTO bigTable b
 USING (SELECT col1 , col2 , col3 , col
          tempTable t ) t
    ON ( b.col = t.col)
WHEN matched THEN
UPDATE
   SET old_col1 = new_col1,
       old_col2 = new_col2,
       old_col3 = new_col3;

測試結果:
方法一:140 sec
方法二:1 sec
方法三:未測

透過方法二 明顯是效能最佳的解法,但若會被update的bigTable並非符合UK或PK的條件,將會產生"ORA-01779: cannot modify a column which maps to a non-key-preserved table"的錯誤,若你的table不適合建立UK或PK時,可透過hint的方式/*+ BYPASS_UJVC */來忽略UK的檢查。
UPDATE (
SELECT /*+ BYPASS_UJVC */ b.col1 as old_col1,
       b.col2 as old_col2,
       b.col3 as old_col3,
       t.col1 as new_col1,
       t.col2 as new_col2,
       t.col3 as new_col3 
  FROM bigTable b, tempTable t
 WHERE b.col = t.col)
   SET old_col1 = new_col1,
       old_col2 = new_col2,
       old_col3 = new_col3;

參考網址:http://blog.csdn.net/yuhua3272004/archive/2008/08/06/2776121.aspx

2010年11月17日 星期三

[Oracle]處理中文亂碼 -- NLS_LANG設定

開發連結oracle資料庫不可不注意中文的處理問題

首先必須確認DB Server的編碼設定

select userenv('language') from dual;
取得結果為TRADITIONAL_CHINESE.TAIWAN.ZHT16BIG5

接下來就是設定client端的NLS_LANG,只要與DB Server相同,中文顯示就會正確了

1. 開始 -> 執行 -> regedit
2. 找出 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
3. NLS_LANG改為TRADITIONAL_CHINESE.TAIWAN.ZHT16BIG5

這樣由這台client連到TRADITIONAL_CHINESE.TAIWAN.ZHT16BIG5 的DB Server中文顯示就會是正確的。

另一個議題,單一client要連結的DB Server有多種NLS_LANG,擔任Web Server的client常有這種狀況!!!

以ASP.NET為例:

public void ReadMyData(string connectionString)
{
    //設定Oracle NLS_LANG,在connect db前設定環境變數
    System.Environment.SetEnvironmentVariable("NLS_LANG", "AMERICAN_AMERICA.ZHT32EUC");
    string queryString = "SELECT OrderID, CustomerID FROM Orders";
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        OleDbCommand command = new OleDbCommand(queryString, connection);
        connection.Open();
        OleDbDataReader reader = command.ExecuteReader();

        while (reader.Read())
        {
            Console.WriteLine(reader.GetInt32(0) + ", " + reader.GetString(1));
        }
        // always call Close when done reading.
        reader.Close();
    }
}


其關鍵就是
System.Environment.SetEnvironmentVariable("NLS_LANG","AMERICAN_AMERICA.ZHT32EUC");
 
針對單一Web Site設定連線到DB NLS_LANG,就可以一勞永逸的解決中文問題,不管程式被Deploy到哪裡,
都不受那台Web Server的NLS_Lang影響。

2010年10月11日 星期一

[ASP.NET]Visual Studio建立N-Tier的Solution

於Visual Studio實現N-Tier,目前將程式分為三層:
1.UI (Web Form)
2.BLL (Bussiness Logic Layer)
3.DAL (Data Access Layer)

要建立起這樣的架構,首先必須建立一個空白專案,我們可用此專案開啟我們的N-Tier全部檔案來檢視。
1.建立空白專案




























 2.建立Client檔案夾,加入Web Application 的Project











3.建立General檔案夾,建立BLL與DAL的Project








4.檢視建立完畢的Solution






















5.各Layer間要加入Reference,這樣就可以把整個Solution關係都拉起來了~
首先,BLL將DAL加入Reference,
接著就是在Web Application加入BLL與DAL。










6.檢視整個Solution加入Reference後的結果










































這樣就大致的把3-Tier切出來了,
透過如此的切法,
DAL主要只負責用來連結資料庫,對資料庫做資料處理。
BLL則是扮演DAL與UI之前的橋樑,對於取出資料庫取出的資料作邏輯處理,回覆資料給UI。
UI則是單純的扮演呼叫BLL與呈現資料,不做邏輯處理與判斷。

2010年6月7日 星期一

[Oracle]箱型圖(BoxPlot)統計值運算

繪製箱型圖顯示一組數據的分散情況,而若從資料庫中的Raw Data,來繪製箱型圖,則需結算出六個必要數值:最大值、最小值、中位數、平均值、Q1下四分位數、Q3下四分位數

以Oracle範例資料庫中的employees資料表為例,計算每個部門的箱型圖數值:


select department_id,
       max(salary) Upper_whisker,
       min(salary) Lower_whisker,
       round(avg(salary),3) Average,
       PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY salary ASC) Q1,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary ASC) Median,
       PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY salary ASC) Q3
  from employees t
 group by department_id

2010年5月27日 星期四

[ASP.NET]左右ListBox選單(3) -- 非同步PostBack Trigger

 承[ASP.NET] 左右ListBox選單(1) -- 按鈕Trigger[ASP.NET] 左右ListBox選單(2) -- Javascript Trigger的主題,有介紹以雙擊(double click)去觸發PostBack,然而以javascript送出則會有整頁往後送的效果,網頁會閃爍。
本文介紹將Control放入Update Panel來避免頁面閃爍的現象,另以非同步的javascript去做PostBack,同時可達到雙擊的效果與簡短了程式碼的撰寫。

首先,承上文的Code:
  1. Control放入UpdatePanel中
  2. ListBox的Control內加入Double Click事件的Function
  3. __doPostBack('ButtonRight','')  為非同步送出觸發ButtonRight 的事件

2010年5月26日 星期三

[ASP.NET]左右ListBox選單(2) -- Javascript Trigger

[ASP.NET] 左右ListBox選單(1) -- 按鈕Trigger 的主題,選取Value後按下中間的四個按鈕觸發PostBack,本文將雙擊(double click)的動作加入觸發PostBack的行列,讓選取的時候更加方便與直覺。

首先,承上文的Code:
  1. <head></head>之間加入javascript,雙擊時將送出form
  2. ListBox的Control內加入Double Click事件的Function,並加入一個hidden欄位
  3. CS頁面內加入接收雙擊ListBox時操作

2010年5月25日 星期二

[ASP.NET]左右ListBox選單(1) -- 按鈕Trigger

以ListBox實做左方ListBox為可選擇之項目,右方ListBox為已選擇之項目,中間放置四個按鈕,分別為向右鈕/全選向右鈕/向左鈕/全選向左鈕。


Blogger加上表格--放入HTML TABLE

在Blogger寫程式分享的文章,若有插入表格的需求,
表格編寫需要用HTML的方式,如:<table><tr><td>XXX</td></tr>

寫入的原始碼需用CSS的方式包住,才可避免有多餘的空白出現。


[Table 原始碼]

[ASP.NET]LinkButton + Image

LinkButton只能秀文字,ImageButton只能秀圖片,
那當有需求是文字與圖片要一起在同一個按鈕時,目前的解法就是將圖片放入LinkButton中即可。



<asp:LinkButton runat="server" ID="LinkButton1" BorderColor="Gray"
    Font-Names="Arial" ForeColor="Navy" BorderWidth="1px" BackColor="LightGray">
    <img src="images/filter/funnel.png" style="border:0; vertical-align:bottom" />Data Filter
</asp:LinkButton>

2010年5月13日 星期四

Blogger加上程式碼 -- 高亮度顯示程式(SyntaxHighlighter)

在Blogger寫程式分享的文章,必備的套用工具SyntaxHighlighter這類的高亮度顯示程式。
套用方法:
  1. 進入管理介面[版面配置]
  2. [修改 HTML]
  3. 備份範本
  4. [修改範本],加入以下code至<head>與</head>之間
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shCore.css"/>
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shThemeDefault.css" id="shTheme"/>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shCore.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shLegacy.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushBash.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCpp.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCSharp.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCss.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushDelphi.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushDiff.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushGroovy.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushJava.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushJScript.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushPhp.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushPlain.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushPython.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushRuby.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushScala.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushSql.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushVb.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushXml.js"></script>
<script type='text/javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.ClipboardSwf = 'http://http://alexgorbatchev.com/pub/sh/2.0.320/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>

後續只要在code以<pre class="brush:xml"></pre>框住即可

brushes 分類如下:



Brush nameBrush aliasesFile name
ActionScript3as3, actionscript3shBrushAS3.js
Bash/shellbash, shellshBrushBash.js
ColdFusioncf, coldfusionshBrushColdFusion.js
C#c-sharp, csharpshBrushCSharp.js
C++cpp, cshBrushCpp.js

CSScssshBrushCss.js
Delphidelphi, pas, pascalshBrushDelphi.js

Diffdiff, patchshBrushDiff.js
Erlangerl, erlangshBrushErlang.js

GroovygroovyshBrushGroovy.js
JavaScriptjs, jscript, javascriptshBrushJScript.js

JavajavashBrushJava.js
JavaFXjfx, javafxshBrushJavaFX.js

Perlperl, plshBrushPerl.js
PHPphpshBrushPhp.js

Plain Textplain, textshBrushPlain.js
PowerShellps, powershellshBrushPowerShell.js

Pythonpy, pythonshBrushPython.js
Rubyrails, ror, rubyshBrushRuby.js

ScalascalashBrushScala.js
SQLsqlshBrushSql.js

Visual Basicvb, vbnetshBrushVb.js
XMLxml, xhtml, xslt, html, xhtmlshBrushXml.js




2010年5月12日 星期三

[Linq]LINQ to Object (ListBox)

可複選的ListBox取出被Selected的值。
解法一:使用LINQ取出Selected == true
解法二:使用for迴圈尋訪ListBox的每一個ListItem,並判斷ListItem.Selected == true


Sample.aspx
<asp:ListBox ID="ListBox1" runat="server" Rows="5" SelectionMode="Multiple" Width="150px">
    <asp:ListItem>AAAA</asp:ListItem>
    <asp:ListItem>BBBB</asp:ListItem>
    <asp:ListItem>CCCC</asp:ListItem>
    <asp:ListItem>DDDD</asp:ListItem>
</asp:ListBox>

解法一:
Sample.aspx.cs
var selItems = from ListItem li in ListBox1.Items
                   where li.Selected == true
                   select li.Text;

    Response.Write("Selected Item(s): ");
    foreach (var item in selItems)
    {
        Response.Write(item.ToString() + "");
    }


解法二:
Sample.aspx.cs
ListBox1.SelectionMode = ListSelectionMode.Multiple;
    for (int i = 0; i < ListBox1.Items.Count; i++)
    {
        if(ListBox1.Items[i].Selected == true)
        {
           Response.Write( ListBox1.Items[i].ToString() + ""); 
        }
    }

2010年5月11日 星期二

[Linq]LINQ to DataSet

針對DataTable的資料,若有加工或篩選的需求,Linq 是目前我選用要熟悉的技術。

 LINQ to DataSet 中的查詢

其中範例中,大致分成兩種,一為查詢運算式語法,二為以方法為基礎的查詢語法
其實對我而言,就是一個有from,另一個沒有~
當我遇到要做Order By時,似乎只有看到有from那種語法有範例。

2010年1月25日 星期一

[Oracle]PL/SQL與T-SQL的語法比較文件

今日從企圖找出PL/SQL中continue的相似語法,無意間找到了一份PL/SQL與T-SQL的語法用法比較的word文件。也同時也試用google共用文件的功能。

PL/SQL與T-SQL比較Word文件

稍後讀完文件後,再做補充說明吧~~今天雖然是文章發表日,就讓我先偷懶一下下吧!!!

2010年1月20日 星期三

[Oracle]Week的時間區間

日前有一個需求為呈現從今日往前推53週的日期,列出每週的週別與開始與結束日期。每週的開始日期為週二。

呈現如下:


















2010年1月11日 星期一

[Oracle]Mutil Row To One Row應用(二)

本次範例應用北風資料For Oracle中 orders 的訂單資料Table做為Sample。本次範例想要取得訂單資料中每天訂單中每個貨運公司的最大運費,並且有優先次序的選擇呈現貨運公司的資料,例如:如果當天有托運公司1,2,3呈現資料的次序為1 > 2 > 3

select orderid, orderdate, shipvia, freight from orders t




















結果如下:

















2010年1月4日 星期一

[Oracle]PL/SQL Developer Tool

提到Oracle的相關開發工具,就非得提到我每天都一定會使用的PL/SQL Developer,用他來做什麼呢??

當然不外乎就是寫SQL Statement,會用到就是SQL Window ,同一個SQL Window裡面可以下多個Statement,只要用分號隔開,SQL Window下方的結果集就會依照Statement順序分頁籤。