oracle学習ノート(三)-Oracle操作

12030 ワード

一.Javaプログラムはoracleをどうやって操作しますか?
1.odbcデータソースを配合し、jdbc_を使用する。odbc橋の接続方式はデータベースに接続します。
        注意:odbcはローカルにしか接続できません。リモートに接続できません。つまり、java程とOracleデータベースは同じマシンにある必要があります。
        コントロールパネル->>管理ツール->データソース[ODBC],追加->Oracle in OraHome 90->が完了しました。
        Data Source Name:test
        TNS Service Name:Oracleのサービスを選択します。
        Test Connectionをクリックしてポップアップボックスをイジェクトし、ユーザー名とパスワードを入力して接続がOKかどうかをテストすることを提案します。
Javaコード:
package com.bijian.study;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class TestOra {

public static void main(String[] args) {
try {
//1.    
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//2.    
Connection ct = DriverManager.getConnection("jdbc:odbc:test","scott","tigger");
Statement sm = ct.createStatement();
ResultSet rs = sm.executeQuery("select * from emp");
while(rs.next()) {
//     
System.out.println("   :" + rs.getString(2));
}
//       
rs.close();
sm.close();
ct.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
 
2.jdbc接続oracle
        まず、oracleドライババックを工事に追加します。
package com.bijian.study;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class TestOra2 {

public static void main(String[] args) {
try {
//1.    
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.    
Connection ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1","scott","tigger");
Statement sm = ct.createStatement();
ResultSet rs = sm.executeQuery("select * from emp");
while(rs.next()) {
//     
System.out.println("   :" + rs.getString(2));
}
//       
rs.close();
sm.close();
ct.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
 
3.oracle改ページ例
        empテーブルのユーザ情報を改ページで表示します。
        Tomcatがデフォルトのポートを占有している場合、apache-tomcat\conf\server.xmlファイルを開いて、8080ポートを他のポートに変更すればいいです。
        コードは以下の通りです。
<%@ page language="java" import="java.util.*,java.sql.*" contentType="text/html; charset=gbk"
    pageEncoding="gbk"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h2>oracle    </h2>
<table>
<tr>
<td>   </td>
<td>  </td>
</tr>
<%
//1.    
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.    
Connection ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1","scott","tigger");
Statement sm = ct.createStatement();
int pageNow = 1;
//  pageNow
String s_pageNow = (String)request.getParameter("pageNow");
if(s_pageNow != null) {
pageNow = Integer.parseInt(s_pageNow);
}
//     
int pageCount = 0;
//     
int rowCount = 0;
//        
int pageSize = 3;
ResultSet rs = sm.executeQuery("select count(*) from emp");
if(rs.next()) {
rowCount = rs.getInt(1);
if(rowCount%pageSize==0) {
pageCount = rowCount/pageSize;
}else {
pageCount = rowCount/pageSize + 1;
}
}
rs = sm.executeQuery("select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum<=" + pageNow*pageSize + ") where rn>=" + ((pageNow-1)* pageSize + 1));
while(rs.next()) {
out.println("<tr>");
//     
out.println("<td>" + rs.getString(2) + "</td>");
out.println("<td>" + rs.getString(6) + "</td>");
out.println("</tr>");
}
//     
for(int i=1;i<=pageCount;i++) {
out.print("<a href=MyTest.jsp?pageNow=" + i + ">[" + i + "] </a>");
}
//       
rs.close();
sm.close();
ct.close();
%>
</table>
</body>
</html>
 
二.oracleでデータを操作する方法
1.特定の書式で日付値を挿入する
to_を使用するdate関数
insert into emp values(9998,’  ’,’MANAGER’,7782,’11-11 -1988’,78.9,55.33,10);
insert into emp values(9997,’  2’,’MANAGER’,7782,to_date(’1988-12-12’,’yyyy-mm-dd’),78.9,55.33,10);
insert into emp values(9996,’  3’,’MANAGER’,7782,to_date(’1988/12/12’,’yyyy/mm/dd’),78.9,55.33,10);
  
2.サブクエリを使ってデータを挿入する
        valuesサブフレーズを使用すると、一回に一行のデータしか挿入できません。サブクエリを使用してデータを挿入すると、一つのinsert文が大量のデータを挿入できます。行の移動を処理したり、外部テーブルのデータをデータベースにロードしたりする場合、サブクエリを使用してデータを挿入することができます。
create table kkk(myId nuber(4),myname varchar2(50),myDept number(5));
insert into kkk(myId,myname,myDept) select empno,ename,deptno from emp where deptno=10;
 
3.サブクエリを使ってデータを更新する
        udate文を使ってデータを更新する場合は、表式または数値を使って直接データを修正することもできますし、修正データをサブクエリーで検索することもできます。
        社員のscottの職位、給料、補助はSMITHの従業員と同じであることを望みます。
update emp set job=(select job from emp where ename=’SMITH’), sal=(select sal from emp where ename=’SMITH’), comm.=(select comm. from emp where ename=’SMITH’);
このように書くべきです
update emp set (job,sal,comm) = (select job,sal,comm. from emp where ename=’SMITH’) where ename=’SCOTT’;
 
三.oracle事務処理
        1.事務はデータの整合性を保証するために使われます。これは関連するdml文のセットからなります。グループのdml文は全部成功するか、それとも全部失敗するかを保証します。例えば、オンライン振替は典型的な事務で処理して、データの整合性を保証します。
        2.ビジネス操作を行う場合(dml文)、oracleは、作用するテーブルにロックをかけ、他のユーザーがテーブルを変更する仕組みを防止します。
        3.comit文を使うと事務を提出することができます。comit文を実行すると、事務の変化、事務の終了、保存点の削除、ロック解除が確認されます。comit文を使って事務を終了すると、他のセッションでは、事務変化後の新しいデータが確認されます。
     :savepoint a1;
    :delete from emp where empno=9996;
      :savepoint a2;
     :delete from emp where empno=9999;
   a2:rollback to a2;
   a1:rollback to a1;
        4.事務のいくつかの重要な操作
a.保存点を設定する:savepint a;
b.一部の業務をキャンセルする:rollback to a;
c.全ての業務をキャンセルする:rollback
        5.javaプログラムの中で事務をどうやって使いますか?
ct.setAutoCommt(false);
ct.com mmit()
ct.rollback();
        6.読み取り専用のトランザクション
        読み取り専用のトランザクションとは、クエリーの操作のみを許可することであり、他のdml操作は一切許可されていません。読み取り専用のトランザクションを使用すると、ユーザがある時点のデータしか取得できないことを確認できます。航空券の代理店が毎日18時から今日の販売状況を統計していると仮定して、読み取り専用の事務を利用することができます。読み取り専用のトランザクションが設定されている場合、他のセッションは新しいトランザクションを提出することがありますが、読み取り専用のイベントは最新のデータの変化を取得しないので、特定の時点のデータ情報を取得することが保証されます。
        読み取り専用の設定事項:set traction read only
 
四.sql関数の使用
1.文字関数
        文字関数はoracleで最も一般的な関数です。
lower(char):            
upper(char):            
length(char):        
substr(char,m,n):       
replace(char1,search_string,replace_string)
instr(char1,char2,[,n[,m]]):          
1)全社員の名前を小文字で表示する
select lower(ename),sal from emp;
2)全社員の名前を大文字で表示する
select up per(ename)、sal from emp;
3)ちょうど5文字の従業員の名前を表示します。
select*from emp where length=5;
4)全従業員の名前を表示する前の3文字
select substr(ename,1,3)from emp;
説明:substr(列名、何位から取りますか?どれぐらい取りますか?)
5)全員の名前を頭文字で大文字で表示する
selectup(substr(ename,1,1))from emp;
6)すべての従業員の名前を初回小文字で表示する
select lower(substr(ename,1,1))from emp;
replace(char 1,search u)ストリングstring
instr(char 1,char 2,[,n[,m]]は文字列の位置にサブストリングを取ります。
7)全従業員の名前を表示し、Aをすべての「A」に置き換えます。
select replace(ename,’A’,’a’)from emp;
 
