FC2ブログ

まったり開発日誌

embossの工具箱(J2EE Java2 Linux Zaurus C++)

開発メモ-データベース

  1. BYPASS_UJVC(Updatable Join View Check)(10/07)
  2. OracleでPFILEとSPFILEのどちらを使っているのか調べる(10/07)
  3. マルチテーブルアップデート(10/07)
  4. Oracle9iでルータ越えの設定をする(10/07)
  5. PL/SQLで時間を計測する(10/07)
前のページ 次のページ

BYPASS_UJVC(Updatable Join View Check)

BYPASS_UJVC(Updatable Join View Check)

結合ビュー(Join View)に対してUPDATEを実施すると、2つの表の主キーが一致しておらず内容的にも重複がある(対象表の同一行を複数回更新する)場合

ORA-01779:
 複数表にマップする列を変更できません。(Oracle8iの場合)
 キー保存されていない表にマップする列は変更できません(Oracle9iの場合)

原因:
 キー保存されていない表にマップする結合ビューの列を挿入または更新しようとしました。
処置:
 基礎となる実表を直接変更してください。

というエラーになります。

結合キーが一意でない結合ビュー(Join View)に対して UPDATEを実施したい場合、Oracle8i以降の環境では BYPASS_UJVCというヒントを付けて実行するとORA-1779エラーが発生しません。

参考URL
http://pukiwiki.postcle.com/zange/index.php?BYPASS_UJVC
  1. 2005/10/07(金) 18:14:10|
  2. 開発メモ-データベース
  3. | トラックバック:0
  4. | コメント:0

OracleでPFILEとSPFILEのどちらを使っているのか調べる

pfile、spfileのどちらから起動したのかを知りたい

「show parameter spfile とコマンドしてパスが表示されればspfile、
表示されなければpfileということになります」
  1. 2005/10/07(金) 18:13:21|
  2. 開発メモ-データベース
  3. | トラックバック:0
  4. | コメント:0

マルチテーブルアップデート

マルチテーブルアップデート

複数テーブルの情報からUPDATEを実行する方法を検証しました。以下のようにすればDテーブルの内容でCテーブルを更新することが出来ます。
しかしこの方法はあまり早く有りません。(かといってそんなに遅くもありません。)
結合ビュー(Join View)に対してUPDATEを実施するほうが高速に動作するようです。方法はBYPASS_UJVCを参照の事。

create table C(
TEL_NUMBER VARCHAR2(10) NOT NULL, /* KEY */
KBN1 VARCHAR2(10),
KBN2 VARCHAR2(10),
CONSTRAINT C_PK PRIMARY KEY (TEL_NUMBER)
);

create table D(
TEL_NUMBER VARCHAR2(10) NOT NULL, /* KEY */
KBN1 VARCHAR2(10),
KBN2 VARCHAR2(10),
CONSTRAINT D_PK PRIMARY KEY (TEL_NUMBER)
);

insert into C values('1','','');
insert into C values('2','','');
insert into C values('3','','');
insert into C values('4','','');
insert into C values('100','','');


insert into D values('1','a','a');
insert into D values('2','b','b');
insert into D values('3','c','c');
insert into D values('200','d','d');
insert into D values('5','e','e');


UPDATE C
SET (KBN1,KBN2)=
(SELECT D.KBN1,D.KBN2 FROM D WHERE C.TEL_NUMBER = D.TEL_NUMBER)
WHERE EXISTS
(SELECT 'x' FROM D WHERE C.TEL_NUMBER = D.TEL_NUMBER);


select * from C;

drop table C;
drop table d;
  1. 2005/10/07(金) 18:12:44|
  2. 開発メモ-データベース
  3. | トラックバック:0
  4. | コメント:0

Oracle9iでルータ越えの設定をする

以下のようにします。

ALTER SYSTEM SET
dispatchers='(PROTOCOL=TCP)';

DISPATCHERS は、共有サーバー・アーキテクチャ内のディスパッチャ・プロセスを構成します。Oracle のパラメータ解析部は、属性を順番にかかわりなく大/ 小文字を区別せずに指定できるような名前値の構文をサポートします。次に例を示します。 DISPATCHERS = "(PROTOCOL=TCP)(DISPATCHERS=3)"
今回のリリースでは、ALTER SYSTEM 文のDISPATCHERS 初期化パラメータで、SCOPE 句がサポートされていません。
現行のインスタンスのDISPATCHERS パラメータを再構成するには、SCOPE 句を指定せずにALTER SYSTEM SET DISPATCHERS 文を発行します。この新しい構成を永続化するには、データベースを起動する前に初期化パラメータ・ファイルのDISPATCHERS パラメータを指定します。サーバー・パラメータ・ファイル(spfile)を使用してデータベースを起動している場合は、CREATE SPFILE を発行して、初期化パラメータからspfile を再作成する必要があります。
  1. 2005/10/07(金) 18:07:37|
  2. 開発メモ-データベース
  3. | トラックバック:0
  4. | コメント:0

PL/SQLで時間を計測する

PL/SQLで時間を計測する

DECLARE
StartTime NUMBER;
EndTime NUMBER;
ElapsedTime NUMBER;
i BINARY_INTEGER;
j BINARY_INTEGER;
BEGIN
-- 計測開始
StartTime := DBMS_UTILITY.GET_TIME;
for i IN 1..1000 LOOP
for j IN 1..1000 LOOP
NULL;
-- 何らかの処理
END LOOP;
END LOOP;
-- 計測終了
EndTime := DBMS_UTILITY.GET_TIME;
ElapsedTime := ( EndTime - StartTime ) / 100;
DBMS_OUTPUT.PUT_LINE( TO_CHAR( ElapsedTime, '9999.99' )||'秒' );
END;
  1. 2005/10/07(金) 18:06:35|
  2. 開発メモ-データベース
  3. | トラックバック:0
  4. | コメント:0
前のページ 次のページ

RSSフィード

カレンダー

07 | 2019/08 | 09
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

カテゴリー

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

リンク

このブログをリンクに追加する

メールフォーム

名前:
メール:
件名:
本文: