目次 1. データ型 BLOB_FILE キャスト関数 DECIMAL 関数 VALUE 関数 CHAR 関数 TIMESTAMP 関数 TIME 関数

Similar documents
目次 1. ロードランナーの紹介 ロードランナーの概要 ロードランナーの構成 ロードランナーの環境構成 ロードランナーの使用例 使用例 (Native-Protocol Driver)

1 SQL Server SQL Oracle SQL SQL* Plus PL/SQL 2 SQL Server SQL Server SQL Oracle SQL SQL*Plus SQL Server GUI 1-1 osql 1-1 Transact- SQL SELECTFROM 058

1,.,,,., RDBM, SQL. OSS,, SQL,,.

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

橡実践Oracle Objects for OLE

目次 1. パーティショニングとは? パーティショニングのメリットと必要性 パーティショニング戦略 パーティション キーの選定時の考慮事項 パーティション方法 レンジ パーティション

Microsoft Word - Android_SQLite講座_画面800×1280

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

ストラドプロシージャの呼び出し方

橡j_Oracle_whitepaper.PDF

Oracle Database Connect 2017 JPOUG

intra-mart Accel Platform — TableMaintenance ユーザ操作ガイド   第7版   None

intra-mart Accel Platform — TableMaintenance ユーザ操作ガイド   第8版  

PostgreSQL カンファレンス 2013 証券取引バックオフィスにおける Oracle から PostgreSQL への マイグレーション SBI ジャパンネクスト証券株式会社 イアン バーウィック

クエリの作成が楽になるUDF

データベース移行ツール操作説明書 日本ブレイディ株式会社

標準化 補足資料

SQL (2) データベース論 Ⅰ 第 7 回 URL 作成者末次文雄 C

復習 (SQL 文 ) 3/6 復習 (SQL 文 ) 4/6 表の作成 CREATE TABLE...; 表の削除 DROP TABLE テーブル名 ; 表内のデータが全て消えてしまう. 表内のデータを得る SELECT 列名 FROM 表名...; 表にデータを挿入する. INSERT INTO

tkk0408nari

日本オラクル株式会社

~~~~~~~~~~~~~~~~~~ wait Call CPU time 1, latch: library cache 7, latch: library cache lock 4, job scheduler co

Microsoft PowerPoint - db03-5.ppt

PGECons技術ドキュメントテンプレート Ver.3

Microsoft Word - 430_15_Developing_Stored_Procedure.doc

PowerPoint プレゼンテーション

LC304_manual.ai

キャラクタ・セットの移行に関するベスト・プラクティス

Microsoft Word - Lab5d-DB2組み込みSQL.doc

untitled

MOTIF XF 取扱説明書

Microsoft PowerPoint - CproNt02.ppt [互換モード]

PowerPoint Presentation

ODBC Driver for 4D Server

(Microsoft Word - IBM i \203C\203\223\203^\201[\203l\203b\203g\203Z\203~\203i\201[_XMLTABLE.doc)

[Lab 2]Oracleからの移行を促進する新機能

Microsoft Word - Win-Outlook.docx

5 Q. 結果セットを 1 行飛ばしに FETCH することはできますか A. できません Oracle は必ず結果セットを上から 1 行ずつ FETCH します 6 Q. カーソルを一度にいくつまでオープンできますか A. 初期化パラメータ OPEN_CURSORS で指定したの値までカーソルをオ

はじめに 本書では GridDB Advanced Edition における SQL の記述方法および 注意事項について記載しています GridDB Advanced Edition をご使用になる前に 必ずお読みください なお 本書で説明する機能は GridDB Advanced Edition

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

Oracle Developer Release 6i

n n n ( ) n Oracle 16 PostgreSQL 3 MySQL

任意の間隔での FTP 画像送信イベントの設定方法 はじめに 本ドキュメントでは AXIS ネットワークカメラ / ビデオエンコーダにおいて任意の間隔で画像を FTP サー バーへ送信するイベントの設定手順を説明します 設定手順手順 1:AXIS ネットワークカメラ / ビデオエンコーダの設定ページ

<4D F736F F F696E74202D2091E6358FCD B8F88979D B F2E707074>


main.dvi

Oracle Rdb: SQL Update

How to read the marks and remarks used in this parts book. Section 1 : Explanation of Code Use In MRK Column OO : Interchangeable between the new part

How to read the marks and remarks used in this parts book. Section 1 : Explanation of Code Use In MRK Column OO : Interchangeable between the new part

fx-9860G Manager PLUS_J

KeySQL R5.1 Release Note

Introduction Purpose This training course demonstrates the use of the High-performance Embedded Workshop (HEW), a key tool for developing software for

REVISION 2.85(6).I 1

How to read the marks and remarks used in this parts book. Section 1 : Explanation of Code Use In MRK Column OO : Interchangeable between the new part

Oracle Lite Tutorial

防災マップ作成システムの開発業務基本設計書

Oracle データベースと PSQL v11 を比較する 株式会社エージーテック 2014 年 9 月 30 日

AN 100: ISPを使用するためのガイドライン

Exam : J Title : Querying Microsoft SQL Server 2012 Version : DEMO 1 / 10

How to read the marks and remarks used in this parts book. Section 1 : Explanation of Code Use In MRK Column OO : Interchangeable between the new part

How to read the marks and remarks used in this parts book. Section 1 : Explanation of Code Use In MRK Column OO : Interchangeable between the new part

ストアドプロシージャ移行調査編

KeySQL for Microsoft Windows 6.0 : B Copyright 2006, Oracle Corporation. All rights reserved. Printed in Japan. * Oracle Corporation Oracle Co

Microsoft Word - D JP.docx

Microsoft Word - Meta70_Preferences.doc

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

Upload path ファイル送信先ディレクトリのパスを指定します ホームディレクトリに画像を送信する場合は空白のまま サブディレクトリに画像を送信する場合はディレクトリ名を指定します さらに下位のディレクトリを指定する場合は \ マークを利用します 例 ) ホームディレクトリ以下の camera

スライド 1

PowerRDBconnector説明書(SQLServer編)

2

Microsoft Word - no15.docx

PowerPoint -O80_REP.PDF

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

レポートでのデータのフィルタ

_02_3.ppt

FileMaker SQL Reference

eラーニング資料 e ラーニングの制作目標 データベース編 41 ページデータベースの基本となる概要を以下に示す この内容のコースで eラーニングコンテンツを作成予定 データベース管理 コンピュータで行われる基本的なデータに対する処理は 次の 4 種類です 新しいデータを追加する 既存のデータを探索

NFC ucode タグのメモリフォーマット規定

関数サンプル2

SQLite データベース IS04 組み込み 1

PowerPoint プレゼンテーション

Chapter

DumpCollection IT Exam Training online / Bootcamp PDF and Testing Engine, study and practice

Calpont InfiniDBマルチUM同期ガイド

2

メール全文検索アプリケーション Sylph-Searcher のご紹介 SRA OSS, Inc. 日本支社技術部チーフエンジニア Sylpheed 開発者 山本博之 Copyright 2007 SRA OSS, Inc. Japan All right

,, create table drop table alter table

Upload path ファイル送信先ディレクトリのパスを指定します ホームディレクトリに画像を送信する場合は空白のまま サブディレクトリに画像を送信する場合はディレクトリ名を指定します さらに下位のディレクトリを指定する場合は \ マークを利用します 例 ) ホームディレクトリ以下の camera

Microsoft Word - sample_adv-programming.docx


