i2i無料WEBパーツ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
OracleのEXCHANGE PARTITIONについてのメモです。
細かいことはあとで書くかも。とりあえずのメモです。


--サマリ用表領域作成
CREATE TABLESPACE TS_SMR
DATAFILE 'C:\ORA\DATA\SMR.dbf' SIZE 5M
SEGMENT SPACE MANAGEMENT AUTO
/


--ワーク表作成
DROP TABLE W_DEPT_SALE
/
CREATE TABLE W_DEPT_SALE(
MK_DATE CHAR(8)
,DEPT_CD CHAR(3)
,XXX_CD VARCHAR2(5)
,SALE NUMBER(10,0)
,CONSTRAINT PK_W_DEPT_SALE PRIMARY KEY( MK_DATE, DEPT_CD )
) TABLESPACE TS_SMR
/

--部門売上集計表作成
DROP TABLE S_DEPT_SALE
/
CREATE TABLE S_DEPT_SALE
(
MK_DATE CHAR(8)
,DEPT_CD CHAR(3)
,XXX_CD VARCHAR2(5) DEFAULT '0'
,SALE NUMBER(10,0) DEFAULT 0
,CONSTRAINT PK_S_DEPT_SALE PRIMARY KEY( MK_DATE, DEPT_CD )
)
PARTITION BY RANGE(MK_DATE)
(
PARTITION P_201201 VALUES LESS THAN('20120101')
,PARTITION P_999999 VALUES LESS THAN('99999999')
)
TABLESPACE TS_SMR
/

--ワーク表にデータを登録


--ワーク表の表領域をサマリ用の表領域に移動

--テストデータ作成
INSERT INTO W_DEPT_SALE VALUES('20120101','001','1',10000)
/
INSERT INTO W_DEPT_SALE VALUES('20120101','002','2',20000)
/
INSERT INTO W_DEPT_SALE VALUES('20120101','003','3',30000)
/
INSERT INTO W_DEPT_SALE VALUES('20120101','004','4',40000)
/
INSERT INTO W_DEPT_SALE VALUES('20120101','005','5',50000)
/
COMMIT
/
SELECT * FROM W_DEPT_SALE
/

--テストデータ作成(その2)
INSERT INTO W_DEPT_SALE VALUES('20120101','001','1',10000)
/
INSERT INTO W_DEPT_SALE VALUES('20120101','002','2',20000)
/
INSERT INTO W_DEPT_SALE VALUES('20120101','003',NULL,30000)
/
INSERT INTO W_DEPT_SALE VALUES('20120101','004','4',40000)
/
INSERT INTO W_DEPT_SALE VALUES('20120101','005','5',50000)
/
COMMIT
/
SELECT * FROM W_DEPT_SALE
/

--ワーク表をサマリ表のパーテションに変更
ALTER TABLE S_DEPT_SALE EXCHANGE PARTITION P_201201 WITH TABLE W_DEPT_SALE WITHOUT VALIDATION
/
SELECT * FROM S_DEPT_SALE
/
SELECT * FROM W_DEPT_SALE
/

--インデックスを再構築
ALTER INDEX PK_S_DEPT_SALE REBUILD
/

--日の売上ワーク表作成
DROP TABLE W_DATE_SALE
/
CREATE TABLE W_DATE_SALE(
MK_DATE CHAR(8)
,DEPT_CD CHAR(3)
,XXX_CD VARCHAR2(5)
,SALE NUMBER(10,0)
,CONSTRAINT PK_W_DATE_SALE PRIMARY KEY( MK_DATE, DEPT_CD )
) TABLESPACE TS_SMR
/

--テストデータ作成(その2)
INSERT INTO W_DATE_SALE VALUES('20120101','001','1','10')
/
INSERT INTO W_DATE_SALE VALUES('20120101','002','2','20')
/
INSERT INTO W_DATE_SALE VALUES('20120101','003',NULL,'30')
/
INSERT INTO W_DATE_SALE VALUES('20120101','004','4','40')
/
INSERT INTO W_DATE_SALE VALUES('20120101','005','5','50')
/
SELECT * FROM W_DATE_SALE
/

