powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Oracle to DB2 Conversion Guide: Compatibility Made Easy
25 сообщений из 72, страница 1 из 3
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39097250
GVF112GVF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FYI ...

Oracle to DB2 Conversion Guide: Compatibility Made Easy -
http://publib-b.boulder.ibm.com/abstracts/sg247736.html?Open

Kind regards,
Vadim.
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39097424
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVF112GVF,

предлагаю выполнить код на Oracle и DB2, сравнить время и предложить сделать что-нибудь, чтобы разница была поменьше.
(этот код взят из HammerDB, и я над ним ещё немного понадругался).

Я знаю, что замена number на integer, bigint и double там, где это имеет смысл, даёт некоторое улучшение, и полагаю, что переписывание кода на DB2-шные inline-функции позволит даже сильно обогнать (именно благодаря инлайнингу). Но если этим не заниматься?

Кстати, нашёл что-то TPC-C-подобное, расчитанное и на DB2: http://sourceforge.net/projects/tpccruner/?source=directory
(сомнительное, правда, потому что написано в стиле типичных Java-программистов - но, с другой стороны, может быть этим и ценно).
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39097565
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Metelitsa,

Я вот пытаюсь перевести базу с Oracle на db2 и ряд вопросов.
(Вроде эту тему можно продолжать ибо она как раз об этом)
Я скачал явовский TPC...а для чего он? в readme написано.

Кстати очень неудобно что нет FAQ как в форуме оракле для новичков,чтобы вхождение было попроще.
(я например научался с поднятием базы(У меня linux) чтоб он порт прослушивал
пока
db2 update dbm cfg using svcename 50000 не сделал.
)

Я присоединился к базе через clpplus
Код: plsql
1.
select user from dual


Почему то не работает.
(погуглив)Надо использовать
Код: plsql
1.
select user from sysibm.sysdummy1


(а я то хотел нахрапом с оракле на db2 вскочить :-) )

И вот помогите понять парадигму(техническую философию).
Понять schema и user.
В оракле если database user имеет таблицы...это уже как schema.

Код: plsql
1.
create user operator identified by pass;




Код: plsql
1.
2.
3.
4.
create user shop identified by pass;
connect shop/pass;
create table goods(.....)
grant select,insert,delete,update on goods to operator;



Код: plsql
1.
2.
connect operator/pass;
select * from shop.goods


Как мне это в db2 повторить сделать.??
гугл про userа в db2 отвечает ,чтотон связан c linux userом...А
схема
https://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000925.html
авторизуется...
Разъясните пожалуйста.
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39097605
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вы создадите базу c Oracle-совместимостью, dual должен быть.
http://www.ibm.com/developerworks/data/library/techarticle/dm-0907oracleappsondb2/index.html

Что касается
Код: sql
1.
select user from sysibm.sysdummy1

,
запрос
Код: sql
1.
values(USER)

более db2-шный путь. (Здесь и далее под DB2 подразумевается DB2 for Linux,Unix,Windows (LUW))
Код: sql
1.
2.
3.
select 1,2,3 from dual
union all
select 4,5,6 from dual


по-db2-шному более удобно записывать как
Код: sql
1.
values(1,2,3),(4,5,6)


и, чтобы два раза не вставать,
Код: sql
1.
2.
3.
update xxx
set a=x,b=y
where c=z and d=t


можно записать как
Код: sql
1.
2.
3.
update xxx
set (a,b)=(x,y)
where (c,d)=(z,t)


