裏ブログ

家族には内緒のブログ

Oracle EXPLAIN PLANの作成方法

2006-01-15 02:14:34 | DB
--/u01/app/oracle/product/8.1.7/rdbms/admin/utlxplan.sql
create table PLAN_TABLE (
statement_id varchar2(30),
timestamp date,
remarks varchar2(80),
operation varchar2(30),
options varchar2(30),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns number,
id numeric,
parent_id numeric,
position numeric,
cost numeric,
cardinality numeric,
bytes numeric,
other_tag varchar2(255),
partition_start varchar2(255),
partition_stop varchar2(255),
partition_id numeric,
other long,
distribution varchar2(30))
/

Oracle EXPLAIN PLANの参照方法

2006-01-15 02:11:57 | DB
select
substr(
RPAD(
decode(ID,0,'',LPAD(' ',3*(LEVEL -1) ) || LEVEL || '.' || POSITION)
|| ' ' || decode(OPERATION,'REMOTE',OPERATION
|| '【' || OBJECT_NODE || '】' , OPERATION)
|| ' ' || OPTIONS || ' ' || OBJECT_TYPE,60)
|| DECODE(OBJECT_NAME,NULL,'',DECODE(OBJECT_OWNER,NULL,
'【TABLE】' || OBJECT_NAME || ' ' ,
'【TABLE】' || OBJECT_OWNER || '.' || OBJECT_NAME || ' '))
|| DECODE(ID,0,'COST = ' || POSITION),1,100) qUERY
FROM educ07.PLAN_TABLE
CONNECT BY PRIOR ID = PARENT_ID AND STATEMENT_ID = 'TERADA_2'
START WITH ID = 0 AND STATEMENT_ID = 'TERADA_2'
/

Oracle EXPLAIN PLANの登録方法

2006-01-15 02:11:06 | DB
EXPLAIN PLAN
set statement_id = 'AAA'
into educ07.plan_table
for select ename
from emp
where ename like 'S%'

EXPLAIN PLAN
set statement_id = 'AAA'
into educ07.plan_table
for select *
from NATION N,BORDER B
where N.CODE = B.desc NATION_CODE


select sysdate from dual


DELETE FROM educ07.PLAN_TABLE
WHERE STATEMENT_ID = 'AAA'

SQL*Plus コマンド

2006-01-15 02:03:21 | DB
SHOW ALL 全パラメータの確認
SET TIMING ON/OFF 実行にかかる時間を表示
SET AUTOTRACE ON/OFF 実行計画を表示
SET SERVEROUTPUT ON/OFF 標準出力
SET LINESIZE 100 1行の幅を100に設定
SET PAGESIZE 13 1ページの行数を13に設定
SET PAUSE ON/OFF スクロールをページごとに一時停止する
SET null NULL nullをNULLと表示
SET VERIFY ON/OFF 置換変数を値に置き換える前後に、SQL文またはPL/SQLコマンドのテキストをリストするかどうかを制御します
ACCEPT 変数 データ型 入力した行を読み取り、指定したユーザー変数に格納します
VARIABLE 変数 データ型 PL/SQL内で参照できるバインド変数を宣言します
PRINT バインド変数 バインド変数の現在の設定値を表示します
EXECUTE プロシージャ名 単一のPL/SQL文を実行します


「BASP21」って??

2006-01-15 01:41:53 | ASP
/* 使い方 */
1.CreateObjectメソッドで"basp21" という名前でオブジェクトを作成します。
Set bobj = Server.CreateObject("basp21") ' ASP
Set bobj = CreateObject("basp21") ' VBA や VB
Set bobj = WScript.CreateObject("basp21") ' WSH
ソケットオブジェクトの場合:
Set bsocket = Server.CreateObject("basp21.socket") ' ASP
Set bsocket = CreateObject("basp21.socket") ' VBA や VB
Set bsocket = WScript.CreateObject("basp21.socket") ' WSH
FTP オブジェクトの場合:
Set bftp = Server.CreateObject("basp21.FTP") ' ASP
Set bftp = CreateObject("basp21.FTP") ' VBA や VB
Set bftp = WScript.CreateObject("basp21.FTP") ' WSH

2.作成したオブジェクトでメソッドを呼出します。
変数 = bobj.メソッド名(パラメータ)


/* BASP21のメソッド */
●StrConv VB互換文字列変換
Visual BasicのStrConv関数と同じ機能。なぜかVBScriptではサポートされていない貴重なメソッド。
outstr = bobj.StrConv(instr,type)
outstr [out] : 結果の文字列が返ります。
instr [in] : 変換したい文字列。
type [in] : 変換タイプを数値で指定。組み合せて指定できます。
1:英大文字に変換
2:英小文字に変換
3:単語の先頭を英大文字に変換
4:半角文字 (1 バイト) を全角文字 (2 バイト) に変換
8:全角文字 (2 バイト) を半角文字 (1 バイト) に変換
16:文字列内のひらがなをカタカナに変換
32:カタカナをひらがなに変換
例: outstr = bobj.StrConv(instr,1) ' 英大文字に
outstr = bobj.StrConv(instr,2+4) ' 英小文字かつ全角に