MERGE INTO S_DEPT_SALE S
USING
(
SELECT
'20120101' AS MK_DATE
,DEPT_CD
,XXX_CD
,SALE
FROM
W_DATE_SALE
) W
ON (S.MK_DATE = W.MK_DATE AND S.DEPT_CD = W.DEPT_CD)
WHEN MATCHED THEN
UPDATE SET
S.SALE = S.SALE + W.SALE
WHEN NOT MATCHED THEN
INSERT
(S.MK_DATE, S.DEPT_CD , S.XXX_CD , S.SALE)
VALUES
(W.MK_DATE, W.DEPT_CD , W.XXX_CD , W.SALE)
/
COMMIT
/
SELECT * FROM S_DEPT_SALE
/

--テストデータ作成(XXX)
INSERT INTO S_DEPT_SALE VALUES('20120101','001','1',10000)
/
INSERT INTO S_DEPT_SALE VALUES('20120101','002','2',20000)
/
INSERT INTO S_DEPT_SALE VALUES('20120101','003',NULL,30000)
/
INSERT INTO S_DEPT_SALE VALUES('20120101','004','4',40000)
/
INSERT INTO S_DEPT_SALE VALUES('20120101','005','5',50000)
/
COMMIT
/
SELECT * FROM S_DEPT_SALE
/

スポンサーサイト
Oracleの環境構築で使いそうなSQLの備忘録。
このあたりのコマンドはたまーにしか使わないのですぐ忘れるワケ。

※sysでログインして

・表領域作成

CREATE TABLESPACE 表領域名
DATAFILE 'F:\ORADATA\datafile.dbf' SIZE 256M
AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
/


・表領域削除

DROP TABLESPACE 表領域名


・表領域名変更

ALTER TABLESPACE 表領域名 rename to スキーマ


・表領域にデータファイル追加

ALTER TABLESPACE 表領域名 ADD DATAFILE 'D:\ORADATA\datafile.dbf' SIZE 1024M


・表領域のデータファイルを削除

ALTER TABLESPACE 表領域名 DROP DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\datafile.dbf';

Oracleの環境構築で使いそうなSQLの備忘録。

■ユーザ関連

※sysでログインして

・ユーザ作成
CREATE USER スキーマ名
IDENTIFIED BY パスワード
DEFAULT TABLESPACE 表領域名
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
/
GRANT CONNECT TO スキーマ
/
GRANT RESOURCE TO スキーマ
/
GRANT CREATE VIEW TO スキーマ
/
GRANT UNLIMITED TABLESPACE TO スキーマ
/


・ユーザ削除
DROP USER スキーマ CASCADE

Oracleの不要セッション削除方法のメモ

すげー負荷のかかるSQLを実行しちゃったけど、途中でセッション切りたいって事がよくあります。
そんな時の対応はsysでログインして現在のセッションを確認し、killしちゃうわけですな。

あらかじめEnterprizeManagerのトップアクティビティで負荷の高いSQLのセッションを確認しておくとよいかな。
(そういや、EnterprizeManagerでセッションをキルできるのかな・・・・)


SQL> select sid, serial#, username, machine, osuser, program, status from
v$session where username='スキーマ名'

SID SERIAL# USERNAME MACHINE OSUSER PROGRAM STATUS
130 3051 xxxxx munewo-8384 SYSTEM JDBC Thin Client INACTIVE
135 16 xxxxx munewo-8384 SYSTEM JDBC Thin Client ACTIVE
141 2984 xxxxx MSHOME\MUNEMUNE MUNE-PC\munemune ob9.exe INACTIVE

SQL> alter system kill session '135, 16';

システムが変更されました。

日付をランダムに設定する場合は、sysdateを基準にして適当に引いたりしました。


declare
cursor c_test_table is select test_table_id from test_table;
begin
for wk_cursor in c_test_table loop
update test_table set
update_date = (select sysdate - trunc(dbms_random.value(1,1000),0) from
dual)
where test_table_id = wk_cursor.test_table_id;
end loop;
commit;
end;
/

>>次のページ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。