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

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

TiberoOracleの互換性をテストするために、お気に入りの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_APMDBMS_APM_INTERNALDBMS_APPLICATION_INFODBMS_CRYPTO
DBMS_DEBUGDBMS_DEBUG_JDWPDBMS_ERRLOGDBMS_EXPRESSION
DBMS_FLASHBACKDBMS_GEOMDBMS_JAVADBMS_JOB
DBMS_JOB_WITH_NAMEDBMS_JOB_WITH_NAME_INTERNALDBMS_LOBDBMS_LOCK
DBMS_METADATADBMS_MVIEWDBMS_MVIEW_REFRESH_UTILDBMS_MVIEW_UTIL
DBMS_OBFUSCATION_TOOLKITDBMS_OUTPUTDBMS_PIPEDBMS_RANDOM
DBMS_REDEFINITIONDBMS_REDEFINITION_STATSDBMS_REPAIRDBMS_RESULT_CACHE
DBMS_ROWIDDBMS_SESSIONDBMS_SPACEDBMS_SPACE_ADMIN
DBMS_SPHDBMS_SPH_INTERNALDBMS_SQLDBMS_STATS
DBMS_STATS_INTERNALDBMS_STATS_UTILDBMS_SYSTEMDBMS_TRANSACTION
DBMS_TYPESDBMS_UTILITYDBMS_VERIFYDBMS_XMLGEN
DBMS_XPLAN

私のバージョンのオラクルでは合計45対195です。 悲しいですね。 Oracleで使用しなければならなかったパッケージのうち、 DBMS_SCHEDULERDBMS_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_LOBDBMS_LOCKの 2つのパッケージをさらに詳しく調べることにしました。 PL / SQL開発者の間で最も人気があるように思われるので、それらが選ばれました。

DBMS_LOB。
比較の結果、すべての基本機能が存在することがわかりましたがTiberoでフラグメントを操作することはできません。DBFS_LINKsも、便利な方法もありません。 ドライに言えば、 tiberoDBMS_LOBパッケージには次のメソッドが含まれていません。
COPY_DBFS_LINKCOPY_FROM_DBFS_LINKDBFS_LINK_GENERATE_PATHFRAGMENT_DELETE
FRAGMENT_INSERTFRAGMENT_MOVEFRAGMENT_REPLACEげっちゅ
GetconntentpeGetoptionsGET_DBFS_LINKGET_DBFS_LINK_STATE
GET_DEDUPLICATE_REGIONSGET_STORAGE_LIMITISSECUREFILELOADBLOBFROMFILE
LOADCLOBFROMFILELOADFROMFILEMOVE_TO_DBFS_LINKSETCONTENTTYPE
設定SET_DBFS_LINK


DBMS_LOCKは完全に実装されています。

UTL_%パケットの場合、状況はDBMS_%に近いです。 Tiberoでは合計で11個のパッケージが提供されています。 8( UTL_ENCODEUTL_FILEUTL_HTTPUTL_I18NUTL_MATCHUTL_RAWUTL_TCPUTL_URL )は標準のOracleパッケージに似ていますが、残りの3つは独自のものです。 Oracleには21個のパッケージがあるため、次の13個のパッケージはTiberoに実装されていません。
UTL_CALL_STACKUTL_COLLUTL_COMPRESSUTL_GDK
UTL_IDENTUTL_INADDRUTL_LMSUTL_NLA
UTL_RECOMPUTL_REFUTL_SMTPUTL_SYS_COMPRESS
UTL_XML


TiberoXMLをそれほど嫌うのはなぜだろうか...

ライブラリの状態はあまり楽観的ではありません。 しかし、常にではありませんが、 DBMSおよびUTLパッケージを使用します! 時々、十分な標準機能があり、それらを使用してすべてが多少楽観的です。 TMaxは 、サポートされている機能のリストを積極的に拡大しており、現在、次のメソッドのリストを着実にサポートしています。
数学
ABSアコスアシンアタンATAN2
平均Bitandセイルコスコッシュ
COUNTEXPフロアLnログ(M、N)
MODラウンドサイン
シンSQRTタンタンTRUNC


連結CHR上部LPAD
LTRIMRtrimRPADSUBSTR交換
INITCAPNLS_INITCAPNLS_SORT翻訳するTO_CHAR
アスキーINSTR長さ長さ

日程
+整数-日付ADD_MONTHSCURRENT_DATE
CURRENT_TIMECURRENT_TIMESTAMPLAST_DAYNEW_TIME
NEXT_DAYラウンドTRUNC抽出物
SYSTIMESTAMPMONTHS_BETWEENTO_CHARTO_NUMBER
TO_DATETO_DSINTERVALSYSDATE

オフィス
最高の少なくともキャスト変換
ヘキソチャーROWIDTOCHARTO_CLOBTO_LOB
デコードダンプVSIZE併合
LnnvlヌリフNVLNVL2


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

Source: https://habr.com/ru/post/J270395/


All Articles