А что касается юзеров, в базе их нет и потому create user тоже нет. Юзеров и группы определяют в операционной системе (кстати, для линуха очень большие ограничения в длине имени - 8 символов, преодолели совсем недавно - в DB2 10.5 fixpak 5). Когда коннектитесь (я традиционно использую connect to база user имя using пароль , хотя в ряде случаев работает connect to base - это как в Oracle connect / ), DB2 спрашивает у операционки, есть ли такой с таким паролем, и интересуется также группами, в которых он состоит. Поэтому, в отличие от Oracle, схема и юзер не привязаны друг к другу, можно давать grant'ы несуществующим юзерам, удаление юзера никак не сказывается на базе и т.д. Текущая схема совпадает с именем юзера, её можно менять:
Код: sql
1.
set current schema вашановаятекущаясхема
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39097609
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Инсталляторов DB2 под линухом два (не считая rpm-пакет) - текстовый и GUI-вый. Второй, запускаемый от root'а, делает работу полностью, а первый, насколько я помню, только частично (т.е. он для любителей поэкономить байты и поработать руками). Я пользуюсь вторым.

TPC-C - http://www.tpc.org/tpcc/default.asp
HammerDB - http://www.hammerdb.com/
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39097612
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Metelitsa,
Если вы создадите базу c Oracle-совместимостью, dual должен быть.
http://www.ibm.com/developerworks/data/library/techarticle/dm-0907oracleappsondb2/index.html

Ну я только начинаю..до таких ньюансов ещё не дорос.(кстати? навскидку не увидел как создать с совместимостью dual)

И ещё для чего TPC?

А что касается юзеров, в базе их нет и потому create user тоже нет. Юзеров и группы определяют в операционной системе

Да..я уже до этого допёр...
Я соединяюсь с db2 любым OS юзером.
И это конечно первый "некомильфо".
Бывают случаи ,что надо просто перекинуть файлы базы данных на другой сервер.
В случае с ораклом нет проблем...тут же всё завелось.
а db2 надо учесть внешние зависимости(в частности os users)
А если юзеров много...запаришься создавать.

Помимо этого дополнительные тёрки между linux admin и admin db2...
Так же в нашей КИС привиллигированный пользователь мог созавать из своего сеанса(хоть из австралии) новых database user...
А тут сложность,которую мне предстоит решить.
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39097615
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Metelitsa,
а всё увидел по ссылке выше про tpc
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39097621
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaИнсталляторов DB2 под линухом два (не считая rpm-пакет) - текстовый и GUI-вый. Второй, запускаемый от root'а, делает работу полностью, а первый, насколько я помню, только частично (т.е. он для любителей поэкономить байты и поработать руками). Я пользуюсь вторым.

TPC-C - http://www.tpc.org/tpcc/default.asp
HammerDB - http://www.hammerdb.com/

У меня не было gui инстаоятора(db2 express-c)
после запуска в консоле(кстати порадовало,что на русском сообщения были в консоле..)
у меня создалось
/opt/ibm/V10.5/db2

Я создал пользователя ос db2.
под рутом
db2icrt -a server -u db2 db2

su db2
db2start
db2 update dbm cfg using svcename 50000
clpsqplus
create database db2
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39097718
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dual
http://www.ibm.com/developerworks/data/library/techarticle/dm-0907oracleappsondb2/index.html
ищите в тексте ниже "Enabling to DB2 is as easy as drag and drop", как создавать базу с Oracle-совместимостью.

Коннект любым юзером.
См. по ссылке http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001941.html?cp=SSEPGG_10.5.0/3-6-2-4-21
слово RESTRICTIVE

Перенос юзеров.
а) насколько я понимаю линух, можно даже вырезать кусок файла с юзерами и паролями и вклеить на другой машине (если организационными мерами обеспечить непересекаемость UID и GID; без home-каталогов обойдутся)
б) есть такое слово LDAP - я его не осилил и никогда не пытался, но именно это должно быть ответом на ваш вопрос
в) тёрки с линухадминистратором - это, конечно, плохо, есть море тонкостей, что стоит учесть - что при работе с Oracle, что при работе с DB2, уже даже при начальной установке ОС на сервер, да ещё и до того, а линухадминистраторы, увы...

