CREATE OR REPLACE FUNCTION RIVUS.PI
RETURN NUMBER
DETERMINISTIC
IS
PI CONSTANT NUMBER := 4*(4*ATAN(1/5)-ATAN(1/239));
-- PI CONSTANT NUMBER := 3.1415926535897932384626433832795028841971;
BEGIN
RETURN PI;
END;
/
-- 計算式を使用した近似値の場合-- NUMBER型 の最大精度は 38 桁SELECTTAN(PI/2), TAN(PI), SIN(PI) FROM DUAL ;
TAN(PI/2) TAN(PI) SIN(PI)
---------- ---------- ----------
1.6667E+37 -1.100E-37 1.1000E-37
-- コンスタント-- PI CONSTANT NUMBER := 3.14〜を使用すると、TAN(PI/2) はオーバフローします。SELECTTAN(PI), SIN(PI) FROM DUAL ;
TAN(PI) SIN(PI)
---------- ----------
0 0
CREATE OR REPLACE FUNCTION RIVUS.REVERSE_MULTIBYTE(P_STR IN VARCHAR2)
RETURN VARCHAR2
IS
vReverse VARCHAR2(4000);
BEGIN
FOR i in REVERSE 1..LENGTH(P_STR)
LOOP
vReverse := vReverse || SUBSTR(P_STR, i, 1);
END LOOP;
RETURN vReverse;
END;
/
文字関数 (日本語処理:全角を含む文字、半角カナの変換)
IS_MULTIBYTE ファンクション (全角文字:マルチバイト文字が含まれるか)
効率が良いとは限りませんが、コンセプトは手抜きです。
CREATE OR REPLACE FUNCTION RIVUS.IS_MULTIBYTE(P_CHAR IN VARCHAR2)
RETURN PLS_INTEGER
IS
BEGIN
IF ( P_CHAR <> CONVERT(P_CHAR, 'US7ASCII')) THEN
RETURN 1;
END IF;
RETURN 0;
END;
/
開発補助コード (TRUNCATE TABLE)
TRUNCATE TABLE ラッパープロシージャ
通常セキュリティ上の理由からオブジェクトのオーナとプロシージャの実行者(システム利用者)は異なる設計を行なう。
そのため TRUNCATE TABLE を実行させるためにマニュアル通り DROP ANY TABLE 権限を付与してしまうケースも少なくない。
これは、他のスキーマオブジェクトを自由に DROP TABLE できる非常に強力な権限であるため、その権限の影響力は広範囲になり、
これを排除しなければならないケースがある。( 1 インスタンスに 複数のシステムとスキーマが共存している環境など )
そのためには DROP ANY TABLE(TRUNCATE TABLE) の実行は許可せずプロシージャ経由で実行させる。
これで少なくとも他システムのスキーマに影響が及ばないようにすることができる。
(自システムのスキーマへの DDL 実行監視は監査等で早期発見するしかない。)
CREATE OR REPLACE PROCEDURE RIVUS.TRUNC_TABLE(P_TABLE IN VARCHAR2)
AUTHID DEFINER
IS
vSearch VARCHAR2(30);
vTarget VARCHAR2(30);
TYPE TABLE_LIST_T IS TABLE OF VARCHAR2(30);
-- TRUNCATE TABLE LIST
TRUNCATABLE_LIST TABLE_LIST_T := TABLE_LIST_T(
'TABLE_A', 'TABLE_B', 'TABLE_C'
);
BEGIN
vTarget := NULL;
vSearch := UPPER(P_TABLE);
FOR i IN 1..TRUNCATABLE_LIST.COUNT
LOOP
IF (vSearch = TRUNCATABLE_LIST(i)) THEN
vTarget := vSearch;
EXIT;
END IF;
END LOOP;
IF ( vTarget IS NOT NULL) THEN
EXECUTE IMMEDIATE'TRUNCATE TABLE RIVUS.' || vTarget ;
ELSE
NULL; -- or RAISE userdef_exception;
END IF;
END;
/
SQL Tips (別の新規ページに分割予定)
データがありなしのチェック (指定条件のデータがあるか、ないかだけの確認)
1 行取得で実行終了するための高速になる場合がある(使用するインデックスと検索件数が多い場合)
SELECT /*+ FIRST_ROWS(1) */ COUNT(*) FROM table_name WHERE condition
AND ROWNUM <= 1