Pull to refresh

Tibero часть 2. Переснос проекта с Oracle

Reading time7 min
Views9.6K
Первая часть моих приключений с Tibero тут

Для тестирования совместимости Tibero c 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 установка этих трех файлов прошла гладко с получением скомпилированного пакета, то в случае с 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. Выглядит грустно. Из тех пакетов, что мне в Oracle приходилось использовать расстраивает отсутствие DBMS_SCHEDULER, DBMS_XMLDOM и т.д..
Я думаю, что многие в списке 150 не попавших в tibero dbmsов найдут не хватающие им пакеты.
Но что самое интересное: пакет dbms_xmlgen, из-за которого была ошибка, в Tibero присутствует. Проблема же оказалась в том, что в пакете нет функции setmaxrows.
Сделав
desc dbms_xmlgen

Получил такое наполнение пакета в Tibero
FUNCTION CONVERT( XMLDATA IN VARCHAR, FLAG IN NUMBER ) RETURNS VARCHAR
FUNCTION CONVERT( XMLDATA IN CLOB, FLAG IN NUMBER ) RETURNS CLOB
FUNCTION NEWCONTEXT( QUERY IN VARCHAR ) RETURNS NUMBER
FUNCTION NEWCONTEXT( QUERY IN REF CURSOR ) RETURNS NUMBER
PROCEDURE SETNULLHANDLING( CTX IN NUMBER, FLAG IN NUMBER )
PROCEDURE CLOSECONTEXT( CTX IN NUMBER )
FUNCTION GETXML( CTX IN NUMBER, DTDORSCHEMA IN NUMBER) RETURNS CLOB
FUNCTION GETXML( SQLQUERY IN VARCHAR, DTDORSCHEMA IN NUMBER ) IN RETURNS CLOB
PROCEDURE GETXML( CTX IN NUMBER, TMPCLOB IN OUT CLOB, DTDORSCHEMA IN NUMBER )


Как из вышесказанного видно, у Tibero меньше не только пакетов, но и процедур внутри них. Получается, что скорее всего миграция готового Oracle продукта на Tibero будет достаточно тяжелой, так как велик шанс, что пакеты использующие стандартные пакеты Oracle не cкомпилируются и их придется переписывать, либо самостоятельно реализовывать стандартные Oracle пакеты.

Получив такой результат я решил более детально изучить еще два пакета: DBMS_LOB и DBMS_LOCK. Они были выбраны потому что они мне кажутся самыми популярными у PL/SQL разработчиков.

DBMS_LOB.
Сравнение показало, что все основные функции присутствуют, но в Tibero c фрагментами работать нельзя, c DBFS_LINK’ами тоже, да и некоторых удобных методов тоже нет. Если говорить сухо, то пакет DBMS_LOB в tibero не содержит следующие методы:
COPY_DBFS_LINK COPY_FROM_DBFS_LINK DBFS_LINK_GENERATE_PATH FRAGMENT_DELETE
FRAGMENT_INSERT FRAGMENT_MOVE FRAGMENT_REPLACE GETCHUNKSIZE
GETCONTENTTYPE GETOPTIONS GET_DBFS_LINK GET_DBFS_LINK_STATE
GET_DEDUPLICATE_REGIONS GET_STORAGE_LIMIT ISSECUREFILE LOADBLOBFROMFILE
LOADCLOBFROMFILE LOADFROMFILE MOVE_TO_DBFS_LINK SETCONTENTTYPE
SETOPTIONS 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, оставшиеся три — свои собственные. У Oracle в свою очередь пакетов 21, тем самым в Tibero не реализованы следующие 13 пакетов:
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 ACOS ASIN ATAN ATAN2
AVG BITAND CEIL COS COSH
COUNT EXP FLOOR LN LOG(M,N)
MOD POWER ROUND SIGN SIN
SINH SQRT TAN TANH TRUNC

Строки
CONCAT CHR LOWER UPPER LPAD
LTRIM RTRIM RPAD SUBSTR REPLACE
INITCAP NLS_INITCAP NLS_SORT TRANSLATE TO_CHAR
ASCII INSTR LENGTH LENGTHB

Даты
+integer -date ADD_MONTHS CURRENT_DATE
CURRENT_TIME CURRENT_TIMESTAMP LAST_DAY NEW_TIME
NEXT_DAY ROUND TRUNC EXTRACT
SYSTIMESTAMP MONTHS_BETWEEN TO_CHAR TO_NUMBER
TO_DATE TO_DSINTERVAL SYSDATE

Служебные
GREATEST LEAST CAST CONVERT
HEXTOCHAR ROWIDTOCHAR TO_CLOB TO_LOB
DECODE DUMP VSIZE COALEASE
LNNVL NULLIF NVL NVL2


Если мы сделаем запрос в all_procedures, то увидим еще функции, но в официальной документации они не упоминаются.

После полученных выше результатов я решил, что загружать сложные пакеты не имеет смысла: скорее всего проблемы будут похожими и будут упираться в нехватку тех или иных пакетов. Но бывают же и простые системы, которые легко обходятся без DBMS пакетов и сложных функций Я решил попробовать оценить с какими проблемами можно столкнуться при переносе таких систем. Для этого я взял Example схему HR.
Она была взята отсюда:
http://www.oracle.com/technetwork/developer-tools/datamodeler/hr-30-ddl-246035.zip
Исполнение этого скрипта выявило не полную поддержу ddl от Oracle.

Проблема №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

Опять таки документации по созданию constraint'ов я не нашел, но на практике, если мы хотим отложенные ограничения, то мы пишем DEFERRABLE, если же мы хотим всегда проверять это ограничение, то не указываем ничего (это значение по умолчанию).

Схема создана, теперь можно и прогнать скрипты для тестирования возможностей СУБД. Скрипты я взял от сюда:
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   

Эта мелочь мне кажется проблемой из-за того, что компания заявляет, что одной из главных направлений их развития является совместимость с Oracle. А совместимость — это не только поддержка качественного кода, но и корректная работа плохого кода. И когда что-то по умолчанию работает в Oracle, то при такой политике логично ожидать работы этого по умолчанию и в Tibero.

Других ошибок из этих скриптов мне получить не удалось. Отдельно проверил pivot, различные нотации join, иерархические запросы: все работает, странно работают pipeline функции и все, что с ними связано. Вот, простой пример:

Проблема №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
Мне оказалось достаточно мучительно пользоваться Explain Plan без dbms_xplan.display .

По итогам тестов, загрузки готовых пакетов и некоторых готовых PL/SQL систем могу сказать, что достаточно простые и легкие системы переносятся хорошо. Все работает, никаких проблем не возникает. Писать на ней с 0 можно и, наверное, вполне успешно. Если, конечно знаешь английский и готов терпеть, что что-то работает на так как в Oracle. В случае же больших систем, как интернет магазин, абс банка, складские систему учета, проблемы наличия пакетов, плохой работы с pipeline делают процесс миграции мучительным и сопряженным с переписыванием готового кода, что не очень приятно и иногда достаточно затратно.

В-целом мне кажется, что у этого продукта есть шанс на выживание. И сейчас уже, как я говорил в первой части есть российские компании, которые с ним работают. Работают там наши парни, а толковой информации на русском языке нет. Поэтому очень хочется, чтобы вокруг данного продукта начало создаваться русскоязычное сообщество людей, которые могут подсказать, помочь или поделиться опытом работы с этой субд Tibero.

P.S. Большой спасибо Петру Житникову за помощь в написании.
Tags:
Hubs:
+6
Comments8

Articles