Инсталляторов в комплекте два - один, вроде бы, db2install, второй db2setup. Был ещё rpm-пакет, где ещё больше ручной работы...
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39097739
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Metelitsa,
Благодарю dual заработал
(Вдруг кому то надо будет)
Надо сделать
db2set DB2_COMPATIBILITY_VECTOR=ORA
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39097753
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DB2_COMPATIBILITY_VECTOR - как и многое, это серьёзная тема, требующая внимательного изучения. Как минимум, если нужна oracle-совместимость, задавайте ORA *до* создания базы.
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39097763
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaDB2_COMPATIBILITY_VECTOR - как и многое, это серьёзная тема, требующая внимательного изучения. Как минимум, если нужна oracle-совместимость, задавайте ORA *до* создания базы.

Да наверное, так и есть ибо ранее синтаксис(Number(1)
Код: plsql
1.
create table test (id number(1));


Не работало.
А после пересоздания заработало.
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39100103
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_al,
Продолжаю изучать совместимость...
Простое..работает
Перешёл к менее банальным вещам.
пакет dbms_sql
Мой оракловый пакет(package body) даже скомпилился...но не отрабатывает.
ошибка.
Спо
Код: html
1.
SQL0286N  A table space could not be found with a page size of at least "4096"


Более того ...беру стандартый пример с сайта ibm
https://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.rtn.doc/doc/r0055145.html#r0055145__desc_tab_dfn?lang=ru
Вот мой код(изменена только 4 строчка select * from table;
(таблица section существует...)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
BEGIN
  DECLARE handle INTEGER;
  DECLARE col_cnt INTEGER;
  DECLARE col DBMS_SQL.DESC_TAB;
  DECLARE i INTEGER DEFAULT 1;
  DECLARE CUR1 CURSOR FOR S1;

  CALL DBMS_SQL.OPEN_CURSOR( handle );
  CALL DBMS_SQL.PARSE( handle, 
      'select * from section', DBMS_SQL.NATIVE );
CALL DBMS_SQL.DESCRIBE_COLUMNS( handle, col_cnt, col );

  IF col_cnt > 0 THEN
    CALL DBMS_OUTPUT.PUT_LINE( 'col_cnt = ' || col_cnt );
    CALL DBMS_OUTPUT.NEW_LINE();
    fetchLoop: LOOP
      IF i > col_cnt THEN
        LEAVE fetchLoop;
      END IF;

      CALL DBMS_OUTPUT.PUT_LINE( 'i = ' || i );
      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_name = ' || col[i].col_name );
      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_name_len = ' || 
          NVL(col[i].col_name_len, 'NULL') );
      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_schema_name = ' || 
          NVL( col[i].col_schema_name, 'NULL' ) );

      IF col[i].col_schema_name_len IS NULL THEN
        CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_schema_name_len = NULL' );
      ELSE
        CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_schema_name_len = ' || 
            col[i].col_schema_name_len);
      END IF;

      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_type = ' || col[i].col_type );
      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_max_len = ' || col[i].col_max_len );
      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_precision = ' || col[i].col_precision );
      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_scale = ' || col[i].col_scale );

      IF col[i].col_charsetid IS NULL THEN
        CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_charsetid = NULL' );
      ELSE
        CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_charsetid = ' || col[i].col_charsetid );
      END IF;

      IF col[i].col_charsetform IS NULL THEN
        CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_charsetform = NULL' );
      ELSE
        CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_charsetform = ' || col[i].col_charsetform );
      END IF;

      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_null_ok = ' || col[i].col_null_ok );
      CALL DBMS_OUTPUT.NEW_LINE();
      SET i = i + 1;
    END LOOP;
  END IF;
END;
/




И получаю ту же ошибку на стандартном примере
Код: plsql
1.
2.
3.
Ошибка рядом со строкой 1:
SQL0286N  A table space could not be found with a page size of at least "4096"
 that authorization ID "DB2" is authorized to use.


Ну как тут может какого-то ресурса не хватать??? ...у меня в этой тестовой базе "пол таблицы и одна восьмая pl/sql кода."
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39100106
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_al,
И тут разобрался...там мелким почерком :-)
Usage notes
This procedure requires a user temporary table space with a page size of 4K; otherwise it returns an SQL0286N error. You can create the user temporary table space with this command:

