TiberoとOracleの互換性をテストするために、お気に入りのPL / SQLライブラリが動作するかどうかを確認することにしました。
https://github.com/mortenbra/alexandria-plsql-utils/
JSON_UTIL_PKGでテストを開始しました 。 JSON応答をすばやく生成できる非常に便利な機能。
そしてそう
wget https://raw.githubusercontent.com/mortenbra/alexandria-plsql-utils/2213e3df2f24a00322239d442c54bf31039f2588/setup/types.sql wget https://raw.githubusercontent.com/mortenbra/alexandria-plsql-utils/master/ora/json_util_pkg.pks wget https://raw.githubusercontent.com/mortenbra/alexandria-plsql-utils/master/ora/json_util_pkg.pkb
生活を簡素化するには、pkbファイルの先頭に追加します
set define off
types.sqlが正常にインストールされました。
パッケージをインストールするときに、予期せず問題が発生しました。 Oracleでこれらの3つのファイルのインストールがコンパイル済みパッケージの受信でスムーズに行われた場合、 tiberoの場合、パッケージ本体に入力するときに次の出力を受け取りました。
tbsql sys/syspass @json_util_pkg.pkb tbSQL 5 SP1 TmaxData Corporation Copyright (c) 2008-. All rights reserved. Connected to Tibero. Warning: PACKAGE BODY created with compilation errors. File finished.
電話で
show errors
エラーが出る
TBR-15046: Identifier is out of scope. at line 251, column 5: dbms_xmlgen
dbms_xmlgenパッケージがtiberoに ないことがわかりました 。 この問題に直面して、DBMS%パッケージが実際に何であるかを確認することにしました。 リクエスト
select distinct name from all_source where name like 'DBMS%' order by 1
次のリストを入手しました
DBMS_APM | DBMS_APM_INTERNAL | DBMS_APPLICATION_INFO | DBMS_CRYPTO |
DBMS_DEBUG | DBMS_DEBUG_JDWP | DBMS_ERRLOG | DBMS_EXPRESSION |
DBMS_FLASHBACK | DBMS_GEOM | DBMS_JAVA | DBMS_JOB |
DBMS_JOB_WITH_NAME | DBMS_JOB_WITH_NAME_INTERNAL | DBMS_LOB | DBMS_LOCK |
DBMS_METADATA | DBMS_MVIEW | DBMS_MVIEW_REFRESH_UTIL | DBMS_MVIEW_UTIL |
DBMS_OBFUSCATION_TOOLKIT | DBMS_OUTPUT | DBMS_PIPE | DBMS_RANDOM |
DBMS_REDEFINITION | DBMS_REDEFINITION_STATS | DBMS_REPAIR | DBMS_RESULT_CACHE |
DBMS_ROWID | DBMS_SESSION | DBMS_SPACE | DBMS_SPACE_ADMIN |
DBMS_SPH | DBMS_SPH_INTERNAL | DBMS_SQL | DBMS_STATS |
DBMS_STATS_INTERNAL | DBMS_STATS_UTIL | DBMS_SYSTEM | DBMS_TRANSACTION |
DBMS_TYPES | DBMS_UTILITY | DBMS_VERIFY | DBMS_XMLGEN |
DBMS_XPLAN |
私のバージョンのオラクルでは合計45対195です。 悲しいですね。 Oracleで使用しなければならなかったパッケージのうち、 DBMS_SCHEDULER 、 DBMS_XMLDOMなどが不足しているのはイライラします。
tibero dbmsに含まれていない150のリストの多くは、それらから 欠落 しているパッケージを見つけると思い ます 。
しかし、最も興味深いのは、エラーが発生したdbms_xmlgenパッケージがTiberoに存在することです。 問題は、パッケージにsetmaxrows関数がないことでした 。
作ることにより
desc dbms_xmlgen
Tiberoでこのパッケージコンテンツを取得しました
関数変換(XMLDATAのVARCHAR、数値のフラグ)はVARCHARを返します
|
関数変換(CLOBのXMLDATA、数値のフラグ)はCLOBを返します
|
FUNCTION NEWCONTEXT(VARCHARのクエリ)戻り値
|
関数NEWCONTEXT(REF CURSORのクエリ)の戻り値
|
手順SETNULLHANDLING(番号のCTX、番号のフラグ)
|
手順CLOSECONTEXT(CTX IN NUMBER)
|
関数GETXML(CTXの番号、DTDORSCHEMAの番号)はCLOBを返します
|
戻り値CLOBの関数GETXML(VARCHARのSQLQUERY、NUMBERのDTDORSCHEMA)
|
プロシージャGETXML(CTX IN NUMBER、TMPCLOB IN OUT CLOB、DTDORSCHEMA IN NUMBER)
|
上記からわかるように、 Tiberoにはパッケージだけでなく、その中に手順もあります。 標準のOracleパッケージを使用するパッケージはコンパイルされない可能性が高いため、完成したOracle製品のTiberoへの移行は非常に困難である可能性が高いことがわかります。
このような結果を受け取ったので、 DBMS_LOBとDBMS_LOCKの 2つのパッケージをさらに詳しく調べることにしました。 PL / SQL開発者の間で最も人気があるように思われるので、それらが選ばれました。
DBMS_LOB。
比較の結果、すべての基本機能が存在することがわかりましたが 、 Tiberoでフラグメントを操作することはできません。DBFS_LINKsも、便利な方法もありません。 ドライに言えば、 tiberoのDBMS_LOBパッケージには次のメソッドが含まれていません。
COPY_DBFS_LINK | COPY_FROM_DBFS_LINK | DBFS_LINK_GENERATE_PATH | FRAGMENT_DELETE |
FRAGMENT_INSERT | FRAGMENT_MOVE | FRAGMENT_REPLACE | げっちゅ |
Getconntentpe | Getoptions | GET_DBFS_LINK | GET_DBFS_LINK_STATE |
GET_DEDUPLICATE_REGIONS | GET_STORAGE_LIMIT | ISSECUREFILE | LOADBLOBFROMFILE |
LOADCLOBFROMFILE | LOADFROMFILE | MOVE_TO_DBFS_LINK | SETCONTENTTYPE |
設定 | SET_DBFS_LINK |
DBMS_LOCKは完全に実装されています。
UTL_%パケットの場合、状況はDBMS_%に近いです。 Tiberoでは合計で11個のパッケージが提供されています。 8( UTL_ENCODE 、 UTL_FILE 、 UTL_HTTP 、 UTL_I18N 、 UTL_MATCH 、 UTL_RAW 、 UTL_TCP 、 UTL_URL )は標準のOracleパッケージに似ていますが、残りの3つは独自のものです。 Oracleには21個のパッケージがあるため、次の13個のパッケージはTiberoに実装されていません。
UTL_CALL_STACK | UTL_COLL | UTL_COMPRESS | UTL_GDK |
UTL_IDENT | UTL_INADDR | UTL_LMS | UTL_NLA |
UTL_RECOMP | UTL_REF | UTL_SMTP | UTL_SYS_COMPRESS |
UTL_XML |
TiberoがXMLをそれほど嫌うのはなぜだろうか...
ライブラリの状態はあまり楽観的ではありません。 しかし、常にではありませんが、 DBMSおよびUTLパッケージを使用します! 時々、十分な標準機能があり、それらを使用してすべてが多少楽観的です。 TMaxは 、サポートされている機能のリストを積極的に拡大しており、現在、次のメソッドのリストを着実にサポートしています。
数学
ABS | アコス | アシン | アタン | ATAN2 |
平均 | Bitand | セイル | コス | コッシュ |
COUNT | EXP | フロア | Ln | ログ(M、N) |
MOD | 力 | ラウンド | サイン | 罪 |
シン | SQRT | タン | タン | TRUNC |
行
連結 | CHR | 下 | 上部 | LPAD |
LTRIM | Rtrim | RPAD | SUBSTR | 交換 |
INITCAP | NLS_INITCAP | NLS_SORT | 翻訳する | TO_CHAR |
アスキー | INSTR | 長さ | 長さ |
日程
+整数 | -日付 | ADD_MONTHS | CURRENT_DATE |
CURRENT_TIME | CURRENT_TIMESTAMP | LAST_DAY | NEW_TIME |
NEXT_DAY | ラウンド | TRUNC | 抽出物 |
SYSTIMESTAMP | MONTHS_BETWEEN | TO_CHAR | TO_NUMBER |
TO_DATE | TO_DSINTERVAL | SYSDATE |
オフィス
最高の | 少なくとも | キャスト | 変換 |
ヘキソチャー | ROWIDTOCHAR | TO_CLOB | TO_LOB |
デコード | ダンプ | VSIZE | 併合 |
Lnnvl | ヌリフ | NVL | NVL2 |
all_proceduresでリクエストを行うと、さらに多くの関数が表示されますが、公式ドキュメントには記載されていません。
上記の結果が得られた後、私は複雑なパッケージをダウンロードすることは意味がないと判断しました。ほとんどの場合、問題は同様であり、特定のパッケージの欠如にかかっています。 しかし、 DBMSパッケージや複雑な機能がなくても簡単に実行できるシンプルなシステムがありますので、そのようなシステムを転送する際に発生する可能性のある問題を評価することにしました。 このために、HRスキームの例を取り上げました。
彼女はここから連れて行かれました:
http://www.oracle.com/technetwork/developer-tools/datamodeler/hr-30-ddl-246035.zip
このスクリプトの実行により、 Oracleの ddlのサポートが不完全であることが明らかになりました。
問題番号1
ALTER TABLE JOB_HISTORY ADD CONSTRAINT JHIST_DATE_CHECK CHECK (end_date > start_date) INITIALLY IMMEDIATE ENABLE VALIDATE ;
エラーが発生します。
TBR-7001: General syntax error. at line 4, column 9: INITIALLY IMMEDIATE
詳細については、ドキュメントでこれを設定する方法が見つかりませんでした。 しかし、テストで判断すると、 DEFERRABLE値に従って機能します。 しかし、それには微妙な違いがあります(問題2を参照)
問題番号2
ALTER TABLE COUNTRIES ADD CONSTRAINT COUNTR_REG_FK FOREIGN KEY ( REGION_ID ) REFERENCES REGIONS ( REGION_ID ) NOT DEFERRABLE ;
エラーが発生します。
TBR-7001: General syntax error. at line 10, column 5: NOT DEFERRABLE
繰り返しますが、 制約の作成に関するドキュメントは見つかりませんでしたが、実際には、遅延制約が必要な場合はDEFERRABLEを記述し、この制約を常に確認したい場合は何も指定しません(これはデフォルト値です)。
スキームが作成され、スクリプトを実行してDBMSの機能をテストできるようになりました。 私はここからスクリプトを取りました:
http://www.srikanthtechnologies.com/oracle/dec9/hrqueries.html
問題番号3
リクエスト:
SELECT SYSDATE - to_date('01-jan-2011') FROM DUAL
エラーを与えます:
TBR-5113: Invalid month value 'jan-2011'. (01-jan-2011)
Tiberoの正しいリクエストは次のとおりです。
SELECT SYSDATE - to_date('20110101') from dual
この些細なことは、開発の主な方向性の1つがOracleとの互換性であると同社が主張しているため、問題に思えます 。 また、互換性は高品質のコードをサポートするだけでなく、不良コードの正しい動作もサポートします。 Oracleでデフォルトで機能するものがある場合、このようなポリシーを使用すると、 Tiberoでデフォルトで機能することが期待されます。
これらのスクリプトから他のエラーを取得できませんでした。 ピボット、さまざまな結合表記、階層クエリを個別にチェックしました。すべてが機能し、 パイプライン関数が奇妙に機能し、すべてが接続されています。 簡単な例を示します。
問題番号4
型を作成します
CREATE OR REPLACE TYPE TEST_TYPE IS OBJECT( TESTYPE NUMBER ); CREATE OR REPLACE TYPE TEST_TYPE_TABLE IS TABLE OF TEST_TYPE;
関数発行テーブルを作成します
CREATE OR REPLACE FUNCTION TEST_FUNCTION(PARAM IN NUMBER) RETURN TEST_TYPE_TABLE IS RSLT TEST_TYPE_TABLE; BEGIN RSLT := TEST_TYPE_TABLE(); RSLT.EXTEND; RSLT(RSLT.LAST) := TEST_TYPE(PARAM); RETURN RSLT; END;
私はリクエストをします:
SELECT * FROM TABLE( test_function( 2 ) )
受け取った:
TBR-8051: User-defined functions are not permitted in the expression. at line 1, column 23: select * from table( test_function(2) )
私は状況を修正しようとしました:
select * from table( cast(test_function(2) as test_type_table) )
結果はさらに悪いです:
TBR-8021: Invalid table name. at line 1, column 47: select * from table( cast(test_function(2) as test_type_table) )
しかし、このメーカーはそれを直そうとしていますが、今のところ私たちは持っています。
問題番号5
データベースマネージャーの接続。 これが問題全体であり、タンバリンで踊る。 ほとんどはデータベースと通信したくないか、設定があまり明確ではありません。 製造業者はtbrliboci.dllになることを約束していますが、今のところそうではありません。
問題番号6
Oracle Forms 9をTiberoに接続しようとしました。 接続中にチェックサムエラーが発生しました。 それ以上進むことはできませんでした。
問題番号7
dbms_xplan.displayなしでExplain Planを使用するのはかなり苦痛でした 。
テストの結果、既製のパッケージといくつかの既製のPL / SQLシステムをロードすることによると、かなりシンプルで軽量なシステムは十分に許容されると言えます。 すべてが機能し、問題はありません。 あなたはそれを0で書くことができ、おそらく、非常にうまくいきます。 もちろん、あなたが英語を知っていて、何かがOracleと同じように機能することを我慢する準備ができていない限り。 オンラインストア、ABS銀行、倉庫会計システム、パッケージの問題、 パイプラインの貧弱な作業などの大規模システムの場合、移行プロセスは痛みを伴い、完成したコードの書き換えを伴います。
一般的に、この製品には生存の可能性があるように思えます。 そして今、最初の部分で述べたように、彼と協力しているロシアの会社があります。 私たちはそこで働いていますが、ロシア語には賢明な情報はありません。 したがって、この製品の周りのロシア語を話す人々のコミュニティに、このTibero subの経験を提案、支援、または共有し始めてほしいです。
PS執筆に協力してくれたPeter Zhitnikovに感謝します。