3 Powered by mod_perl, Apache & MySQL use Item; my $item = Item->new( id => 1, name => ' ', price => 1200,


Microsoft PowerPoint - ruby_instruction.ppt

: ORDER BY

Ver.1 1/17/2003 2


Oracle Lite Tutorial

2

第 1 章 条件分岐 この章では 条件に応じて処理を分岐する方法について説明します 1. CASE 式で複雑な条件分岐を実現 2. 関数を使用した条件分岐 3. MERGE 文による条件に応じた DML の実行

Microsoft PowerPoint - 3-Forms-Others.ppt

Transcription:

マイグレーションおよびアップグレード アプリケーション移行ガイド 2014. 06. 24.

目次 1. データ型... 3 1.1. BLOB_FILE... 4 2. キャスト関数... 5 2.1. DECIMAL 関数... 5 2.2. VALUE 関数... 6 2.3. CHAR 関数... 7 2.4 TIMESTAMP 関数... 8 2.6 TIME 関数... 9 2.7 DIGIT 関数... 9 2.9 STRIP 関数... 10 2.10 LENGTH 関数... 12 2.11 FLOAT / INTEGER 関数... 12 2.12 LOCATE 関数... 12 3. 日付と時間の処理... 13 3.1. 日付関連フォーマット... 13 3.2. 日付フォーマットの例... 14 4. ROW / HIERARCHICAL QUERY / NEXTVAL / SYSIBM.SYSDUMMY1... 14 4.1. 行関連関数... 14 4.2. 階層問い合わせ... 15 4.3. NEXTVAL (SEQUENCE)... 17 4.4. SYSIBM.SYSDUMMY1... 17 5. 関連関数... 18 5.1. 関数の移行 ( 共通 )... 18 5.2. Windowsでは使用不可... 18 5.2.1. FC_SECONDSDIFF... 18 5.2.2. TIMESTAMPDIFF... 19 5.2.3. FC_GREATEST / FC_LEAST / FC_SECONDSDIFF... 19 6. 集合演算子... 19 7. SQLCODE... 20 8. 一時表の処理... 21 9. の未サポート項目... 22 10. 機能の変換... 22 11. トリガーの変換... 24 2

アプリケーション移行ガイド 1. データ型 - データ型は表の列を定義し プロシージャ / 関数の引数に使用される値を格納する方式を決定します では データ型によって同じ値が異なるように処理されます たとえば NUMBER データ型に格納される数字には他の数字を足したり引いたりすることができますが RAW データ型に格納される数字表現には足したり引いたすることができません - のデータ型は 大きく組み込みデータ型 (Built-In Data Type) とユーザー定義データ型 (User Defined Data Type) に区分され 組み込みデータ型はスカラー データ型の性格を持ちます - 組み込みデータ型は格納されるデータの性格によって CHARACTER データ型 NUMBER データ型 DATE データ型 バイナリー データ型に分けることができます - CHARACTER データ型には CHAR NCHAR VARCHAR2 NVARCHAR2 CLOB NCLOB LONG データ型があります - 数字は NUMBER データ型のみを提供します SMALLINT, INTEGER, BIGINT, FLOAT, REAL, DOUBLE, DECIMAL(p,s) BIGINT, SQLINT16, SQLINT32, SQLINT64 VALUES ( ThresholdIndexSeqNum.NEXTVAL, CAST(? AS BIGINT) ) NUMBER SHORT, INT, LONG VALUES ( ThresholdIndexSeqNum.NEXTVAL, CAST(? AS NUMBER) ) CHAR/NCHAR データベースの文字セット データを固定長で格納します NCHAR 型はデータベースの各国語文字セット (National Character Set) データを固定長で保証するために使用されるデータ型です 各国語文字セット データは UNICODE を使用する必要があります (UTF8 のみ可能 ) VARCHAR2/NVARCHAR データベースの文字セット データを可変長で格納します NVARCHAR2 型はデータベースの各国語文字セット データを可変長で格納するために使用されるデータ型です NVARCHAR2 型も NCHAR 型のように では UNICODE を使用する必要があります 各国語文字セットによって AL16UTF16 の場合は 2 バイト UTF8 の場合は 3 バイトが基本です CLOB/NCLOB LOB(Large Object) データ型の一部で 最大 4GB まで文字データを格納するために使用されます CLOB はデータベースの文字セットでデータを格納するのに対し NCLOB は各国語文字セットでデータを格納し UNICODE を使用する必要があります LONG 下位バージョンに対する互換性のために存在し 役割は CLOB/NCLOB と同様に文字データを格納します 違いは 別途のセグメントにデータを格納するのではなく 表内の他のデータと一緒に格納します LONG データ型も変動長の文字データ型で 最大長を指定せず 1 つの行には 1 つの LONG データ型のみ使用できます CHAR(n) / VARCHAR(n) LONG VARCHAR(n), CLOB(2GB) BLOB(n), CLOB(n), DBCLOB(n) CHAR(n), NCHAR(n) / VARCHAR2(n), NVARCHAR2(n) LONG BLOB, CLOB, NCLOB 3

1.1. BLOB_FILE BLOB_FILE 配列を利用した移行 - の BLOB_FILE は でサポートされないため 配列を宣言して ESQL 文法である LOB WRITER によって使用する必要があります EXEC SQL BEGIN DECLARE SECTION; SQL TYPE IS BLOB_FILE blobfile; EXEC SQL END DECLARE SECTION; static int SendHelpFile(FBUF *rcvbuf, FBUF **sndbuf) FILE *sw_file; Byte *comprfile = NULL; Int ret, comprfilelen ; char l_fullfilename[100]; char rmcmd[100]; unsigned long uncomprlen ; EXEC SQL BEGIN DECLARE SECTION; char h_clientfilename[60+1]; char h_uploadtime[19+1]; char h_filedir[25+1]; sqlint32 comprsize, uncomprsize; short lobind; EXEC SQL END DECLARE SECTION; EXEC SQL HELPFILE, HELPFILECOMPRSIZE, HELPFILEUNCOMPRSIZE, HELPFILEDIRECTORY, SUBSTR(HEX(HELPFILETIME), 1, 4) SUBSTR(HEX(HELPFILETIME), 5, 2) SUBSTR(HEX(HELPFILETIME), 7, 2) SUBSTR(HEX(HELPFILETIME), 9, 2) SUBSTR(HEX(HELPFILETIME), 11, 2) SUBSTR(HEX(HELPFILETIME), 13, 2) HELPFILETIME INTO :blobfile :lobind, :comprsize, :uncomprsize, :h_filedir, : h_uploadtime CLIENTHELPINFO WHERE HELPFILENAME = :h_clientfilename; /* Structure for VARRAW */ typedef struct long_varraw ub4 len; text buf[1]; long_varraw; EXEC SQL TYPE long_varraw IS LONG VARRAW REFERENCE; static int SendHelpFile(FBUF *rcvbuf, FBUF **sndbuf) long_varraw *image; OCIBlobLocator *blob; long bloblen; int ret; ub4 amt = 0; EXEC SQL BEGIN DECLARE SECTION; char h_clientfilename[60+1]; char h_uploadtime[19+1]; char h_filedir[25+1]; int comprsize, uncomprsize; EXEC SQL END DECLARE SECTION; EXEC SQL ALLOCATE :blob; EXEC TIBERO OPTION (CHAR_MAP=STRING); EXEC SQL HELPFILE, HELPFILECOMPRSIZE, HELPFILEUNCOMPRSIZE, HELPFILEDIRECTORY, TO_CHAR(HELPFILETIME, 'YYYYMMDDHH24MISS') HELPFILETIME INTO :blob :bloblen, :comprsize, :uncomprsize, :h_file Dir, :h_uploadtime CLIENTHELPINFO WHERE HELPFILENAME = :h_clientfilename; EXEC TIBERO OPTION (CHAR_MAP=CHARZ); if(sqlcode < 0 SQLCODE == NOTFOUND) 4

if (lobind < 0) PutDbErr(LOG_ERROR, NULL, MakeMsg("[%s] 該当するファイルを探せません ", h_clientfilename)); setprocessingresult(sndbuf, SQLMSG, "", 'F'); return ERROR; if(sqlcode < 0 SQLCODE == NOTFOUND) PutDbErr(LOG_FATAL, NULL, MakeMsg("[%s] CLIENTHELPINFO 表の照会中にエラーが発生 ", h_clientfilename)); setprocessingresult(sndbuf, SQLMSG, "", 'F'); return ERROR; EXEC SQL COMMIT WORK; Log(LOG_DEBUG, "HelpFileComprSize : %ld, HelpFileUnComprSize : %ld\n", comprsize,uncomprsize); EXEC SQL FREE :blob; PutDbErr(LOG_FATAL, NULL, MakeMsg("[%s] CLIENTHELPINFO. 表の照会中にエラーが発生 ", h_clientfilename)); setprocessingresult(sndbuf, SQLMSG, "", 'F'); return ERROR; Log(LOG_DEBUG, "HelpFileComprSize : %ld, HelpFileUnComprSize : %ld\n", comprsize,uncomprsize); if((image = (long_varraw *)malloc(sizeof(ub4)+bloblen)) == NULL) EXEC SQL FREE :blob; Log(LOG_FATAL, "malloc failed.\n"); setprocessingresult(sndbuf, fbstrerror(fberror), "", 'F'); return ERROR; image->len = bloblen; /* Loaclにファイルを読み込む */ comprfilelen =(int)comprsize; sw_file = fopen(l_fullfilename, "r"); if((comprfile = (Byte*)malloc(comprFileLen)) == NULL) free((char *)comprfile); Log(LOG_FATAL, "malloc failed.\n"); setprocessingresult(sndbuf, fbstrerror(fberror), "", 'F'); return ERROR; EXEC SQL LOB READ :amt :blob INTO :image WITH LENGTH :bloblen; if(sqlcode < 0 ) free(image); EXEC SQL FREE :blob; PutDbErr(LOG_FATAL, NULL, "Failed to query [MctpaGetDoc_OUT_HelpFile]\n"); setprocessingresult(sndbuf, SQLMSG, "", 'F'); return ERROR; 2. キャスト関数 2.1. DECIMAL 関数 DECIMAL 関数 --> TRUNC 関数 (1) - DECIMAL 引数として受けた数字 数字を表現する文字列を小数に変換して返す関数です では INT BIGINT FLOAT DOUBLE REA L SMALLINT などの関数が DECIMAL 関数と似た機能をします では TO_NUMBER 関数ですべての数字と関連して変換処理を行います - TRUNC (number) num1 を小数点以下 num2 の位置で切り捨てた (Truncation) 値を返します 5

DECIMAL(NUMBER) CASE WHEN DECIMAL(e.CustomerCount) THEN '1' WHEN DECIMAL(e.CustomerCount) THEN '2' ELSE '6' TURNC(NUMBER) CASE WHEN TRUNC(e.CustomerCount) THEN '1' WHEN TRUNC(e.CustomerCount) THEN '2' ELSE '6' DECIMAL 関数 --> TRUNC 関数 (2) - で DECIMAL( 列 桁数 小数点桁数 ) 関数は 戻り値が 0 であっても小数点桁数を表示します ( 例 ) DECIMAL( 123,6,3) = 12 3.000) - はこの機能を TO_CHAR 関数でサポートします つまり TO_NUMBER では小数点以下の数字が 0 の場合 表示できません 一般的には DECIMAL 関数を TO_CHAR に変換します しかし DECIMAL を CASE 文と一緒に使用する場合 他の条件で数字型を返すと ( つまり CASE ~~ THEN 0( 数字 )) エラーが発生します このとき TO_CHAR を TO_NUMBER に変換すると 小数点以下の桁数は表示されません 小数点以下の桁数を必ず表示しなければならない場合は case 文内で最終戻り値を文字型に変換する方法しかありません TIBERO CASE WHEN 1=1 THEN 'T' WHEN 1=2 THEN 0 END DUAL; DECIMAL(STR) / DECIMAL(STR, p) DECIMAL(STR,p,s) CHAR(DECIMAL(STR)) CHAR(DECIMAL(STR,p)) CHAR(DECIMAL(STR,p,s)) TRUNC(TO_NUMBER(STR)) TRUNC(TO_NUMBER(STR),s) TO_CHAR(TO_NUMBER(str), 00000000000000000. ) [0 の数 : 15] TO_CHAR(TO_NUMBER(str), 00000 ) [ フォーマット ストリングで0の数がp 個である ] TO_CHAR(TO_NUMBER(str), 000.00 ) [ フォーマット ストリングで. 前の0の数がp-sで. 後ろの 0の数がs 個である ] 2.2. VALUE 関数 VALUE 関数 --> NVL 関数 - VALUE First-expression の NOT NULL 値を返す関数です では VALUE 関数に対応する関数で argument が 2 つの場合は NVL を使用し 2 つ以上の場合は COALESCE を使用できます COALESCE を使用するときは argument のデータ型を一致させます 6