CREATE USER TEMPORARY TABLESPACE DBMS_SQL_TEMP_TBS
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39100115
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По производительности -
между
create table test (id number(1));
и
create table test (id integer);
может быть существенная разница. Надо смотреть, на что "реальное" DB2-шное этот number смапится, у DB2, в отличие от Oracle, довольно много числовых типов с довольно разной точностью и производительностью.

Между
a) PL/SQL-ной процедурой/функцией (а также и SQL/PL-ной процедурой) и
b) SQL/PL-ной функцией с BEGIN ATOMIC..END (или, ещё лучше, вообще без этих скобок, чисто с одним RETURN)

может быть не просто существенная, а гигантская разница в скорости (во втором случае выражения инлайнятся, и это даёт эту разницу). (Очевидно, часть процедур наверняка можно переписать как функции, даже те, у которых много выходных параметров, и при проблемах с производительность имеет смысл это сделать).

То же самое относится к триггерам - они могут инлайниться или нет, в зависимости от того, как написаны.
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39100611
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_alirbis_al,
И тут разобрался...там мелким почерком :-)
Usage notes
This procedure requires a user temporary table space with a page size of 4K; otherwise it returns an SQL0286N error. You can create the user temporary table space with this command:

CREATE USER TEMPORARY TABLESPACE DBMS_SQL_TEMP_TBS




Вот тут даже не знаю что сказать...вчера "заводской" код отрабатывал (имлй отрабатывал)
сегодня запустил базу и мой код и "заводской примерный" что выше в спойлере.(сюда тоже положу)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
BEGIN
  DECLARE handle INTEGER;
  DECLARE col_cnt INTEGER;
  DECLARE col DBMS_SQL.DESC_TAB;
  DECLARE i INTEGER DEFAULT 1;
  DECLARE CUR1 CURSOR FOR S1;

  CALL DBMS_SQL.OPEN_CURSOR( handle );
  CALL DBMS_SQL.PARSE( handle, 
      'select * from section', DBMS_SQL.NATIVE );
CALL DBMS_SQL.DESCRIBE_COLUMNS( handle, col_cnt, col );

  IF col_cnt > 0 THEN
    CALL DBMS_OUTPUT.PUT_LINE( 'col_cnt = ' || col_cnt );
    CALL DBMS_OUTPUT.NEW_LINE();
    fetchLoop: LOOP
      IF i > col_cnt THEN
        LEAVE fetchLoop;
      END IF;

      CALL DBMS_OUTPUT.PUT_LINE( 'i = ' || i );
      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_name = ' || col[i].col_name );
      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_name_len = ' || 
          NVL(col[i].col_name_len, 'NULL') );
      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_schema_name = ' || 
          NVL( col[i].col_schema_name, 'NULL' ) );

      IF col[i].col_schema_name_len IS NULL THEN
        CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_schema_name_len = NULL' );
      ELSE
        CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_schema_name_len = ' || 
            col[i].col_schema_name_len);
      END IF;

      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_type = ' || col[i].col_type );
      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_max_len = ' || col[i].col_max_len );
      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_precision = ' || col[i].col_precision );
      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_scale = ' || col[i].col_scale );

      IF col[i].col_charsetid IS NULL THEN
        CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_charsetid = NULL' );
      ELSE
        CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_charsetid = ' || col[i].col_charsetid );
      END IF;

      IF col[i].col_charsetform IS NULL THEN
        CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_charsetform = NULL' );
      ELSE
        CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_charsetform = ' || col[i].col_charsetform );
      END IF;

      CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_null_ok = ' || col[i].col_null_ok );
      CALL DBMS_OUTPUT.NEW_LINE();
      SET i = i + 1;
    END LOOP;
  END IF;
END;
/