2.数学関数
        数学関数の入力パラメータと戻り値のデータタイプはすべてデジタルタイプです。数学関数はcos、cos h、exp、ln、log、sin、sinh、sqrt、tan、tanh、acos、asin、aton、roundを含みます。
round(n,[m]):        ,    m,        ;  m   ,          m  ;  m   ,          m  。
trunc(n,[m]):      ,    m,       ,  m           m  ,  m   ,         m 
mod(m,n)
floor(n):        n     
ceil(n):        n     
abs(n):    n    
acos(n):         
asin(n):         
atan(n):        
cos(n)
exp(n):  e n  
log(m,n):     
power(m,n):  m n  
1)一ヶ月で30日間と表示されている場合、社員全員の日給は、残額を無視します。
select trunc(sal/30),ename from emp;
select floor(sal/30),ename from emp;
2)実例
select round(sal) from emp where ename=’SMITH’;
select round(comm,1),comm from emp where ename=’SMITH’;
select trunc(comm,1),comm. from emp where ename=’SMITH’;
select trunc(comm),trunk(comm,-1),comm. from emp where ename=’SMITH’;
select floor(comm),comm from emp where ename=’SMITH’;
select ceil(comm),comm from emp where ename=’SMITH’;
select mod(10,2) from dual;--  oracle   ,   dual(   )
3)select abs(-13)from dual;
 
