[HOME] / [Java]
/ [Perl5] / [Palm(GCC)]
/ [Palm(CodeWarrior)] / [EJB]
/ [本の紹介]
1. はじめに |
2. 準備
3. Oracle8のインストール
4. データベースの起動と終了
5. ユーザの設定と与えられる権限
6. テーブルの作成
7. テーブルのデータ追加・検索・変更・削除
8. Net8を設定する
9. 自動起動
10. Java JDBCからのアクセス
11. Perl5からのアクセス
12. インデックスとは(準備中)
13. 参考文献
2. 準備 ↑top |
以前、RedHat Linux6.2J にリンクを張って紹介していたのですが、この上にOracle8(8.0.5)はうまくインストールされないようなので、ご注意ください。
3. Oracle8のインストール ↑top |
データベース起動用ファイル2つと、データベース作成用のスクリプトが2つ作成されます。
テーブルスペースなどの言葉が出てきたので、Oracleにおけるデータベースの管理上のくくりを以下に示します。下に行くに従って小さな単位になります。
表3.1 ORACLEの管理上のくくり データベース システムの運営単位で、この単位で識別子SIDが付与されます テーブルスペース データベースオブジェクト(テーブル・インデックスなど)を割り当てる領域を管理するための単位です セグメント テーブルスペースの中の単位でデータセグメント、インデックスセグメント、ロールバックセグメントなどに分けられます エクステント セグメントを構成する単位で、最初に確保する量とそれを超えた場合の増分という形で設定します
4. データベースの起動と終了 ↑top |
【日本語環境の設定】 (この設定はインストール前にやってもOKでしたが、インストール後に設定するのが本当のようです)
[oracle@legnum oracle]$ export NLS_LANG=JAPANESE_JAPAN.JA16SJIS
[oracle@legnum oracle]$ vi .bash_profile
( export NLS_LANG=JAPANESE_JAPAN.JA16SJIS を追加します)
【データベースの起動】
[oracle@legnum oracle]$ svrmgrl
Oracle Server Manager Release 3.0.5.0.0 - Production
(c) Copyright 1997, Oracle Corporation. All Rights Reserved.
Oracle8 Release 8.0.5.0.0 - Production
PL/SQL Release 8.0.5.0.0 - Production
SVRMGR> connect internal
接続されました。
(ここで Connected. と出るのは、環境変数 NLS_LANG が設定されてないことが多いようです)
(Vine Linux でデフォールトの Kterm は、EUC Mode だったため、字化けしてました。これは
Ctrl 押しながら真中クリックで、Shift-JIS Mode を選択すれば直ります。SJISとEUCのうち、どちらを使うのが一般的なのでしょうか?)
SVRMGR> startup (1つしかないからこれでいいのかな?)
(startup pfile=$ORACLE_HOME/dbs/inittest.ora
が本当なのかな?)
Oracleインスタンスが起動しました。
システム・グローバル領域合計
4754704バイト
Fixed Size
48400バイト
Variable Size
4222976バイト
Database Buffers
409600バイト
Redo Buffers
73728バイト
データベースがマウントされました。
データベースがオープンされました。
VRMGR> exit
【起動の確認】
プロセスを調べると以下のようになります。
[oracle@legnum oracle]$ ps x
PID 端末 状態 時間 コマンド
...........
3949 ? S 0:00 ora_pmon_test
3951 ? S 0:08 ora_dbw0_test
3953 ? S 0:10 ora_lgwr_test
3955 ? S 0:00 ora_ckpt_test
3957 ? S 0:00 ora_smon_test
3959 ? S 0:00 ora_reco_test
【データベースの終了】
[oracle@legnum oracle]$ svrmgrl
SVRMGR> connect internal
接続されました。
SVRMGR> shutdown
データベースがクローズされました。
データベースがディスマウントされました。
Oracleインスタンスが停止しました。
SVRMGR> exit
5. ユーザの設定と与えられる権限 ↑top |
[oracle@legnum oracle]$ sqlplus
SQL*Plus: Release 8.0.5.0.0 - Production on 土 Apr 17 2:15:19 1999
(c) Copyright 1998 Oracle Corporation. All rights reserved.
ユーザー名を入力してください。system
パスワードを入力してください。xxxxxx (Install時に
指定したパスワードです)
Oracle8 Release 8.0.5.0.0 - Production
PL/SQL Release 8.0.5.0.0 - Production
に接続されました。
(新規ユーザ egami を作ってみます。xxxxxx は新規ユーザのパスワードです)
SQL> create user egami identified by xxxxxxx default
tablespace users temporary tablespace temp;
ユーザーが作成されました。
SQL> exit
Oracle8 Release 8.0.5.0.0 - Production
PL/SQL Release 8.0.5.0.0 - Productionとの接続が切断されました
しかし、これだけではデータベースへの接続 (connect) も許されていません。以下にそのときの状況を示します。
[oracle@legnum oracle]$ sqlplus
SQL*Plus: Release 8.0.5.0.0 - Production on 土 Apr 17 2:15:19 1999
(c) Copyright 1998 Oracle Corporation. All rights reserved.
ユーザー名を入力してください。egami
パスワードを入力してください。xxxxxx
エラー:
ORA-01045: user EGAMI lacks CREATE SESSION privilege; logon denied
そこで必要となるのが、ユーザに与えられる権限です。これには以下の3つが用意されています。
CONNECT 権限を与えてみます
表5 権限 CONNECT データベースにはアクセス可能。オブジェクトを作成することはできない。
別ユーザのオブジェクトは,アクセス許可に従うRESOURCE オブジェクトを作成可能 DBA 完全なアクセス権を持つ
[oracle@legnum oracle]$ sqlplus
ユーザー名を入力してください。system
パスワードをを入力してください。xxxxx
SQL> grant connect to egami;
権限付与が成功しました。
[oracle@legnum oracle]$ sqlplus
ユーザー名を入力してください。egami
パスワードをを入力してください。xxxxx
Connected to:
Oracle8 Release 8.0.5.0.0 - Production
PL/SQL Release 8.0.5.0.0 - Production
(connect まではできるようになりました。表の検索などもできると思いますが、作成はできません)
(以下にその例を示します)
SQL> create table test (id number(5), name varchar2(20));
create table test (id number(5), name varchar2(20));
*
エラー行: 1: エラーが発生しました。
ORA-01950: 表領域: USERSに対する権限がありません。
(RESOUCE 権限を与えてみます)
[oracle@legnum oracle]$ sqlplus
ユーザー名を入力してください。system
パスワードを入力してください。xxxxx
SQL> grant resource to egami;
権限付与が成功しました。
これで、ユーザ egami からテーブルの作成が可能となりました。
Oracle7からはロール(権限をいくつかまとめたもの)を定義することが可能で、複数のユーザがいる場合でもこのロールを与えることで一括して権限を与えることができるようですが、ここでは省略します。元気がでたら追加するかも知れません。
6. テーブルの作成 (SQL*Plus) ↑top |
ここでは、例題としてある製品の売り上げを管理するためのテーブルを作ってみます。1つは製品の情報を示すテーブル、もう1つは売り上げ伝票にあたるものです。
製品コード
seihin_code |
製品名
seihin_name |
単価
tanka |
12345 | メモリ | 1980 |
23456 | コンデンサ | 980 |
・・・ | ・・・ | ・・・ |
年月日
uri_date |
製品コード
seihin_code |
数量
uri_suu |
1999/03/12 | 12345 | 15 |
1999/03/14 | 23456 | 7 |
・・・ | ・・・ | ・・・ |
【製品テーブルの作成】
[oracle@legnum oracle]$ sqlplus
ユーザー名を入力してください。egami
パスワードを入力してください。xxxxx
SQL> create table seihin (seihin_code number(5),
seihin_name varchar(20), tanka number(10));
表が作成されました。
【売り上げテーブルの作成】
SQL> create table utiage (uri_date date, seihin_code
number(5), uri_suu number(4));
表が作成されました。
7. テーブルのレコード追加・検索・変更・削除 (SQL*Plus) ↑top |
SQL> select uri_date, seihin_code, seihin_name,
tanka, uri_suu from seihin, uriage where uriage.seihin_code = seihin.seihin_code;
8. Net8を設定する ↑top |
LSNRCTL> start
/home/oracle/8.0.5/bin/tnslsnrを起動しています。お待ちください...
TNSLSNR for Linux: Version 8.0.5.0.0 - Production
システム・パラメータ・ファイルは/home/oracle/8.0.5/network/admin/listener.oraです。
ログ・メッセージを/home/oracle/8.0.5/network/log/listener.logに書き込みました。
リスニングしています: (ADDRESS=(PROTOCOL=ipc)(DEV=6)(KEY=test))
リスニングしています: (ADDRESS=(PROTOCOL=ipc)(DEV=10)(KEY=PNPKEY))
リスニングしています: (ADDRESS=(PROTOCOL=tcp)(DEV=11)(HOST=192.168.0.5)(PORT=1521))
(ADDRESS=(PROTOCOL=IPC)(KEY=test))に接続しています。
リスナーのステータス
------------------------
別名
LISTENER
バージョン
TNSLSNR for Linux: Version 8.0.5.0.0 - Production
開始日
27-JUN-99 20:04:21
アップタイム
0日 0時 0分 0秒
トレース・レベル
off
セキュリティ
OFF
SNMP
OFF
パラメータ・ファイル
/home/oracle/8.0.5/network/admin/listener.ora
ログ・ファイル
/home/oracle/8.0.5/network/log/listener.log
サービスのサマリー...
extproc
には、1件のサービス・ハンドラがあります。
test
には、1件のサービス・ハンドラがあります。
コマンドは正常に終了しました
9. 自動起動 ↑top |
【dbstart dbshut ユーティリティ】
インストール時に、/etc/oratab というファイルが作成されますが、このファイルにある設定をすると、$ORACLE_HOME/bin
にある dbstart, dbshut が有効となり、少し簡単に起動・終了できるようになります。
下に示すのが、/etc/oratab ですが、最後の 'N' を 'Y' にすることで上記のコマンドが有効になります。
#
# This file is used by ORACLE utilities. It is created
by root.sh
# and updated by the Oracle8 and SQL*Net install procedures.
#
# A colon, ':', is used as the field terminator. A new
line terminates
# the entry. Lines beginning with a pound sign, '#', are
comments.
#
# Entries are of the form:
# $ORACLE_SID:$ORACLE_HOME:<N|Y>:
#
# The first and second fields are the system identifier and home
# directory of the database respectively. The third field
indicates
# to the dbstart utility that the database should, "Y", or should
not,
# "N", be brought up at system boot time.
#
# Multiple entries with the same $ORACLE_SID are not allowed.
#
#
test:/home/oracle/8.0.5:N <= Y
に変更する
dbstart および dbshut は、oracle ユーザで実行します。
【dbstart dbshut を利用した自動起動/終了】
case "$1" in
start)
su $ORACLE_OWNER -c $ORACLE_HOME/bin/dbstart
su $ORACLE_OWNER -c '$ORACLE_HOME/bin/lsnrctl start'
;;
stop)
su $ORACLE_OWNER -c '$ORACLE_HOME/bin/lsnrctl stop'
su $ORACLE_OWNER -c $ORACLE_HOME/bin/dbshut
;;
esac
うまく起動できたでしょうか。今度は終了してみます。
[root@legnum init.d]# ./oractl stop
[root@legnum init.d]# cd ../rc3.d
[root@legnum init.d]# ln -s /etc/rc.d/init.d/oractl
S90oractl
こんどは終了の場合ですが、rc0.d 配下が実行されます。再起動の際のrc6.d にも入れておくようです。
[root@legnum init.d]# cd ../rc0.d
[root@legnum init.d]# ln -s /etc/rc.d/init.d/oractl
K10oractl
[root@legnum init.d]# cd ../rc6.d
[root@legnum init.d]# ln -s /etc/rc.d/init.d/oractl
K10oractl
システムを起動させて、Oracle が起動していることを確認してください。
10. Java JDBCからのアクセス ↑top |
【autoexe.bat】
SET CLASSPATH=C:\JDK1.2\JDBC\classes111.zip;
Thinドライバ用のサンプルのEmployee.java を、少し書き換えています。ファイル名を Ora.java とし、修正個所を赤で示します。
/*
* This sample shows how to list all the names from the EMP table
*
* It uses the JDBC THIN driver. See the same program in
the
* oci7 or oci8 samples directories to see how to use the other
drivers.
*/
// You need to import the java.sql package to use JDBC
import java.sql.*;
class Ora
{
public static void main (String args [])
throws SQLException
{
// Load the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
// Connect to the database
// You must put a database name after the @ sign
in the connection URL.
// You can use either the fully specified SQL*net
syntax or a short cut
// syntax as <host>:<port>:<sid>.
The example uses the short cut syntax.
Connection conn =
DriverManager.getConnection ("jdbc:oracle:thin:@192.168.0.5:1721:test",
"egami",
"egapass"); <=
egami が sqlplus のユーザ名で、egapass がパスワードを示します
// Create a Statement
Statement stmt = conn.createStatement ();
// Select the ENAME column from the EMP table
ResultSet rset = stmt.executeQuery ("select NAME
from testtable");
// Iterate through the result and print the employee
names
while (rset.next ())
System.out.println (rset.getString (1));
}
}
以下をMS-DOSプロンプトにてコンパイルします。
C:\jdk1.2\jdbc>javac Ora.java
実行してみます。このとき、前節のNet8のリスナを立ち上げておく必要があります。
C:\jdk1.2\jdbc>java Ora
Exception in thread "main" java.sql.SQLException:
Connection refused: no further
information
at
oracle.jdbc.dbaccess.DBError.check_error(DBError.java:228)
at
oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:110)
at
oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:148)
at
java.sql.DriverManager.getConnection(Compiled Code)
at
java.sql.DriverManager.getConnection(DriverManager.java:137)
at
Ora.main(Compiled Code)
いつものことですが、うまく行きませんね。Connection refused と言っていますから、接続の情報が間違っているのでしょう。実はこのサンプルのport番号が1721となっていて、Net8 で使った listener.ora の指定(1521)と異なっているのです。
これを直して、もう一度コンパイルしてみます。
....
Connection conn =
DriverManager.getConnection ("jdbc:oracle:thin:@192.168.0.5:1521:test",
"egami",
"egapass");
...
C:\jdk1.2\jdbc>javac Ora.java
C:\jdk1.2\jdbc>java
Ora
ああ
abc
日本語もちゃんと出ています。
11. Perl5からのアクセス ↑top |
【データ検索: select】
#!/usr/bin/perl
use DBI;
$ds = "dbi:Oracle:test";
$user = 'egami/egamipass'; <-
sqlplus のユーザ名とパスワードです
$pass = '';
$dbh = DBI->connect($ds, $user, $pass)
or die "Cannot connect: "
. $DBI::errstr;
$sth = $dbh->prepare("select id,name from test ") or die "Cannot prepare: " . $sth->errstr();
$sth->execute() or die "Cannot execute: " . $sth->errstr();
while ( @row = $sth->fetchrow_array() )
{
print "@row\n";
}
$sth->finish();
$dbh->disconnect();
【データ挿入: insert】
#!/usr/bin/perl
use DBI;
$ds = "dbi:Oracle:test";
$user = 'egami/egamipass'; <-
sqlplus のユーザ名とパスワードです
$pass = '';
$dbh = DBI->connect($ds, $user, $pass)
or die "Cannot connect: "
. $DBI::errstr;
$sth = $dbh->do("insert into test values(15,'egami')")
or die "Cannot Do: " . $dbh->errstr();
$sth = $dbh->prepare("select id,name from test ") or die "Cannot prepare: " . $sth->errstr();
$sth->execute() or die "Cannot execute: " . $sth->errstr();
while ( @row = $sth->fetchrow_array() )
{
print "@row\n";
}
$sth->finish();
$dbh->disconnect();
12. インデックスとは (SQL*Plus) ↑top |
13.参考文献 ↑top |
このページにご意見のある方は、egami@ee.e-mansion.com までお願い致します。