Выдаёт блин ошибку
Код: html
1.
2.
3.
4.
Ошибка рядом со строкой 1:
SQL0577N  User defined routine "SYSIBMADM.DBMS_SQL.IMP_DESCRIBE_COLUMNS"
(specific name "DBMS_SQL_IMP_DESCRIBE_COLUMNS") attempted to modify data but
 was not defined as MODIFIES SQL DATA.



Вообще не понятно...вчера вечером всё работало ...потушил базу db2stop штатно.
сегодня хотел продолжить изучение..такая лажа.
И на сайте по этой ошибке ничего толком то и нет.

Более того...перелогиниваюсь...запускаю этот же скрипт что выше и уже всё заработало...что за глюки...или я что-то не так делаю.
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39100700
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_al,
Вот ещё небольшой такой взгляд глазами "ораклиста"
Выполняю скрипт
Код: plsql
1.
2.
3.
4.
5.
6.
declare
lclob clob;
begin
lclob:=get_sqllitesript.get_sql('select name from section','section');
end;
/



Получаю ошибку
Код: plsql
1.
2.
3.
SQL0171N  The statement was not processed because the data type, length or value
of the argument for the parameter in position "1" of routine
 "DBMS_LOB.WRITE_CLOB" is incorrect. Parameter name: "LOB_LOC".



И вот "некомильфо" не выдаются весь стек ошибки.
Что где вызывалось на кокой строке в пакете и на какой последней строке в пакете споткнулся.
Оракле бы выдал типа

Код: plsql
1.
2.
3.
4.
error on anonymouse pl/sql blok on line 2
error on get_sqllitesript.get_sql on line 12
error on get_sqllitesript.procone on line 237
error on line 432 on "DBMS_LOB.WRITE_CLOB" 
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39100731
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_al,
По этой проблеме
Ошибка рядом со строкой 1:
SQL0577N User defined routine "SYSIBMADM.DBMS_SQL.IMP_DESCRIBE_COLUMNS"
(specific name "DBMS_SQL_IMP_DESCRIBE_COLUMNS") attempted to modify data but
was not defined as MODIFIES SQL DATA.


Я определил в чём дело.(влруг кто-то за мной из ораклистов будет пытаться переехать,чтоб дважды на грабли не наструпали)

я сделал вначале после запуска
Код: plsql
1.
select @ПРЕЦЕДУРА,что возвращает CLOB@  from dual.


По оракловскому.(я хотел сразу результат увидеть)
В этой процедуре было внутри dbms_sql.describe_cloumn.
Так по-оракловскому db2 не позволяет.
И дальше она блокирует все вызовы dbms_sql.describe_cloumn.(в том числе и штатные)
Пока не сделаешь rollback;
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39102385
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заливаю данные из оракловой базы и столкнулся с проблемой.
У меня есть таблица товаров
В ней есть Символьный уникальный столбец kod и barcode(штрихкод)
И эти столбцы могут быть в определённых записях пустыми.!!!!
(где есть штрихкод там пустой код)
Где есть код там как правило пустое поле штрихкод.
И вместе они могут быть пустыми.

И вот чудеса ,-DB2 меня обязывает,
для того чтобы создать unique constraint мне надо указать что столбец
NOT NULL....что в принципе, нарушает фундаментальную логику моей КИС.

Я погуглил и там советуют сделать unique index....
НО ...в DB2 он создаётся по типу INTEGER,
а у меня эти поля Varchar2. (и numberом их сделать нельзя ибо там есть и символы)
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39102414
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
irbis_al,

И что, вот это не работает?
Код: sql
1.
2.
3.
create table test_uniq(c1 varchar2(10), c2 varchar2(10)) in userspace1;
create unique index test_uniq on test_uniq(c1, c2) exclude null keys;
insert into test_uniq values ('',''), ('', '');
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39102432
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinsteinirbis_al,

И что, вот это не работает?
Код: sql
1.
2.
3.
create table test_uniq(c1 varchar2(10), c2 varchar2(10)) in userspace1;
create unique index test_uniq on test_uniq(c1, c2) exclude null keys;
insert into test_uniq values ('',''), ('', '');



