2013年3月26日 星期二

EXECEL 實用技巧(一)


以上方法用於本應相同的兩個SHEET,但其中一個SHEET的順序被打亂時,可以快速筆對填入該有的資料。


2013年3月24日 星期日

ORACLE SQL 常用語法 常見問題

參考自

如何讓id(自動增加的流水號)再刪除後保持連續(MYSQL)?
select min(a.id)+1 from BookList a left join BookList b on a.id=b.id-1 where b.id is null;

SYNONYM:創建別名
CREATE   SYNONYM   TABLE_A   FOR   A.TABLE_A;

SUBSTR
SUBSTR("ABCDEFG",0,3): ABC
SUBSTR("ABCDEFG",2): CDEFG
SUBSTR("ABCDEFG",0,100): ABCDEFG 

ROWID     REFERENCE
1.rowid 是由object number + file number + block number + row number 四個項目所組成的,
也就是說記錄每一筆列的位置,存在於某一個 block,所以根本不需要搜尋就可以指定讀取某一列,因此它的查詢速度是最快的..

2.而建立index就是把你的主鍵對應一個rowid,所以可以增快查詢速度

3.rowid 是會變動的,所以以rowid當查詢條件並不適當;建index會是比較好的方式,因為oracle會去維護index,當rowid變動時,index中的rowid也會跟著變動





2013年3月22日 星期五

Java 連接MySQL (五) 新增、移除、修改資料、ResultSetMetaData

無法查看此摘要。請 按這裡查看文章。

Java 連接MySQL (四) ResultSet游標控制

參自: 語言技術: Java Gossip (二) <<<超連結

使用無參數的createStatement(),prepareStatement()其執行SQL後所得之ResultSet物件,只能透過next()方法逐筆查詢(沒參數預設就是第一個)。

現在我們指定resultSetType,參數有ResultSet.TYPE_FORWARD_ONLY,
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.TYPE_SCROLL_SENSITIVE。

SENSITIVE與否差異在於能否取得ResultSet改變值後的資料。

另外必須指定resultSetConcurrency,參數有ResultSet.CONCUR_READ_ONLY與ResultSet.CONCUR_UPDATABLE。

不給參數情況,預設為 ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE。

範例
Statement st=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                              ResultSet.CONCUR_READ_ONLY);
ResultSet rs=st.executeQuery(SELETE * FROM FriendList);
rs.afterLast();     //最後一筆的下一筆
while(rs.previous()){
     System.out.print(rs.getString("name")+"\t");
     System.out.print(rs.getString("age")+"\t");
     System.out.println(rs.getString("email")+"\t");
}
st.close();
con.close();

其他用法
rs.absolute(5);    //移動到第五筆資料
rs.absolute(10);  // ...............十............
rs.absolute(-5);   //倒數第五筆

rs.relative(5);    //若原是第25筆資料,則表示第30筆
rs.relative(-5);   //若原是第25筆資料,則表示第20筆

rs.beforeFirst();  //移動到第一筆資料之前
rs.first();             //移動到第一筆資料
rs.last();              //移動到最後一筆資料


Java 連接MySQL (三) 存入檔案類型的資料

參自: 語言技術: Java Gossip (二) <<<超連結

在欄位上使用BLOB或CLOB資料型態。
BLOB: Binary Large Object,大量的二進位資料。(JDBC提供Blob類別)
CLOB: Character Large Object,大量的文字資料。(JDBC提供Clob類別)

可以使用的PreparedStatement方法,包括setBinaryStream(),setObject(),setAsciiStream,setUnicodeStream()等。

File file=new File("c:/xsd.jpg");
int length=(int)file.length();
FileInputStream fis=new FileInputStream(file);

PreparedStatement ps=con.prepareStatement("INSERT INTO MovieList VALUES(?,?,?)");
ps.setString(1,"下水道");
ps.setString(2,"2010/10/10");
ps.setBinaryStream(3,fis,length);

ps.executeUpdate();
ps.clearParameters();
ps.close();
fis.close();

