fc2ブログ

まったり開発日誌

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

開発メモ-データベース

  1. PL/SQL コーディング規約(10/11)
  2. Oracleの行連鎖を調べる(10/11)
  3. ASPの開発中にSQL_TRACEをONにする工夫(10/07)
  4. SQL*PlusでCSV作成(10/07)
  5. シノニムを使ったビューが実現可能であるか (10/07)
次のページ

PL/SQL コーディング規約

PL/SQL MYコーディングルール

■フィールド変数のデータ型はかならず%TYPEを使用すべ
フィールドを格納する変数のデータ型には、必ず%TYPEを使用すること。
■FORよりもFORALLを使うべ
FORALLはパフォーマンスが30%程度向上する。FORALLが使用できないか検討してみること。
■空行は作成すな
空行のかわりに--を使用する。SHOW ERRORしたときに空行があるとエラーのあった行数がずれる為。
例)
-----------------------------------------------
vc2_result VARCHAR2 DEFAULT := 'OK';

BEGIN

RETURN vc2_result;

END OUT_FILES;
-----------------------------------------------


-----------------------------------------------
vc2_result VARCHAR2 DEFAULT := 'OK';
--
BEGIN
--
RETURN vc2_result;
--
END OUT_FILES;
-----------------------------------------------

■変数の型によるプリフィックスを付与すべ

vc2_ VARCHAR2 vc2_from_ymd
cur_ CURSOR cur_list_master
rec_ RECORD rec_dept_line
tbl_ TABLE tbl_code_master
bin_ BINARY_INTEGER bin_count
pin_ PLS_INTEGER pin_count
bln_ BOOLEAN bin_off
dat_ DATE dat_from
chr_ CHAR chr_buf
num_ NUMBER num_count

例外
グローバルな変数にはgを使用すべ
例)gvc2_to_ymd
var_ %TYPEの場合は何型になるかわからないのでvar_を使用する。(variable)

■RECORD型定義,TYPE型定義,例外型定義などの定義関係
型の定義はすべて大文字とする。単語と単語は_(アンダースコア)でつなぐ。

■関数の名称
関数の名称の本体部分には、用途を表す完結した名前を大文字と_(アンダースコア)を使用して付けること。
さらに、プロシージャ名は INIT_NAME_ARRAY やCLOSE_FILEPOINTER のように動詞で始める。

■関数の引数
in_またはout_またはinout_をプリフィックスに使用する。
例)
PROCEDURE NIPPOU_CONSULT_OUTPUT(
in_symd IN VARCHAR2,
out_ret OUT VARCHAR2
);

■定数
プリフィックスにCON_を使用し、すべて大文字とする。
CON_NO_DATA CONSTANT VARCHAR2(1) := '3';
CON_ERROR CONSTANT VARCHAR2(1) := '1';
CON_NORMAL_END CONSTANT VARCHAR2(1) := '2';

■例外処理を必ず実装する。
例外処理は、必ず実装する。よくやるのがEXCEPTION WHEN OTHES THEN NULL;とか。そんなコードを書くな。

例)
FUNCTION "CHAMPLE" RETURN VARCHAR2
AS -- 宣言部 --
sqlerr_code NUMBER;
sqlerr_msg VARCHARE2(2046);
--
BEGIN -- 実行部 --
--
----------------
-- 処理を記述 --
----------------
--
--COMMIT; -- トランザクションがある場合
-- 実行部のトランザクションをコミット
RETURN('RETURN from CHAMPLE');
EXCEPTION -- 例外部 --
WHEN OTHERS THEN
-- ROLLBACK; -- トランザクションがある場合
-- 実行部のトランザクションをロールバック
--
sqlerr_code := SQLCODE;
sqlerr_msg := substrb(SQLERRM, 1, 1024);
--
-- 状況の表示処理例
-- DBMS_OUTPUT.PUT_LINE('sql error code = ' || sqlerr_code);
-- DBMS_OUTPUT.PUT_LINE('sql error msg = ' || sqlerr_msg);
--
--
-- 状況の保存処理例
-- INSERT INTO EXCEPTION_LOG VALUES('FNC_YYY', sqlerr_code, sqlerr_msg, SYSDATE);
-- COMMIT;
--
--
-- 呼び出し元に例外処理の内容を返す
-- RAISE;
--
-- ※上記のINSERT文が有っても,その前の例外が伝えられます。
-- ※上記のINSERT文で例外が発生した場合にはINSERT文の例外も上ります。
-- ※sqlerr_msgには2つの例外メッセージが連結されて呼び出し側に伝わります。
-- 必要に応じて「ORA-」で切り出す。
-- ※INSERT文で例外が発生した場合、sqlerr_codeにはINSERT文で発生した例外番号が
-- 格納される。
END;
スポンサーサイト



  1. 2005/10/11(火) 15:42:20|
  2. 開発メモ-データベース
  3. | トラックバック:0
  4. | コメント:0

