Tiberoパート2. Oracleを使用したプロジェクトの再配置

ティベロとの私の冒険の最初の部分は こちらです



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に感謝します。



All Articles