☆サンプルソース☆
Set bobj = Server.CreateObject("basp21") ←オブジェクト作成
For i = 1 To 5
ii = bobj.StrConv(i, 4) ←変数 i を半角文字 (1 バイト) を全角文字 (2 バイト) に変換
item = "変更項目名" & ii

For j = 1 To 6
jj = bobj.StrConv(j, 4) ←変数 j を半角文字 (1 バイト) を全角文字 (2 バイト) に変換
If rs(item) = "販売仕切率" & jj Then


「BASP21」って?

2006-01-15 01:41:34 | ASP
BASP21を使おう

--------------------------------------------------------------------------------
さて,ASPで以下のことを行いたいときBASP21.DLLというものが役立ちます.
ファイルのアップロード
メール送信機能
外部プログラムの実行
詳しいことについては, Baba Centerfolds で見てください.

「ゼロサプレス」 とは?

2006-01-15 01:38:10 | その他
「前にスペースを付ける」「右詰」ということも「ゼロサプレス」

「ゼロサプレス」←→「ゼロパディング」
    
「スペースパディング(前スペース)」←→「スペースパディング(後スペース)」
(右詰め)                   (左詰め)

SQL データを横持ちにする方法

2006-01-15 01:31:49 | DB
分類 製品
01 01
01 02
01 03

上記のような一つの分類に対し、
複数の製品を持ったデータが存在
する場合に
一発のSQLを使用して
データを横もち状態にする方法を
ご教授願えますか?

(結果イメージ)
分類1 製品1 製品2 製品3
01 01 02 03
----------------------------------------------------
もし分類毎の製品の数に上限があって、なおかつ分類と製品の組み合わせに
関して重複レコードが存在しないのであれば、こんな感じでできると思います。

SELECT
   [分類],
   MAX(CASE WHEN [ID] = 1 THEN [製品] ELSE NULL END) AS [製品1],
   MAX(CASE WHEN [ID] = 2 THEN [製品] ELSE NULL END) AS [製品2],
   MAX(CASE WHEN [ID] = 3 THEN [製品] ELSE NULL END) AS [製品3]
FROM (
   SELECT COUNT(*) AS [ID], T1.[分類], T1.[製品] FROM [TABLE] AS T1
   INNER JOIN [TABLE] AS T2
   ON T1.[分類] = T2.[分類] AND T1.[製品] >= T2.[製品]
   GROUP BY T1.[分類], T1.[製品]
) AS T3
GROUP BY [分類]

Oracle JDBCでバインドできる文字列のサイズの制限

2006-01-15 01:30:29 | DB
Java.sql.PreparedStatementインターフェースを使用してOracleデータベースにデータを登録する際、setString()メソッドを使用してバインドできる文字列のサイズには制限があるようだ。


Oracleデータベースとしてのバインドサイズの上限はVARCHAR2、NVARCHAR2の最大サイズ(4000バイト)と同じなのだが、Oracle JDBCドライバでPreparedStatementインターフェースのsetString()メソッドを使用した場合、使用しているキャラクタ・セットによってより厳しいサイズ制限が課せられるらしい。

「Oracle9i JDBC開発者ガイドおよびリファレンス2(9.2)」の中の「ThinドライバによるSQL CHAR データ・サイズ制限」というトピックで解説されている内容を見ると、データベース・キャラクタセットがJA16SJISの場合、2000バイト(UTF-8バイト)が上限となっている。つまり、文字数で言うと日本語ばかりで666文字(UTF-8では日本語は3バイトで表される)が上限となるというわけだ。

※なぜUTF-8が出てくるのかと言うと、Oracle JDBCドライバは、CHAR またはVARCHAR2 バインドのために、Java UTF-16キャラクタをUTF-8エンコーディング・バイトに変換し、次にUTF-8 エンコーディング・バイトはデータベースに転送され、データベースはUTF-8 エンコーディング・バイトをデータベース・キャラクタ・セット・エンコーディングに変換するという内部的な仕組みになっているためだ。

この制限を超える文字列をsetString()によってバインドしようとした場合は


ORA-17070: データ・サイズがこの型の最大サイズを超えています。


というエラーが発生する。

このエラーを回避するためには、日本語で666文字を超えるような値をセットされる可能性のある文字列型の列に対しては、setString()ではなく、setCharacterStream()を使用して値をバインドする必要がある。


参考にしたURL:
http://redolog.livedoor.biz/archives/10156764.html