VALUE VALUE(SUM(REQ_AMT), 0) ACE.TEBUGMKE WHERE ACC_YEAR = :WK-ACC-YEAR AND (ORG_CD = :WF-ORG-CD OR 0=1) AND BIZ_CD = :WF-BIZ-CD AND DEPT_TYP = '4' AND REQ_SANC_CHARG <> '' NVL, COALESCE NVL(SUM(REQ_AMT), 0) ACE.TEBUGMKE WHERE ACC_YEAR = :WK-ACC-YEAR AND (ORG_CD = :WF-ORG-CD OR 0=1) AND BIZ_CD = :WF-BIZ-CD AND DEPT_TYP = '4' AND REQ_SANC_CHARG <> '' COALESCE(INP-YMD, TO_DATE( 1900-01-01 ) ) ACE.TEBUGMKE WHERE ACC_YEAR = :WK-ACC-YEAR AND (ORG_CD = :WF-ORG-CD OR 0=1) AND BIZ_CD = :WF-BIZ-CD AND DEPT_TYP = '4' AND REQ_SANC_CHARG <> '' 2.3. CHAR 関数 CHAR 関数 --> TO_CHAR 関数 - CHAR 固定長の文字列を返す関数です では TO_CHAR 関数を使用できます CHAR 関数を使用するとき datetime-expression の表現を表すときに ISO USA EUR JTI LOCAL の引数値を以下のように使用できます これらのフォーマットは で直接表現する形で使用します ( yy/mm/dd ) たとえば db2 : CHAR(YMD,ISO) : TO_char(YMD, yyyy-mm-dd ) に置き換えます CHAR si.serverid, si.hostname, si.serverip, si.osversion, NVL(si.ServerAlias,''), sca.itemname, sca.alertname, sca.alertmsg, FC_CODE1(' サーバー状態情報 ', CHAR(sca.AlertStatus)), sca.threshold, sca.value ServerInfo si, CurServerAlarm sca WHERE sca.serverid = si.serverid AND sca.itemid IN (140001, 140003, 10001, 40001) TO_CHAR si.serverid, si.hostname, si.serverip, si.osversion, NVL(si.ServerAlias,''), sca.itemname, sca.alertname, sca.alertmsg, FC_CODE1(' サーバー状態情報 ', TO_CHAR(sca.AlertStatus)), sca.threshold, sca.value ServerInfo si, CurServerAlarm sca WHERE sca.serverid = si.serverid AND sca.itemid IN (140001, 140003, 10001, 40001) 7