取得檔案
Statement st=con.createStatement();
ResultSet resultSet=st.executeQuery("SELECT * FROM MovieList");
resultSet.next();
Blob blob=resultSet.getBlob(3);     搭配blob.getBinaryString(), blob.getBytes()使用
Clob clob=resultSet.getClob(3);     搭配clob.getCharacterStream(), clob.getSubString()使用

寫入檔案
FileOutputStream fos=new FileOutputStream("c:/xsd1.jpg");
fos.write(blob.getBytes(1,(int)blob.length());
fos.flush();
fos.close();

For Oracle
Oracle 9i之前,要先建立Blob/Clob的空欄位以取得Blob/Clob游標。
(i)
PreparedStatement ps=con.prepareStatement("INSERT INTO MovieList(id,des,pic) VALUES(?, EMPTY_CLOB(), EMPTY_BLOB())");
ps.setInt(1,1);
ps.executeUpdate();

(ii)
PreparedStatement ps=con.prepareStatement("INSERT INTO MovieList(id,des,pic) VALUES(?, ?, ?)");
ps.setInt(1,1);
ps.setClob(2,CLOB.empty_lob());
ps.setBlob(3,BLOB.empty_lob());
ps.executeUpdate();

小範例
String driver="oracle.jdbc.driver.OracleDriver";
String url="jdbc:oracle:thin:@localhost:1521:demo";
String user="ted";
String password="12345";

Class.forName(driver);
Connection con=null;
PreparedStatement ps=null;

con=DriverManager.getConnection(url,user,password);
con.setAutoCommit(false);

//存入Blob/Clob空欄位
ps=con.prepareStatement("INSERT INTO MovieList(id,des,pic) VALUES(?, EMPTY_CLOB(), EMPTY_BLOB())");
ps.setInt(1,1);
ps.executeUpdate();
ps.close();

//查詢Blob/Clob欄位以取得游標
ps=con.prepareStatement("SELECT des,pic FROM MovieList WHERE id=? for update");
ps.setInt(1,1);
ResultSet rs=ps.executeQuery();
rs.next();

Clob clob=(Clob)rs.getClob(1);
Blob blob=(Blob)rs.getBlob(2);

clob.putString(1,"...ABC...");

File file=new File("c:/xsd.jpg");
FileInputStream fis=new FileInputStream(file);
OutputStream os=blob.getBinaryOutputStream();

Byte[] buffer=new Byte[1024];
while(fis.read(buffer) > 0)
      os.write(buffer);
fis.close();
os.close();

ps=con.prepareStatement("UPDATE MovieList SET des=?,pic=? WHERE id=?");
ps.setClob(1,clob);
ps.setBlob(2,blob);
ps.setInt(3,1);
ps.executeUpdate();

ps.close();
con.commit();


2013年3月21日 星期四

Java 連接MySQL (二) Statement 處理方式

無法查看此摘要。請 按這裡查看文章。

Java 連接MySQL (一)

無法查看此摘要。請 按這裡查看文章。

JavaScript 事件處理

onFocus: 用戶為了輸入而選擇(點擊)select、text、textArea等位置時。

onBlur: 於select、text、password、textArea失去焦點時。

onChange: 在select、text、textArea的值被改變且失去焦點時。

onClick: 當一個對象被點擊時。

onLoad: 完成載入時,通常寫在body內。

onUnload: 退出時,通常寫在body內。

onMouseOver: 滑鼠覆蓋到對象時。

onMouseOut: 滑鼠從對象上移開時。

onSelect: 當form對象中的內容被選中時。

onSubmit: 透過提交按鈕提交一個表單時。
               
        <form name="xxx" action="xxx.html" onSubmit="JavaScript:return true;"></form>
                                                                                       return false則不動作。

JavaScript的3種框兒

alert : 警告框,沒有回傳值。

prompt : 輸入(詢問)框,回傳輸入的內容,但並不常用。

confirm : 確認框,傳回boolean值,按下確定傳回true,取消傳回false。

<script language="JavaScript">
     alert("ok");
</script>



<script language="JavaScript">
     var name;
     name=prompt("請輸入你的名字");
     document.write("hello"+name);
</script>



<script language="JavaScript">
     if(confirm("確定要刪除?")){
          document.xxx.submit();
     }
</script>