OracleのSQLコマンド

よく使うOracle8iのコマンドをメモ。Oracle10iでもほぼ同じ。

 

 

 

 


【SQL*Plus編】


 

■シェルからSQL/PLUSを使う

$ sqlplus /nolog

 

■ログインする

いくつかの方法がある。 

conn sys as sysdba
conn / as sysdba
conn sys/change_on_install
conn system/manager
conn scott/tiger
conn scott

データベース管理者ユーザー

  • SYSユーザー:管理に重要なデータ・ディクショナリを所有している。
  • SYSTEMユーザー:管理情報が含まれる表やビューを所有している。

セキュリティの理由からSYSユーザーとSYSTEMユーザーの初期パスワードは、早めに変更した方がよい。(passwordとコマンドを入力するだけで簡単に変更できる)

 

 


【Oracle管理編】


データベースを作成したら、表領域を確認して、ユーザーの作成を行う。

管理の作業は、管理者でログインして行う。

$ sqlplus /nolog
SQL> conn system/manager  (Oracle 8i)
SQL> conn sys as sysdba (Oracle 10g)

 

■表領域の確認

SQL> SELECT tablespace_name, status, contents FROM dba_tablespaces;

 

■表領域とデータ・ファイル情報の取得

SQL> SELECT file_name, tablespace_name FROM dba_data_files;

 

■ユーザーのデフォルト表領域

SQL> SELECT username, default_tablespace FROM dba_users;

 

■ユーザーの一覧

 SQL> SELECT username, default_tablespace FROM dba_users;

 

■ユーザー作成

CREATE USER suzuki     
  IDENTIFIED BY xxxxxx
 DEFAULT TABLESPACE users
 TEMPORARY TABLESPACE temp
 QUOTA unlimited ON users;

 

QUOTAを必ず付ける。QUOTA 15m ON usersなど。
後から変更もできる。(Oracle 8i)

ALTER USER suzuki QUOTA unlimited on temp;
ALTER USER suzuki QUOTA unlimited on rbs;

 

■ユーザー作成後に権限の付与(ロールを与える。ざっくりと指定。)

GRANT connect, resource TO suzuki;

 これを付与しないと、せっかくユーザを作ってもログインさえできない。

 

■ユーザー作成後に権限の付与(システム権限を与える。細かく指定。)

アプリケーション開発者向けの場合、

SQL> GRANT CREATE SESSION, CREATE TABLE, 
  2  CREATE SEQUENCE, CREATE VIEW, CREATE PROCEDURE
  3  TO suzuki;

 

■権限の確認

 自分が持っている権限を確認できる。

SQL> SELECT * FROM session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
ALTER SESSION
CREATE TABLE
CREATE ANY TABLE
CREATE CLUSTER
CREATE ANY INDEX
CREATE SYNONYM
CREATE ANY SYNONYM
CREATE VIEW
CREATE ANY VIEW
CREATE SEQUENCE
CREATE DATABASE LINK

 

 

■ユーザーの削除

DROP USER suzuki;
 ユーザーの所有するスキーマ・オブジェクトも一緒に削除
 DROP USER suzuki CASCADE;

 注意:接続しているユーザーがいたらダメ。

 

■誰が何のプロファイルを使用しているか

SELECT username, profile
 FROM dba_users;

 

■新規にテーブルを作成する

CREATE TABLE emp
 (id      number,
 last_name  varchar2(100));

 

■既存のテーブルから新しいテーブルを作成する

部署の番号が20のものを拾って、新しいemp表を作る。

CREATE TABLE new_emp AS
SELECT * FROM emp
WHERE deptno = 20;

 

■テーブルを一覧する

SELECT * FROM tab;

よく使う。手クセになるコマンドのひとつ。

まず、これで手持ちのテーブルを一覧して、次に列の一覧でフィールド名を確認する。 

 

■列の一覧

DESC emp;

これも手クセになるはず。 

 

■列を追加する

ALTER TABLE emp
 ADD (first_name varchar2(10));

列の一覧で確認し、足りないフィールドがあったらこれで足していく。 

 

■列を削除する

ALTER TABLE emp
 DROP (first_name);

 

■列を変更する

ALTER TABLE emp
 MODIFY (first_name varchar2(30));

 

■一意キーを作成する

ALTER TABLE emp
 ADD CONSTRAINT id_pk PRIMARY KEY(id);

 

■順序(主キー値)の作成 

CREATE SEQUENCE emp_id_seq
 START WITH 1
 INCREMENT BY 1
 NOCACHE
 NOCYCLE;

 

■順序(主キー値)の確認

SELECT sequence_name, last_number
 FROM user_sequences;

 

 


【Oracle SQL編】


 ■日付で検索する

SELECT id, name FROM emp
WHERE birthday = TO_DATE( '1980/09/28' , 'YYYY/MM/DD' ) ; 
SELECT id, name FROM emp
WHERE TO_CHAR( birthday, 'YYYYMMDD' ) = '1980/09/28' ;

 

■期間で検索する

SELECT id, name FROM emp
WHERE birthday >= TO_DATE( '1980/09/28' , 'YYYY/MM/DD' ) 
AND birthday < TO_DATE( '1981/09/28' , 'YYYY/MM/DD' ) ;

 

 

■インサート文

INSERT INTO emp
(id, name)
VALUES
( 3, '高橋' ); 

 順序を使うとき、

INSERT INTO emp
(id, name)
VALUES
( emp_seq.nextval, '高橋' );

 

■データの修正

日付を一括変更。ついでにメモ欄を空にする。

UPDATE emp
SET 
modify_date = TO_DATE('2004/12/16', 'YYYY/MM/DD') , 
memo = NULL ; 

 

■データの修正

‘Sales’ を ‘SALE’ に変更。 

SQL> UPDATE emp
  2  SET 
  3  dept = 'SALE'
  4  WHERE dept = 'Sales'; 

 

■文字列を数値に変換

‘00123’という文字列は、数字の123に変換したい。

SQL> UPDATE emp
  2  SET
  3  num_no = to_number( str_no );

 

■数値を文字列に変換 

数字の123を文字列の’123’に変換したい。

SQL> UPDATE emp
  2  SET
  3  str_no = to_char( num_no );

 

■行を削除する

 SQL> DELETE FROM emp
  2  WHERE id = 300;

 

 

 

 


【Oracle エラー編】


 ■インサート文でエラー

  ORA-01552: SYSTEM表領域でない表領域:
   USERSにシステム・ロールバック・セグメントは使用できません。

原因として、ロールバックセグメントがオフラインになっている可能性がある。

SELECT segment_name, status
 FROM dba_rollback_segs;
  SEGMENT_NAME                   STATUS
 ------------------------------ ----------------
 SYSTEM                         ONLINE
 R01                            OFFLINE
 R02                            OFFLINE
 R03                            OFFLINE
 R04                            OFFLINE

STATUSがOFFLINEになっていたので、
/u01/app/oracle/product/8.1.5/dbs/initXXX.oraを編集。
# rollback_segments = (r01, r02, r03, r04)のコメントを外して有効にする。
そして、dbshutでデータベース停止、dbstartでデータベース開始する。