Oracleの行連鎖を調べる


SQL> conn ユーザー名/パスワード
接続されました。
SQL> analyze table テーブル名 compute statistics;

表が分析されました。

経過: 00:16:56.05
SQL> spool off

SQL> spool off
SQL> SELECT num_rows,blocks,chain_cnt
2 from dba_tables
3 where owner='ユーザー名'
4 and table_name='テーブル名';

NUM_ROWS BLOCKS CHAIN_CNT
---------- ---------- ----------
3231725 193299 2325071



上記の例であれば、
なんと 72% の行が、行連鎖、行移行している!恐ろしく非効率である。
  1. 2005/10/11(火) 15:26:08|
  2. 開発メモ-データベース
  3. | トラックバック:0
  4. | コメント:0

ASPの開発中にSQL_TRACEをONにする工夫

こんなページを作っておくとデバッグ時に有効。

<%
Dim CMD
Dim adoCmd 'ADOオブジェクト
Dim commandText
Dim strMessageONOFF
CMD = Request("CMD")
Call main
Sub main()
'on error resume next
If fncChkSession(1,"") <> 0 Then
'不正の場合は終了
Exit Sub
End If
IF CMD="ON" THEN
commandText = "alter session set sql_trace=true"

strMessageONOFF =commandText & "を実行しました<BR>目的のページを実行後、必ずこのページに戻りOFFにして下さい<BR>OFFにしない場合、サーバーに負荷がかかり続けます<BR>"
ELSEIF CMD="OFF" THEN
commandText = "alter session set sql_trace=false"

strMessageONOFF =commandText & "を実行しました<BR><A href=""\\localhost\c$\oracle\admin\ORCL\udump"">トレースファイル</A>を確認してください。<BR>"
ELSE
strMessageONOFF=""
END IF

IF strMessageONOFF <> "" THEN

Session(pcSconDBConn).Execute commandText




END IF
if err.number<>0 then
response.write("err!")
end if
End Sub

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja"><head><meta content="text/html; charset=Shift_JIS" http-equiv="content-type"><title></title></head><body>

<div style="position: absolute; width: 449px; height: 122px; top: 50px; left: 34px;">

<%=strMessageONOFF %>
<form method="get" action="sqltrace.asp" name="FORM">
<div style="text-align: center;"><input name="CMD" value="ON" type="radio">ONにする <input name="CMD" value="OFF" type="radio">OFFにする<br>

<br>
<br>
</div>
<div style="text-align: center;"><input type="submit"></div>
</form>

</div>
</body></html>
  1. 2005/10/07(金) 18:20:09|
  2. 開発メモ-データベース
  3. | トラックバック:0
  4. | コメント:0

SQL*PlusでCSV作成

SQL*Plus の機能で、colsep で結果セットのカラム毎のセパレータを定義できる。


SQL> set heading off
SQL> set colsep ","
SQL> select * from 社員マスタ;
社 社員氏名
-- ------------------------------
01 かねやん
02 うえださん
03 いのっしー
04 あかっしー
05 トランスfonda
  1. 2005/10/07(金) 18:16:32|
  2. 開発メモ-データベース
  3. | トラックバック:0
  4. | コメント:0

シノニムを使ったビューが実現可能であるか

できます。


SQL> CREATE TABLE A(
2 NAME VARCHAR2(10)
3 );

表が作成されました。

SQL> CREATE TABLE B(
2 NAME VARCHAR2(10)
3 );

表が作成されました。

SQL>
SQL> INSERT INTO A VALUES('テーブルA');

1行が作成されました。

SQL> INSERT INTO B VALUES('テーブルB');

1行が作成されました。

SQL>
SQL> CREATE SYNONYM S FOR A;

シノニムが作成されました。

SQL>
SQL> CREATE VIEW V AS SELECT NAME FROM S;

ビューが作成されました。

SQL>
SQL> SELECT NAME FROM V;

NAME
----------
テーブルA

SQL>
SQL> DROP SYNONYM S;

シノニムが削除されました。

SQL> CREATE SYNONYM S FOR B;

シノニムが作成されました。

SQL>
SQL> SELECT NAME FROM V;

NAME
----------
テーブルB


  1. 2005/10/07(金) 18:15:32|
  2. 開発メモ-データベース
  3. | トラックバック:0
  4. | コメント:0
次のページ

RSSフィード

カレンダー

11 | 2023/12 | 01
- - - - - 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 - - - - - -

カテゴリー

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

リンク

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

メールフォーム

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