Благодарю получилось
ключевое слово тут exclude null keys;
В оракле такого выражения нет а в гугле что-то не попадалось.
И Вычисляемый столбец рекомендовали и триггер.
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39102443
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тоже не нашёл(возможно плохо искал..но примеры с таким же решением)
Можно ли организовать,чтобы DB2 мне "прокричало" ограничение.
чтоб пользователь сразу знал,где накосячил.
Сейчас мне если уникальный код нарушить отвечает
Код: plsql
1.
 unique constraint or unique index identified by "3"


а уникальный штрихкод нарушить отвечает
Код: plsql
1.
 unique constraint or unique index identified by "4"


цифры 3 и 4 вообще ни о чём не говорят.
Оракле например отвечает типа
Код: html
1.
constraint BARCODEUNIQUE  not valid


Код: html
1.
constraint KODUNIQUE  not valid
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39102467
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
irbis_al,

$ db2 "? SQL0803N"


SQL0803N One or more values in the INSERT statement, UPDATE statement,
or foreign key update caused by a DELETE statement are not valid
because the primary key, unique constraint or unique index
identified by "<index-id>" constrains table "<table-name>" from
having duplicate values for the index key.

Explanation:

The INSERT or UPDATE object table "<table-name>" is constrained by one
or more UNIQUE indexes to have unique values in certain columns or
groups of columns. Alternatively, a DELETE statement on a parent table
caused the update of a foreign key in a dependent table "<table-name>"
that is constrained by one or more UNIQUE indexes. Unique indexes might
support primary keys or unique constraints defined on a table. The
statement cannot be processed because completing the requested INSERT,
UPDATE or DELETE statement would result in duplicate column values. If
the index is on an XML column, the duplicate values for the index key
may be generated from within a single XML document.

Alternatively, if a view is the object of the INSERT or UPDATE
statement, it is the table "<table-name>" on which the view is defined
that is constrained.

If "<index-id>" is an integer value, the index name can be obtained from
SYSCAT.INDEXES by issuing the following query:

SELECT INDNAME, INDSCHEMA
FROM SYSCAT.INDEXES
WHERE IID = <index-id>
AND TABSCHEMA = 'schema'
AND TABNAME = 'table'

where 'schema' represents the schema portion of "<table-name>" and
'table' represents the table name portion of "<table-name>".

Только имена схемы и таблицы в запросе - в верхнем регистре.
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39102641
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_alБлагодарю получилось
ключевое слово тут exclude null keys;
В оракле такого выражения нет а в гугле что-то не попадалось.
И Вычисляемый столбец рекомендовали и триггер.
exclude null keys - для DB2 это довольно новая вещь, поэтому и не попадалось. И в Oracle, конечно, такого нет, потому что там все индексы такие. Кстати, если помните смысл ораклячьего create index ... compess XXX; у DB2 индексы такие по дефолту, т.е. на неуникальном индексе напротив одного index key может лежать куча RID'ов, что может сэкономить кучу места на диске.
...
Рейтинг: 0 / 0
Oracle to DB2 Conversion Guide: Compatibility Made Easy
    #39103490
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день..
Подскажите а что я ещё должен знать для вот такой ситуации ,которая меня напрягла.
У меня не вся таблица товаров залилась в DB2 и я решил удалить.
Код: plsql
1.
delete from table goods


В таблице 20640 записей...совсем немного.
И субъективно заметил ,что db2 (у меня db2 express-c d в режиме compatible=ORA) удаляет уж очень долго.
Провёл эксперимент в бесплатном оракле xe(поставленному по дефолту без натроечного тюнига)
удаляет моментально 0.200 sec.
В db2 express-c тоже поставленной по дефолту(я пока вообще не знаю как её тюнить) более 3х минут .
Что мне тут надо подкрутить?
...
Рейтинг: 0 / 0
25 сообщений из 72, страница 1 из 3
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Oracle to DB2 Conversion Guide: Compatibility Made Easy
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]