2.4 TIMESTAMP 関数 TIMESTAMP 関数 --> TO_TIMESTAMP 関数 - TIMESTAMP 引数として受けた値をタイムスタンプで返します TIMESTAMP TO_TIMESTAMP c.alarmseqnum, TO_CHAR(TO_DATE(c.OCCURREDTIME, 'YYYYMM')) AS PATITIONKEY, c.locationcode, c.stackmodulenum, SLOTNUMBER, OCCURREDTIME, TIMESTAMP('%s') AS TOUCHTIME, '3' PROCESSINGSTATE, FAULTSTATUSCODE, FAULTCAUSEGROUPCODE, CurInfraAlarm c c.alarmseqnum, TO_CHAR(TO_DATE(c.OCCURREDTIME, 'YYYYMM')) AS PATITIONKEY, c.locationcode, c.stackmodulenum, SLOTNUMBER, OCCURREDTIME, TO_TIMESTAMP('%s') AS TOUCHTIME, '3' PROCESSINGSTATE, FAULTSTATUSCODE, FAULTCAUSEGROUPCODE, CurInfraAlarm c 2.5 DAYS 関数 DAYS 関数 --> TO_TIMESTAMP 関数 - DAYS 日付を integer 表現で表す関数 0001 年 1 月 1 日からの日数から 1 を引いた整数 - DAYS の応用 : 曜日使用タイプ : Days(:wk-ymd)-Days(:wk-ymd)/7*7 分析 : Days 戻り値 : 10 Days_return /7 : 1 Days_return /7*7 : 7 Integer 型の数を 7 で割って さらに 7 を掛ける処理をして曜日を表す数を出す 結果値が 0 である場合は日曜日 1 の場合は月曜日 ~ 6 の場合は土曜日である DAYS TO_DATE DAYS(DATE(:WK-AC-YMD)) INTO :WK-AC-YMD SYSIBM.SYSDUMMY1 DAYS(DATE(:WK-AC-YMD)) - DAYS(DATE(:WK-AC-YMD))/7*7 SYSIBM.SYSDUMMY1 01 )- 1 INTO :WK-AC-YMD DUAL; TO_DATE(:WK-AC-YMD) TO_DATE( 0001-01- 方法 1> SELCT (TO_DATE((:WK-AC-YMD)-TO_DATE((:WK- AC-YMD)-1) - (trunc((to_date((:wk-ac-ymd)-to_date((:wk-ac- YMD)-1)/7)*7) DUAL 8

方法 2> to_number(to_char(to_date(:wk-ac- YMD,'yyyy-mm-dd'),'D'))-1 DUAL; 2.6 TIME 関数 TIME --> TO_TIMESTAMP / SUBSTR 引数として受けた値を HOUR MINUTE SECOND 値に変換して返す関数 では TO_TIMESTAMP 関数と SUBSTR 関数を使用して同じ形で変換できます TIME TIME は時間の経過時間 (duration) を意味し 後ろの時間がより大きい値を持つ場合 サインが付きます TIME( 11:02:26 ) TIME( 00:32:56 ) は 102930 という数字で 意味は 10 時間 29 分 30 秒です 結果データ型は decimal(6,0) です - TIME 関数の演算 TIME TIME 演算 TIME duration ( ex, 5 SECONDS) Decimal(6,0) TIME 結果データ型 TIME TO_TIMESTAMP / SUBSTR TIME( 01:01:01 ) SYSIBM.SYSDUMMY1 TIME(:WK-CURR-TIME) 5 SECONDS SYSIBM.SYSDUMMY1 TIME(:WK-TIME1) TIME(:WK- TIME2) SYSIBM.SYSDUMMY1 TO_CHAR(TO_TIMESTAMP('01:01:01','HH24:MI:SS'),'HH24:MI:SS') DUAL; TO_CHAR(TO_TIMESTAMP(:WK-CURR-TIME, HH24:MI:SS ) 5/60/60/24, HH24:MI:SS ) DUAL; < 結果値はnumber 型 : 値が正数のみ存在する場合 > SUBSTR(TO_TIMESTAMP(:WK-TIME1, HH24:MI:SS ) TO_TIMESTAMP(:WK-TIME2, HH24:MI:SS ),12,8) DUAL; < 結果値はnumber 型 : 正数と負数の値が両方存在する場合 > TO_NUMBER(REPLACE(REPLACE(REPLACE((TO_TIMESTAMP(:WKTIME1,' HH24:MI:SS') TO_TIMESTAMP(:WK-TIME2,'HH24:MI:SS')) DAY TO SECOND(0),'+00 '),'-00 ','-'),':')) DUAL; 2.7 DIGIT 関数 NUMERIC 値を引数として受けて 絶対値に変換して文字列で返します データ型は SMALLINT INTEGER DECIMAL で 正確な数字データである必要があります この関数の結果はデータのスケールに関係なく 引数の絶対値を表す固定長の文字列です - (DIGITS 関数の 変換資料 ) データ型 Small integer 5 ストリング長 9

large integer 10 decimal with a precision of p p - ARGUMENT INTEGER TYPE CONVERSION の桁数 DIGITS 関数 のDIGITS 関数を 用に変換する方法 small integer number(5) DIGITS(a) TO_CHAR(ABS(a), 09999 ) large integer number(10) DIGITS(a) TO_CHAR(ABS(a), 0999999999 ) - ARGUMENT INTEGER TYPE CONVERSION A.AST_CD CONCAT DIGITS(A.AST_SEQ) > :K-AST-NO SUBSTR(DIGITDS(YEAR(A.SUM_YMD) SUBSTR(DIGITDS(MONTH(A.SUM_YMD) A.AST_SEQ 列が number(10) である場合 AND CONCAT(A.AST_CD, TO_CHAR(ABS(A.AST_SEQ), 0999999999 ) > :K-AST-NO TO_CHAR(A.SUM_YMD, YYYY ) TO_CHAR(A.SUM_YMD, MM ) 2.8 LEFT / RIGHT LEFT / RIGTH --> SUBSTRB LEFT : 左から 2 番目の引数値の分を取得 RIGHT : 右から 2 番目の引数値の分を取得 では SUBSTRB を利用して解決します LEFT / RIGTH /*+ <CTKO84H_3> +*/ LEFT ( TRIM ( : WK_CAR_NO ), 8 ) '-' RIGHT ( TRIM ( : WK_CAR_NO ), 4 ) INTO : WK_CAR_NO2 SYSIBM.SYSDUMMY1 SUBSTRB /*+ <CTKO84H_3> +*/ SUBSTRB( TRIM ( : WK_CAR_NO ),1,8 ) '-' SUBSTRB( TRIM ( : WK_CAR_NO ),-4,4 ) INTO : WK_CAR_NO2 DUAL; 2.9 STRIP 関数 STRIP --> TRIM STRIP 関数は 変数または文字列の最初または最後 または両方からブランクまたは指定された文字 (strip-character) を削除します strip-character が指定されていない場合 削除される値はブランクです STRIP 関数のオプション STRIP(column-name,B,strip-cha) STRIP(column-name,L,strip-cha) STRIP(column-name,T,strip-cha) STRIP(column-name,L,strip-cha) STRIP(column-name,T,strip-cha) STRIP 関数のオプションに対応する 関数 TRIM(BOTH strip-cha from column-name) TRIM(LEADING strip-cha from column-name) TRIM(TRAILING strip-cha from column-name) LTRIM(column-name, strip-cha) RTRIM(column-name, strip-cha) 10

strip-character は省略された場合 共にブランク ( ) を意味します db2 共に デフォルト値は BOTH です の LEADING オプションは LTRIM 関数に TRAILING オプションは RTRIM 関数に置き換えられます で strip-character が省略される場合 BOTH LEADING TRAILING は省略できません STRIP TRIM 1) データ値の前後のブランクを削除するために使用する関数です では TRIM 関数を使用できます STRIP(LOC_NM) INTO :WK-ADDR CSM.TBR060 WHERE POST_CD1 = :WK-POST-CD1 AND POST_CD2 = :WK-POST-CD2 AND DUP_SEQ IN ( 0, 1, 999 ) TRIM(LOC_NM) INTO :WK-ADDR CSM.TBR060 WHERE POST_CD1 = :WK-POST-CD1 AND POST_CD2 = :WK-POST-CD2 AND DUP_SEQ IN ( 0, 1, 999 ) または TRIM(BOTH LOC_NM) INTO :WK-ADDR CSM.TBR060 WHERE POST_CD1 = :WK-POST-CD1 AND POST_CD2 = :WK-POST-CD2 AND DUP_SEQ IN ( 0, 1, 999 ) 2) データ値の前のブランクまたは特別な文字列を削除する場合 では LTRIM 関数を使用できます STRIP(LOC_NM,L, 0 ) INTO :WK-ADDR CSM.TBR060 WHERE POST_CD1 = :WK-POST-CD1 AND POST_CD2 = :WK-POST-CD2 AND DUP_SEQ IN ( 0, 1, 999 ) 000345.50 (CHAR(9)) 文字列は L( 文字列の前の部分で ある場合は L 文字列の後ろの部分である場合は T) オプシ ョンによって 前の部分の 0 が削除され 345.50 値を返 します TRIM(LEADING 0 LOC_NM) INTO :WK-ADDR CSM.TBR060 WHERE POST_CD1 = :WK-POST-CD1 AND POST_CD2 = :WK-POST-CD2 AND DUP_SEQ IN ( 0, 1, 999 ) または LTRIM(LOC_NM, 0 ) INTO :WK-ADDR CSM.TBR060 WHERE POST_CD1 = :WK-POST-CD1 AND POST_CD2 = :WK-POST-CD2 AND DUP_SEQ IN ( 0, 1, 999 ) 3) データ値の後ろのブランクまたは特別な文字列を削除する場合 では RTRIM 関数を使用できます STRIP(LOC_NM,T, 0 ) INTO :WK-ADDR CSM.TBR060 WHERE POST_CD1 = :WK-POST-CD1 AND POST_CD2 = :WK-POST-CD2 AND DUP_SEQ IN ( 0, 1, 999 ) 000345.50 (CHAR(9)) 文字列は T( 文字列の前の部分である場合はL 文字列の後ろの部分である場合はT) オプションによって 後ろの部分の 0 が削除され 000345.5 値を返します TRIM(TRAILING 0 LOC_NM) INTO :WK-ADDR CSM.TBR060 WHERE POST_CD1 = :WK-POST-CD1 AND POST_CD2 = :WK-POST-CD2 AND DUP_SEQ IN ( 0, 1, 999 ) または RTRIM(LOC_NM, 0 ) INTO :WK-ADDR CSM.TBR060 WHERE POST_CD1 = :WK-POST-CD1 AND POST_CD2 = :WK-POST-CD2 AND DUP_SEQ IN ( 0, 1, 999 ) 11

2.10 LENGTH 関数 LENGTH --> LENGTHB で length は日本語の可否に関係なく 1 バイトが基準ですが では日本語と他の入力処理とで違いがあります 日本語の場合 2 バイト 1 文字を 1 で表現します そのため すべての入力値を 1 バイト基準で処理する lengthb を使用すると db2 と同じ結果が得られます LENGTH length( あ ) SYSIBM.SYSDUMMY1 LENGTHB lengthb( あ ) DUAL 2.11 FLOAT / INTEGER 関数 FLOAT / INTEGER TO_NUMBER / TRUNC FLOAT(1.234) COM.PARM -> 1.234 TO_NUMBER(1.234) DUAL -> 1.234 INTEGER(11.8) COM.PARM -> 11 TRUNC(11.8) DUAL -> 11 2.12 LOCATE 関数 LOCATE--> INSTR の LOCATE 関数は 1 つの文字列が他の文字列で最初に現れる位置を返す関数です で対応する関数は INSTR 関数です LOCATE SUBSTR(TABNAME, LOCATE('_', TABNAME) + 1, 4) '-' SUBSTR(TABNAME, LOCATE('_', TABNAME) + 1 + 4, 2) '-' SUBSTR(TABNAME, LOCATE('_', TABNAME) + 1 + 6, 2) ' ' '00:00:00', INSTR SUBSTR(TABNAME, INSTR(TABNAME, '_') + 1, 4) '-' SUBSTR(TABNAME, INSTR(TABNAME, '_') + 1 + 4, 2) '- ' SUBSTR(TABNAME, INSTR(TABNAME, '_' )+ 1 + 6, 2) ' ' '00:00:00', 12

3. 日付と時間の処理 3.1. 日付関連フォーマット と 共に 時間と日付を表示するための DATE 型および TIME 型のデータ型を持っており 関連して時間および日付情報を照会し 照会されたデータのフォーマットを変更する関数も提供しています CURRENT TIMESTAMP / CURRENT DATE / CURRENT TIME INSERT INTO ClientHelpInfo ( HelpFileName, HelpFile, HelpFileUnComprSize, HelpFileComprSize, HelpFileDirectory, HelpFileTime) VALUES (:h_filename, :blobfile, :h_uncomprsize, :fieldlen, :h_clientfiledir, CURRENT TIMESTAMP); CURRENT DATE SYSIBM.SYSDUMMY1 SYSTIMESTAMP / SYSDATE / TO_CHAR(SYSTIME, 'HH24:MI:SS') INSERT INTO ClientHelpInfo ( HelpFileName, HelpFile, HelpFileUnComprSize, HelpFileComprSize, HelpFileDirectory, HelpFileTime) VALUES (:h_filename, :blobfile, :h_uncomprsize, :fieldlen, :h_clientfiledir, SYSTIMESTAMP); SYSDATE DUAL; CURRENT TIME SYSIBM.SYSDUMMY1 TO_CHAR(SYSTIME, HH24:MI:SS ) DUAL; TIMESTAMP_FORMAT(string_exp, YYYY-MM-DD HH24:MI:SS ) SUBSTR(CHAR(HEX(date_exp)), 1, 8) / SUBSTR(CHAR(HEX(date_exp)), 9, 4) SUBSTR(HEX()) / CURRENT TIMESTAMP - 1 SECOND TO_DATE(string_exp, YYYY-MM-DD HH24:MI:SS ) TO_CHAR(date_exp, YYYYMMDD ) / TO_CHAR(date_exp, HH24MI ) TO_CHAR() / SYSTIMESTAMP-1/24/60/60 MINUTE /24/60 TIMESTAMP_FORMAT(:qry_datetime, 'YYYY-MM-DD HH24:MI:SS') SUBSTR(HEX(CURRENT TIMESTAMP -1 SECOND), 1, 8) SUBSTR(HEX(CURRENT TIMESTAMP -1 SECOND), 9, 4) (CASE WHEN OCCURREDTIME > (CURRENT TIMESTAMP) THEN OCCURREDTIME + 1 MINUTE ELSE TO_DATE(:qry_datetime, YYYY-MM-DD HH24:MI:SS ) TO_CHAR(SYSTIMESTAMP-1/24/60/60, 'YYYYMMDD') TO_CHAR(SYSTIMESTAMP-1/24/60/60, 'HH24MI') CASE WHEN OCCURREDTIME > (SYSTIMESTAMP) THEN OCCURREDTIME+1/24/60 13

3.2. 日付フォーマットの例 SUBSTR(CHAR(HEX(CURRENT TIMESTAMP)), 1, 6) SUBSTR(CHAR(HEX(date_exp)), 1, 8) / SUBSTR(CHAR(HEX(date_exp)), 9, 4) TIMESTAMP(CAST(? AS VARCHAR(20))) TIMESTAMP(CAST(? AS VARCHAR(14))) SUBSTR(HEX(CURRENT TIMESTAMP - 1 SECOND), 1, 4) '-' SUBSTR(HEX(CURRENT TIMESTAMP - 1 SECOND), 5, 2) '-' SUBSTR(HEX(CURRENT TIMESTAMP - 1 SECOND), 7, 2) ' ' SUBSTR(HEX(CURRENT TIMESTAMP - 1 SECOND), 9, 2) ':' SUBSTR(HEX(CURRENT TIMESTAMP - 1 SECOND), 11, 2) ':' SUBSTR(HEX(CURRENT TIMESTAMP - 1 SECOND), 13, 2) SUBSTR(HEX(CURRENT TIMESTAMP), 1, 4) '/' SUBSTR(HEX(CURRENT TIMESTAMP), 5, 2) '/' SUBSTR(HEX(CURRENT TIMESTAMP), 7, 2) ' ' SUBSTR(HEX(CURRENT TIMESTAMP), 9, 2) ':' SUBSTR(HEX(CURRENT TIMESTAMP), 11, 2) ':' SUBSTR(HEX(CURRENT TIMESTAMP), 13, 2) WritingTimeGUI TO_CHAR(SYSTIMESTAMP, 'YYYYMM') TO_CHAR(date_exp, YYYYMMDD ) / TO_CHAR(date_exp, HH24MI ) TO_TIMESTAMP(?, 'YYYY-MM-DD HH24:MI:SS') TO_TIMESTAMP(?,'YYYYMMDDHH24MISS') TO_CHAR(TO_TIMESTAMP(SYSTIMESTAMP, 'YYYY/MM/DD HH24:MI:SS') TO_CHAR(TO_DATE(sysdate, HH24:MI:SS')) AS WritingTimeGUI 'YYYY/MM/DD 4. ROW / HIERARCHICAL QUERY / NEXTVAL / SYSIBM.SYSDUMMY1 4.1. 行関連関数 ROWNUM は ROWNUM という仮想列 (PSEUDO COLUMN) を利用して SQL 文から返される行の数をチェックします では FETCH FIRST n ROWS ONLY 文を使用して の ROWNUM と同じ機能を実行します FETCH FIRST 1 ROW ONLY WHERE ROWNUM < 2, AND ROWNUM <= 10 ROW_NUMBER() OVER () LocationCode, StackModuleNum, EquipAlias ROWNUM * ( LocationCode, StackModuleNum, EquipAlias 14

Equip e1, IFLinkL2 ln WHERE ln.fromlocationcode = CAST(? AS CHAR(9)) AND ln.fromstackmodulenum = CAST(? AS CHAR(2)) AND ln.tolocationcode = e1.locationcode AND ln.tostackmodulenum = e1.stackmodulenum FETCH FIRST 1 ROW ONLY); ROW_NUMBER() OVER () - 1 ROWNUM - 1 Equip e1, IFLinkL2 ln WHERE ln.fromlocationcode = CAST(? AS CHAR(9)) AND ln.fromstackmodulenum = CAST(? AS CHAR(2)) AND ln.tolocationcode = e1.locationcode AND ln.tostackmodulenum = e1.stackmodulenum ) WHERE ROWNUM < 2" ); 4.2. 階層問い合わせ 階層問い合わせ (Hierarchical Query) 階層問い合わせ (Hierarchical Query) は 表に含まれた行間に上下の階層関係が成立する場合 その階層関係に従って行を出力する問い合わせです 1つの対象表に階層関係を 1つ以上を定義できます 階層問い合わせは 1つの表または結合された 2つ以上の表に対しても定義できます 階層問い合わせのためには 文内に START WITH CONNECT BY 句を使用します - START WITH 句は 階層内のルート行を指定します - CONNECT BY 句は 行間の上下関係を定義します - START WITH 句とCONNECT BY 句には1 つの条件式が含まれます この条件式には 単純条件式と複合条件式の両方を使用できます 文でWITHで定義される共通表式を利用 EXEC SQL DECLARE CUR_SERVERTREE CURSOR FOR WITH ServerTree(Code, NodeLevel, ParentNodeIndex, NodeIndex, NodeName, NodeEngName, NodeType) AS ( CAST('1' AS CHAR(100)) Code, Root.NodeLevel, Root.ParentNodeIndex, Root.NodeIndex, Root.NodeName, Root.NodeEngName, Root.NodeType ServerNodeInfo Root WHERE NodeLevel = '0' UNION ALL RTRIM(Parent.Code) '.' CONNECT BY~START WITH 句を使用 またはインライン ビューを利用 EXEC SQL DECLARE CUR_SERVERTREE CURSOR FOR NodeLevel, NVL(ParentNodeIndex, -1) AS ParentNodeIndex, NodeIndex, NodeName, NodeEngName, NodeType ( SUBSTR(SYS_CONNECT_BY_PATH(DECODE (LEVEL,1,RTRIM(CAST('1' AS CHAR(100))),RTRIM(CAST(NodeIndex AS CHAR(100)))), '.'), 1) Code, NodeLevel, ParentNodeIndex, NodeIndex, NodeName, NodeEngName, NodeType ServerNodeInfo START WITH NodeLevel = '0' 15

RTRIM(CAST(Child.NodeIndex AS CHAR(100))) Code, Child.NodeLevel, Child.ParentNodeIndex, Child.NodeIndex, Child.NodeName, Child.NodeEngName, Child.NodeType ServerTree Parent, ServerNodeInfo Child WHERE Parent.NodeIndex = Child.ParentNodeIndex ) NodeLevel, VALUE(ParentNodeIndex, -1) AS ParentNodeIndex, NodeIndex, NodeName, NodeEngName, NodeType ServerTree ORDER BY Code; CONNECT BY PRIOR NodeIndex = ParentNodeIndex ) ServerTree ORDER BY Code;" SYS_CONNECT_BY_PATH SYS_CONNECT_BY_PATH は ルートからノードまでの列の値のパスを返す関数です この関数は階層問い合わせでのみ有効で す 返されたパスで 列値は char によって分離されます 文でWITHで定義される共通表式を利用 EXEC SQL DECLARE CUR_SERVERTREE CURSOR FOR WITH ServerTree(Code, NodeLevel, ParentNodeIndex, NodeIndex, NodeName, NodeEngName, NodeType) AS ( CAST('1' AS CHAR(100)) Code, Root.NodeLevel, Root.ParentNodeIndex, Root.NodeIndex, Root.NodeName, TIBERO CONNECT BY~START WITH 句を利用 EXEC SQL DECLARE CUR_SERVERTREE CURSOR FOR NodeLevel, NVL(ParentNodeIndex, -1) AS ParentNodeIndex, NodeIndex, NodeName, NodeEngName, NodeType ( SUBSTR(SYS_CONNECT_BY_PATH(DECODE (LEVEL,1,RTRIM(CAST('1' AS CHAR(100))),RTRIM(CAST(NodeIndex AS CHAR(100)))), '.'), 1) Code, 16

4.3. NEXTVAL (SEQUENCE) NEXTVAL (SEQUENCE) NEXTVAL FOR COLUMN_NAME EXEC SQL NEXTVAL FOR ImportantMsgSeqNum, SUBSTR(HEX(CURRENT TIMESTAMP), 1, 4) '/' SUBSTR(HEX(CURRENT TIMESTAMP), 5, 2) '/' SUBSTR(HEX(CURRENT TIMESTAMP), 7, 2) ' ' SUBSTR(HEX(CURRENT TIMESTAMP), 9, 2) ':' SUBSTR(HEX(CURRENT TIMESTAMP), 11, 2) ':' SUBSTR(HEX(CURRENT TIMESTAMP), 13, 2) WritingTime INTO :stimportantmessagequery.ldseqnum, :stimportantmessagequery.szwritingtime SYSIBM.SYSDUMMY1; COLUMN_NAME.NEXTVAL TIBERO EXEC SQL ImportantMsgSeqNum.NEXTVAL TO_CHAR(TO_DATE(SYSTIMESTAMP, 'YYYY/MM/DD HH24:MI:SS')) AS WritingTime INTO :stimportantmessagequery.ldseqnum, :stimportantmessagequery.szwritingtime DUAL; 4.4. SYSIBM.SYSDUMMY1 SYSIBM.SYSDUMMY1 --> DUAL DUAL ( ダミー表 ) は DUAL というダミー表を使用して様々なシステム情報を照会できます も同様の表が存在します 使用方法は 以下のとおりです SYSIBM.SYSDUMMY1 NEXTVAL FOR ImportantMsgSeqNum, SUBSTR(HEX(CURRENT TIMESTAMP), 1, 4) '/' SUBSTR(HEX(CURRENT TIMESTAMP), 5, 2) '/' SUBSTR(HEX(CURRENT TIMESTAMP), 7, 2) ' ' SUBSTR(HEX(CURRENT TIMESTAMP), 9, 2) ':' SUBSTR(HEX(CURRENT TIMESTAMP), 11, 2) ':' SUBSTR(HEX(CURRENT TIMESTAMP), 13, 2) WritingTime INTO :stimportantmessagequery.ldseqnum, :stimportantmessagequery.szwritingtime SYSIBM.SYSDUMMY1; DUAL ImportantMsgSeqNum,. NEXTVAL, TO_CHAR(TO_DATE(SYSTIMESTAMP, 'YYYY/MM/DD HH24:MI:SS')) AS WritingTimeINTO INTO :stimportantmessagequery.ldseqnum, :stimportantmessagequery.szwritingtime DUAL; 17

5. 関連関数 5.1. 関数の移行 ( 共通 ) - 以下の関数は と で共通して使用する関数です FC_ALARMCODE FC_BWSPEEDCODE FC_BWSPEED FC_CODE1 FC_CODE2 FC_CUSTNODENAME FC_DURATIONTOTIME FC_EQUIP_GROUP FC_EQUIP_TYPE FC_EQUIP_USG FC_IF_GROUP FC_IF_USG FC_NETWORKNODE FC_NODEINFO_IDX01 FC_NODEINFO_IDX02 FC_NODENAME FC_NODETYPE FC_NODINDEX FC_SERVERCODE1 FC_SVCNETWORK TABLE MIDNIGHT_SECONDS FC_ALARMCODE FC_BWSPEEDCODE FC_BWSPEED FC_CODE1 FC_CODE2 FC_CUSTNODENAME FC_DURATIONTOTIME FC_EQUIP_GROUP FC_EQUIP_TYPE FC_EQUIP_USG FC_IF_GROUP FC_IF_USG FC_NETWORKNODE FC_NODEINFO_IDX01 FC_NODEINFO_IDX02 FC_NODENAME FC_NODETYPE FC_NODINDEX FC_SERVERCODE1 FC_SVCNETWORK TABLE MIDNIGHT_SECONDS 5.2. Windows では使用不可 5.2.1. FC_SECONDSDIFF - 2 つの変数間の時間の差を秒で表す関数 FC_SECONDSDIFF STANDARD.SECONDS_BETWEEN 18

DISTINCT MALARMSEQNUM, c.alarmseqnum, c.locationcode, c.stackmodulenum, IFNAME, SUBSTR(CHAR(HEX(OCCURREDTIME)), 1, 6), ALARMIP, ALARMLOCATION, ALARMOBJECTTYPE, ALARMSOURCE, CURRENT TIMESTAMP, '0', CLEAREDSOURCE, FC_SECONDSDIFF(CURRENT TIMESTAMP, OccurredTime), AUTOCLEAR, LINKAGEYN, DISTINCT MALARMSEQNUM, c.alarmseqnum, c.locationcode, c.stackmodulenum, IFNAME, SUBSTR(CHAR(HEX(OCCURREDTIME)), 1, 6), ALARMIP, ALARMLOCATION, ALARMOBJECTTYPE, ALARMSOURCE, SYSTIMESTAMP, '0', CLEAREDSOURCE, STANDARD.SECONDS_BETWEEN (SYSTIMESTAMP, OccurredTime), AUTOCLEAR, LINKAGEYN, 5.2.2. TIMESTAMPDIFF TIMESTAMPDIFF --> DATEDIFF - 組み込み関数 TIMESTAMPDIFF DISTINCT EVENTDATE,EVENTTIME SUBSTR(CHAR(HEX(TIMESTAMP(EVENTDATE EVENTTIME '00') + TIMESTAMPDIFF(2, CHAR(TIMESTAMP(EVENTDATE DURATION) - TIMESTAMP(EVENTDATE '000000'))) SECOND)),9,4) AS EVENTTIME DATEDIFF DISTINCT EVENTDATE,EVENTTIME TO_CHAR(TO_TIMESTAMP(EVENTDATE EVENTTIME '00') + DATEDIFF( TO_CHAR(TO_TIMESTAMP(EVENTDATE DURATION) - TO_TIMESTAMP(EVENTDATE '000000')), 'S') /24/60/60)),'HH24MI') AS EVENTTIME\ 5.2.3. FC_GREATEST / FC_LEAST / FC_SECONDSDIFF - 組み込み機能に変換が可能 FC_GREATEST FC_LEAST FC_SECONDSDIFF GREATEST LEAST SECONDS_BETWEEN 6. 集合演算子 UNION UNION ALL EXCEPT INTERSECT COALESCE(MANAGER_ID, No Manager ) UNION UNION ALL MINUS INTERSECT NVL(MANGER_ID, No Manager ) 19

7. SQLCODE - は次のような ISO/ANSI SQL 標準に従います SQLCODE 0 > SQLCODE 実行に失敗 実行に失敗 0 = SQLCODE 正常に実行 正常に実行 0 < SQLCODE 警告メッセージと一緒に実行 警告メッセージと一緒に実行 エラーコードに対応する のエラーコード 0 Successful Execution 0 Successful Execution +100 NO DATA FOUND, +100 TIBERO MODE の場合に 1403-102 String constant is too long 11015 input parameter string is too long -117 The number of values in the INSERT does not match the number of columns. -180 Bad data in Date/Time/Timestamp. 90604 Invalid syntax 7009 Exceeded the maximum number of available columns. -199 Illegal use of the specified keyword 5014 specified format code is not valid -205 Column name not in table. 9044 Invalid column name(s) -216 Not the same number of expressions on both sides of the comparison in a. FETCH. 11042 invalid regular expression in regexp functions 7116 invalid datatype of default expression 8007 missing boolean expression 8008 missing expression 15102 Invalid cursor -502 Opening cursor that is already open. 2054 cursor already open -803 Duplicate key on insert or update. 10007 unique constraint violated -811 More than one row retrieved in INTO 9095 Too many rows are returned in select -818 Plan and program: timestamp mismatch 11013 TO_TIMESTAMP for this type does not take format 5004 invalid timestamp value 5012 invalid time format -911 Deadlock or timeout. Rollback has been done. 12032 Deadlock Detected. 15113 Timeout on resource +304 Value cannot be assigned to this host variable because it is out of range. 8065 invalid host variable name 9017 Array size of host variable \'%1$s\' is mismatched. It should be a number of 1 or more. 9051 Host variable type is not compatible with column type 9138 Invalid host variable - PL/SQL 例外処理の例 DECLARE past_due EXCEPTION; 20

due_date DATE := trunc(sysdate) - 1; todays_date DATE := trunc(sysdate); BEGIN IF due_date < todays_date THEN RAISE past_due; END IF; END; EXCEPTION WHEN NO_DATA_FOUND THEN statements WHEN OTHERS THEN statements END; 8. 一時表の処理 - 1 つ以上の句をフェッチするために使用します ではサポートしないため の ESQL 文法を利用して一時表関数を再定義して使用します EXEC SQL DECLARE GLOBAL TEMPORARY TABLE ETNINFO AS ( NodeIndex EquipToNode ) DEFINITION ONLY ON COMMIT PRESERVE ROWS NOT LOGGED WITH REPLACE; if (SQLCODE < 0) PutDbErr(LOG_ERROR, NULL, "Fetch Failed.\n"); return ERROR; char szquery[1024]; memset(szquery, 0x00, sizeof(szquery)); cnttemptable = 0; sprintf(szquery, ""select count(*) from user_objects where object_name = 'ETNINFO'""); EXEC SQL PREPARE SQL_GET_CNT :szquery; EXEC SQL DECLARE CUR_GET_CNT CURSOR FOR SQL_GET_CNT; if(sqlcode!= 0) PutDbErr(LOG_ERROR, NULL, ""Cursor Open Failed. \n""); return ERROR; EXEC SQL FETCH CUR_GET_CNT INTO :cnttemptable; if(sqlcode < 0) PutDbErr(LOG_ERROR, NULL, ""Cursor Fetch Failed. \n""); EXEC SQL CLOSE CUR_GET_CNT; return ERROR; EXEC SQL CLOSE CUR_GET_CNT; if (cnttemptable = 1) <- 一時表が存在する場合 EXEC SQL DROP TABLE ETNINFO; if (SQLCODE < 0) PutDbErr(LOG_ERROR, NULL, ""Fetch Failed.\n""); 21

return ERROR; Log(LOG_TRACE, ""Temp Table Drop Because Temp Table already exists""); if (cnttemptable = 0) <- 一時表が存在しない場合に作成する構文 Log(LOG_TRACE, ""Temp Table Not exists""); EXEC SQL CREATE GLOBAL TEMPORARY TABLE ETNINFO AS NodeIndex EquipToNode; if (SQLCODE < 0) PutDbErr(LOG_ERROR, NULL, ""Fetch Failed.\n""); return ERROR; EXEC SQL CREATE UNIQUE INDEX ETNINFO_INDEX ON ETNINFO(NodeIndex); if (SQLCODE < 0) PutDbErr(LOG_ERROR, NULL, ""Fetch Failed.""); return ERROR; return SUCCESS;" 9. の未サポート項目 EXEC SQL SET CURRENT QUERY OPTIMIZATION = 1 WITH UR 未サポート 未サポート 10. 機能の変換 - create 関数 または replace 関数宣言句のパラメータ データ型の桁数を削除 - RETURNS -> RETURN - specific ~~ registers を削除 - 結果値を返す変数を宣言 ( ただし ここではデータ型の桁数を含む ) - SQL 文を BEGIN ~ END 句に変更し 結果値を返す変数を利用してリターン処理 - ESLEIF -> ESLIF - 戻り値が表である関数は 戻り値を構成する変数タイプでパッケージを作成した後利用例 ) 22

CREATE FUNCTION MCASTDB.FC_ADDRESS (IN_ADDRESSCODE VARCHAR(10) ) RETURNS VARCHAR(50) SPECIFIC MCASTDB.FC_ADDRESS LANGUAGE SQL DETERMINISTIC READS SQL DATA STATIC DISPATCH CALLED ON NULL INPUT NO EXTERNAL ACTION INHERIT SPECIAL REGISTERS RETURN address address where addresscode=in_addresscode; CREATE FUNCTION MCASTDB.FC_CHECKYN (IN_PPINFOYN CHARACTER(1), IN_PROFILEYN CHARACTER(1) ) RETURNS CHARACTER(1) SPECIFIC MCASTDB.FC_CHECKYN LANGUAGE SQL DETERMINISTIC READS SQL DATA STATIC DISPATCH CALLED ON NULL INPUT EXTERNAL ACTION INHERIT SPECIAL REGISTERS BEGIN ATOMIC DECLARE OUT_TYPE CHAR(1) DEFAULT '' ; IF IN_PPINFOYN = 'N' THEN SET OUT_TYPE = 'N'; ELSEIF IN_PPINFOYN = 'Y' THEN IF IN_PROFILEYN = 'Y' THEN SET OUT_TYPE = 'Y'; ELSE SET OUT_TYPE = 'N'; END IF; END IF; RETURN OUT_TYPE; END; CREATE FUNCTION MCASTDB.FC_NODEINFO_IDX01 (NODEINDEXIN BIGINT ) RETURNS TABLE (NODEINDEX BIGINT, PARENTNODEINDEX BIGINT, NODETYPE VARCHAR(2) ) SPECIFIC MCASTDB.FC_NODEINFO_IDX01 LANGUAGE SQL DETERMINISTIC READS SQL DATA STATIC DISPATCH CALLED ON NULL INPUT NO EXTERNAL ACTION INHERIT SPECIAL REGISTERS BEGIN ATOMIC RETURN WITH h_nodeinfo(nodeindex, ParentNodeIndex, NodeType ) AS ( root.nodeindex, root.parentnodeindex, root.nodetype NodeInfo root WHERE NodeIndex = NodeIndexIn UNION ALL child.nodeindex, child. ParentNodeIndex, child.nodetype h_nodeinfo parent, NodeInfo child WHERE parent.nodeindex = child.parentnodeindex ) NodeIndex, ParentNodeIndex, NodeType h_nodeinfo; END; TIBERO CREATE OR REPLACE FUNCTION MCASTDB.FC_ADDRESS (IN_ADDRESSCODE VARCHAR) RETURN VARCHAR IS v_address VARCHAR(50); BEGIN address INTO v_address address WHERE addresscode=in_addresscode; RETURN v_address; END; CREATE OR REPLACE FUNCTION MCASTDB.FC_CHECKYN (IN_PPINFOYN CHAR, IN_PROFILEYN CHAR) RETURN CHAR IS OUT_TYPE CHAR(1) DEFAULT ''; BEGIN IF IN_PPINFOYN = 'N' THEN OUT_TYPE := 'N'; ELSIF IN_PPINFOYN = 'Y' THEN IF IN_PROFILEYN = 'Y' THEN OUT_TYPE := 'Y'; ELSE OUT_TYPE := 'N'; END IF; END IF; RETURN OUT_TYPE; END; CREATE OR REPLACE PACKAGE PKG01 IS TYPE NODEINFO01 IS RECORD(NODEINDEX NUMBER, PARENTNODEINDEX NUMBER, NODETYPE VARCHAR(2)); TYPE TBL_NODEINFO01 IS TABLE OF NODEINFO01; END; CREATE OR REPLACE FUNCTION MCASTDB.FC_NODEINFO_IDX01(NODEINDEXIN IN NUMBER) RETURN PKG01.TBL_NODEINFO01 PIPELINED AS v PKG01.NODEINFO01; CURSOR c IS NodeIndex, ParentNodeIndex, NodeType NodeInfo START WITH NodeIndex = (NodeIndexIn) CONNECT BY prior NodeIndex = ParentNodeIndex; BEGIN OPEN c; LOOP FETCH c INTO v; EXIT WHEN c%notfound; PIPE ROW(v); 23

END LOOP; CLOSE c; END; 11. トリガーの変換 - SET CURRENT SCHEMA 句 SET CURRENT PATH 句を削除 - SQL 文法に変更 EX) CREATE PROCEDURE MCASTDB.SP_ALARMEQUIPD (IN IN_LOCATIONCODE CHARACTER(9), IN IN_STACKMODULENUM CHARACTER(2)) SPECIFIC MCASTDB.SP_ALARMEQUIPD LANGUAGE SQL NOT DETERMINISTIC CALLED ON NULL INPUT MODIFIES SQL DATA INHERIT SPECIAL REGISTERS BEGIN DECLARE h_alarm INTEGER;-- DECLARE h_custalarm INTEGER;-- set h_custalarm = ( COUNT(*) CUSTCOUNTEQUIP WHERE LocationCode = IN_LOCATIONCODE AND StackModuleNum = IN_STACKMODULENUM);--... END; CREATE OR REPLACE PROCEDURE MCASTDB.SP_ALARMEQUIPD (IN_LOCATIONCODE IN CHAR, IN_STACKMODULENUM IN CHAR) IS h_alarm INTEGER; h_custalarm INTEGER; BEGIN COUNT(*) INTO h_custalarm CUSTCOUNTEQUIP WHERE LocationCode = IN_LOCATIONCODE AND StackModuleNum = IN_STACKMODULENUM;.... END; 24

Copyright 2014 TmaxData Co., Ltd. All Rights Reserved. Trademarks RDBMS is a registered trademark of TmaxData Co., Ltd. Other products, titles or services may be registered trademarks of their respective companies. Contact Information TmaxData can be contacted at the following addresses to arrange for a consulting team to visit your company and discuss your options. Korea TmaxData Co., Ltd 5, Hwangsaeul-ro 329beon-gil, Bundang-gu, Seongnam-si, Gyeonggi-do. South Korea Tel: +82-31-779-7113 Fax: +82-31-779-7119 Email: info@tmax.co.kr Web (Korean): http://www.tmaxdata.com Technical Support: http://technet.tmaxsoft.com USA TmaxSoft, Inc. 560 Sylvan Avenue Englewood Cliffs, NJ 07632. U.S.A Tel: +1-201-567-8266 Fax: +1-201-567-7339 Email: info@tmaxsoft.com Web (English): http://www.tmaxsoft.com Russia Tmax Russia L.L.C. Grand Setun Plaza, No A204 Gorbunova st.2, Moscow, 121596 Tel: +7(495)970-01-35 Email: info.rus@tmaxsoft.com Web (Russian): http://ru.tmaxsoft.com Singapore Tmax Singapore Pte. Ltd. 430 Lorong 6, Toa Payoh #10-02, OrangeTee Building. Singapore 319402 Tel: +65-6259-7223 Email: info.sg@tmaxsoft.com United Kingdom TmaxSoft UK Ltd. Surrey House, Suite 221, 34 Eden Street, Kingston-Upon- Thames, KT1 1ER United Kingdom Tel: + 44-(0)20-8481-3776 Email: info.uk@tmaxsoft.com Web (English): http:/www.tmaxsoft.com Japan TmaxSoft Japan Co., Ltd. 5F Sanko Bldg, 3-12-16 Mita, Minato-Ku, Tokyo, 108-0073 Japan Tel: +81-3-5765-2550 Fax: +81-3-5765-2567 Email: info.jp@tmaxsoft.com Web (Japanese): http://www.tmaxsoft.co.jp China TmaxSoft China Co., Ltd. Beijing Silver Tower, RM 1508, 2 North Rd Dong San Huan, Chaoyang District, Beijing, China, 100027. China Tel: +86-10-6410-6145~8 Fax: +86-10-6410-6144 Email: info.cn@tmaxsoft.com Web (Chinese): http://www.tmaxsoft.com.cn Brazil TmaxSoft Brazil Avenida Copacabana, 177-3 andar 18 do Forte Empresarial, Alphaville - Barueri, Sao Paulo, SP-Brasil CEP 06472-001 Email: contato.brasil@tmaxsoft.com TN-TRWB-D0624101 25