3.日付関数
        日付関数は、dateタイプのデータを処理するために使用されます。デフォルトでは日付フォーマットはdd-mon-yyで、12-7月-78月-78日です。
sysdate:システム時間select sdate from dualに戻る。
add_monts(d,n)
ラスター.day(d):指定された日付の月の最後の日に戻ります。
1)8ヶ月以上入社した社員を調べます。
select*from emp where sdate>add_monts(hiredate,8)
2)10年間のサービス年限を表示している従業員の名前と雇用期日
select*from emp where sdate==add_monts(hiredate、12*10);
3)従業員ごとに入社日数を表示する
select trunc(sysdate-hiredate)「入社日数」、ename from emp;
4)毎月の最後から3日目に雇われた全従業員を探し出す。
select hiredate,ename from emp where last_day(hiredate)-2=hiredate;
 
4.変換関数
変換関数は、データタイプを1つから別のタイプに変えるために使用されます。この場合、oracle server許容値のデータタイプは実際とは異なります。oracle serverには暗黙的に変換データタイプが含まれます。
たとえば:
1)create table t 1(id int)
insert into t 1 values(‘10’)--こうしてoracleは自動的に’10’を10’に変えます。
2)create table t 2(id varrcal 2(10))
insert into t 2(id varrcal 2(10));このようにoracleは自動的に1を‘1’に変えます。
oracleは暗黙的なデータタイプの変換が可能であるが、全ての場合には適応しておらず、プログラムの信頼性を向上させるために、変換関数を使用して変換するべきである。
3)トウchar
select ename、hiredate、sal from emp where deptnoo=10が使えます。メッセージを表示しますが、場合によっては、これはあなたの要求を満たすことができません。
a.日付が表示されますか?
select ename,to_char(hiredate)'yyy-mm-dd hh 24:mi:ss')from emp;
yy:       2004->04
yyyy:       2004 
mm:       8 ->08
dd:2     ,30 ->30
hh24:8 ->20
hh12:8 ->08
mi、ss:    、 
b.給与は指定された通貨記号を表示することができますか?
9:    ,     0
0:    ,     ,  0  
.:          
,:         
$:       
L:           
C:           
G:           
D:            (.)
select ename,to_char(hiredate,’yyyy-mm-dd hh24:mi:ss’),to_char(sal,’L99999.99’) from emp;
select ename,to_char(hiredate,’yyyy-mm-dd hh24:mi:ss’),to_char(sal,’L99,999.99’) from emp;
select ename,to_char(hiredate,’yyyy-mm-dd hh24:mi:ss’),to_char(sal,$99,999.99’) from emp;
1980年入社した社員全員を表示します。
select*from emp where to_char(hiredate)=1980;
12月に入社した全社員を表示します。
select*from emp where to_char(hiredate,’mm’)=12;
 
5.システム関数
sys.context
1)terminal:現在のセッションクライアントに対応する端末の識別子
2)langage:言語
3)db_name:現在のデータベース名
4)nls_date_フォーマット:現在のセッションのお客様に対応する日付フォーマット
5)session_user:現在のセッションクライアントに対応するデータベース名
6)current_schema:現在のセッションの顧客に対応するデフォルトのプログラム名
7)host:データベースがあるホストの名前を返します。
この関数を通して、どのデータベースを使っていますか?
select sys_context(‘userenv’,’db_name’) from dual;
select sys_context(‘userenv’,’language’) from dual;
select sys_context(‘userenv’,’session_user’) from dual;
select sys_context(‘userenv’,’current_schema’) from dual;