Web Artisan Blog - ウェブ アルチザン ブログ

SQL:Oracle:スキーマ、シノニムとは何か?

SQL

2004年08月27日

以下、Oracle9iデータベース概要より、抜粋・加工しました。
>Oracleドキュメントダウンロードサイト

>続きを読む・・・SQL:Oracle:スキーマ、シノニムとは何か?
0 Comment  0 Trackback  Permalink

SQL:Oracle:ヒント(ヒント句、ヒントオプション)とは?

SQL

2004年08月25日

SQL文中にコメントとして記述し、実行計画を明示的に指示できる。
SELECT、UPDATE、INSERT、DELETEのいずれかのキーワードの後でのみ指定できる。

(構文)

/*+ ・・ヒント・・ */
--+ ・・ヒント・・



※コメント符号に”+”を付ける事で、ヒントと認識される
※コメント符号とプラス記号の間の空白入れてはいけない
※プラス記号とヒントの間の空白は、入れても入れなくてもよい
※複数のヒントは、空白で区切る
※ヒント自体が構文エラーでも、コメントとして解釈される為、エラーにならない

(記述例)

SELECT /*+ INDEX(TABLE1) */
COLUMN_A,COLUMN_B
FROM TABLE1
WHERE ・・・・



※INDEX・・・指定された表の索引(INDEX)を使った実行計画を指示できる

<もっと詳しく知れるサイト>
>SQLチューニング編3-SQL 実行計画解析、EXPLAIN、ヒントオプション
0 Comment  0 Trackback  Permalink

Oracle:Update時に、ORA-01779: キー保存されていない表にマップする列は変更できません のエラーが発生

SQL

2004年08月11日

ビューUPDATE文で更新先のレコード1行に更新元のレコードが複数行対応する場合(一意にならない可能性がある場合)発生する。


UPDATE (
SELECT a.NAME
FROM TEST1 a,TEST2 b
WHERE a.ID = b.ID
AND a.KEYID = b.KEYID1
AND b.KEYID2 =0) A
SET A.NAME = 'TEST';



TEST1テーブルのキー項目・・・ID,KEYID
TEST2テーブルのキー項目・・・ID,KEYID1,KEYID2,KEYDATE

上記の場合、a.ID = b.ID AND a.KEYID = b.KEYID AND b.KEYID2 =0だけではTEST2テーブルのレコードは一意にならない為、発生する。

回避策
SELECT項目に 「/*+ BYPASS_UJVC */」を入れることにより、エラーが発生しなくなる。

例(改善)

UPDATE (
SELECT /*+ BYPASS_UJVC */ a.NAME
FROM TEST1 a,TEST2 b
WHERE a.ID = b.ID
AND a.KEYID = b.KEYID1
AND b.KEYID2 =0) A
SET A.NAME = 'TEST';



ただし更新先のレコード1行に更新元のレコードが複数行対応するケースがある場合、
更新先のレコードが複数回更新されてしまう為、使い方に注意が必要

例の場合だと、TEST2テーブルに、「ID=1,KEYID1=1,KEYID2=0,KEYDATE=20040801」
「ID=1,KEYID=1,KEYID2=0,KEYDATE=20040802」のデータがあると、TEST1テーブルのNAMEを2回更新することになる。

0 Comment  0 Trackback  Permalink

Oracle:ODBC経由にてリンクを張る時に、[Microsoft][ODBC Driver Manager]SQL_HANDLE_ENVでのドライバのSQLAllocHandleは失敗しました。のエラーが発生

SQL

2004年08月03日

環境変数のpathにOracleHOME\binを追加していない為、発生。

追加すると、ODBC経由でリンクを張ることができる。

SQLに直接関係ないんですが、当てはまるとこないので、ここに投稿します。

0 Comment  0 Trackback  Permalink