よく使うOracle8iのコマンドをメモ。Oracle10iでもほぼ同じ。
$ sqlplus /nolog
いくつかの方法がある。
conn sys as sysdba
conn / as sysdba
conn sys/change_on_install
conn system/manager
conn scott/tiger
conn scott
データベースを作成したら、表領域を確認して、ユーザーの作成を行う。
管理の作業は、管理者でログインして行う。
$ 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;
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;
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でデータベース開始する。