Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перевод из MS SQL Server в ORACLE / 25 сообщений из 120, страница 1 из 5
06.04.2016, 14:12
    #39209269
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
Добрый день господа!

Стоит задача у меня: перевести готовую базу из MS SQL Server в ORACLE. Я очень и очень плохо знаю ORACLE, не все получается.
Есть несколько вопросов.

Как я понимаю в Oracle нет функции ISNUMERIC. Написал собственную функцию.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR REPLACE Function dbo.f_IsNumeric (Expression Varchar)
    Return Number Is X Number(1, 0);
Begin
    If Length(
        Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Expression,
            '0', ''), '1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', '')) = 0 Then
        X := 1;
    Else
        X := 0;
    End If;

    Return (X);
End;


Может есть попроще? Функция проверяет только целые числа, пока мне и этого достаточно.

В MS SQL Server можно создать скалярную функцию (не знаю как называется в Oracle), которую можно использовать в Constraint, чтобы ставить ограничение при вводе данных. Можно ли и в Oracle использовать собственную функцию?
Попробовал вот так по аналогию с MS SQL Server. Не получается.
Код: plsql
1.
2.
ALTER TABLE Table1 ADD  CONSTRAINT CK_Table1 CHECK 
(dbo.f_IsNumeric (Field1)=1)



Спасибо заранее за подсказку / ссылку и т.п.
...
Рейтинг: 0 / 0
06.04.2016, 14:14
    #39209271
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
studieren,
может стоит научиться пользоваться поиском? тогда и писать надо будет меньше...
...
Рейтинг: 0 / 0
06.04.2016, 14:16
    #39209273
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
Vint,

Искал. Не нашёл. Поэтому написал.
Если знаете как в constraint использовать собственную функцию подскажите please.
...
Рейтинг: 0 / 0
06.04.2016, 14:19
    #39209275
Anatoly B
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
studieren,
авторИскал. Не нашёл
https://community.oracle.com/thread/373057?start=0
...
Рейтинг: 0 / 0
06.04.2016, 14:22
    #39209280
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
...
Рейтинг: 0 / 0
06.04.2016, 14:24
    #39209285
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
Anatoly B,

Спасибо за ссылку, но там нет то, что я ищу.
Как в constraint использовать собственную функцию?
...
Рейтинг: 0 / 0
06.04.2016, 14:25
    #39209287
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
studierenМожно ли и в Oracle использовать собственную функцию?
В Oracle можно объявить поле типа NUMBER и оно автоматически будет ограничено только числами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.04.2016, 14:27
    #39209292
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
Vintstudieren,
звиздиш. ленивый нуб.
Ну и где же написано как можно применить собственную функцию в constraint?
...
Рейтинг: 0 / 0
06.04.2016, 14:28
    #39209296
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
Dimitry SibiryakovstudierenМожно ли и в Oracle использовать собственную функцию?
В Oracle можно объявить поле типа NUMBER и оно автоматически будет ограничено только числами.

К сожалению не могу. Там 9-значные цифры, первая цифра "0". Если объявить как число, то первый символ пропадёт.
...
Рейтинг: 0 / 0
06.04.2016, 14:31
    #39209306
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
В check-констрейнте нельзя использовать самописные функции
Но тебе достаточно TRANSLATE
...
Рейтинг: 0 / 0
06.04.2016, 14:34
    #39209310
MakeSure
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
Почему бы просто не создать поле с типом NUMBER?

translate в помощь по поводу цифр в строке.
У Check constraint есть ограничения, например, нельзя использовать самописные функции. А вот засутить translate в сам констрэинт можно.
...
Рейтинг: 0 / 0
06.04.2016, 14:36
    #39209313
MakeSure
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
Забыл обновиться =\
...
Рейтинг: 0 / 0
06.04.2016, 14:37
    #39209319
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
studierenК сожалению не могу. Там 9-значные цифры, первая цифра "0". Если объявить
как число, то первый символ пропадёт.
Это всего лишь проблема форматирования при выводе.

Но даже если держать это значение как строку, пользовательская функция не нужна пока есть
regexp_like. Достаточно научиться писать регэкспы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.04.2016, 14:42
    #39209324
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
Вячеслав ЛюбомудровВ check-констрейнте нельзя использовать самописные функции
Но тебе достаточно TRANSLATE

Dimitry SibiryakovЭто всего лишь проблема форматирования при выводе.

Но даже если держать это значение как строку, пользовательская функция не нужна пока есть
regexp_like. Достаточно научиться писать регэкспы.
Спасибо за наводку, не знал что нельзя. Сейчас попробую TRANSLATE или regexp_like.
...
Рейтинг: 0 / 0
06.04.2016, 14:54
    #39209338
р/лтрим
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
studieren,

(само)введение в заблкждение. лидирующий ноль означает, что данные у тебя не число, а строка, состоящая из цифр. и msный isnumeric не обеспечивает проверки, что строка из только цифр.
...
Рейтинг: 0 / 0
06.04.2016, 15:26
    #39209384
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
studieren,

Посмотрите эти продукты
- Database Migration Guide (12с)
- 2. SQL Developer: Migrating Third-Party Databases
...
Рейтинг: 0 / 0
06.04.2016, 15:36
    #39209400
MakeSure
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
Пост "р/лтрим" сфокусировал правильно вопрос.

Должно быть быстрее так (да и учитывает не только целые числа):
Код: plsql
1.
nvl(1,to_number(rec.a)) = 1 
...
Рейтинг: 0 / 0
06.04.2016, 15:40
    #39209406
Перевод из MS SQL Server в ORACLE
MakeSure
Код: plsql
1.
nvl(1,to_number(rec.a)) = 1 


К сожалению, это нестабильный код, поскольку зависит от окружения сессии.
Конкретно - от NLS_NUMERIC_CHARACTERS
Поправить - просто, примеров на форуме - мульон, особенно от нашего официального тирана Elic
...
Рейтинг: 0 / 0
06.04.2016, 15:46
    #39209414
MakeSure
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
Преобразователь Неявный,
само собой по нлс параметры надо позаботиться.
Я, в целом, о том, что транслэйт тут будет значительно медленней, чем to_number. К тому же to_number вызовет ошибку более читабельную.
...
Рейтинг: 0 / 0
06.04.2016, 16:08
    #39209445
MakeSure
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
UPD

Еще учесть надо to_number('3E10')
...
Рейтинг: 0 / 0
06.04.2016, 16:11
    #39209450
Перевод из MS SQL Server в ORACLE
MakeSureUPD

Еще учесть надо to_number('3E10')
Учесть надо второй и третий параметр to_number, блин.
...
Рейтинг: 0 / 0
06.04.2016, 17:34
    #39209533
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
Код: 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.
SQL> create table tbl(
  2                   numeric_string varchar2(4000)
  3                  )
  4  /

Table created.

SQL> create index is_number
  2    on tbl(
  3           to_number(numeric_string)
  4          )
  5  /

Index created.

SQL> insert into tbl values('-1.5');

1 row created.

SQL> insert into tbl values('XYZ');
insert into tbl values('XYZ')
*
ERROR at line 1:
ORA-01722: invalid number


SQL> insert into tbl values(lpad('1',200,'1'));
insert into tbl values(lpad('1',200,'1'))
*
ERROR at line 1:
ORA-01426: numeric overflow


SQL>  



Код: 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.
SQL> create table tbl(
  2                   numeric_string varchar2(4000)
  3                  )
  4  /

Table created.

SQL> alter table tbl
  2    add constraint tbl_chk1
  3      check(
  4            to_number(numeric_string) - to_number(numeric_string) = 0
  5           )
  6  /

Table altered.

SQL> insert into tbl values('-1.5');

1 row created.

SQL> insert into tbl values('XYZ');
insert into tbl values('XYZ')
           *
ERROR at line 1:
ORA-01722: invalid number


SQL> insert into tbl values(lpad('1',200,'1'));
insert into tbl values(lpad('1',200,'1'))
           *
ERROR at line 1:
ORA-01426: numeric overflow


SQL> 



SY.
...
Рейтинг: 0 / 0
06.04.2016, 17:49
    #39209544
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
SY
Код: plsql
1.
2.
3.
4.
5.
6.
SQL> insert into tbl values('XYZ');
insert into tbl values('XYZ')

*
ERROR at line 1:
ORA-01722: invalid number



SY.плохо, что ошибка неявная и х.з. где возникает
через год юзверь позвонит в полтретьего ночи - че за фигня? потом хрен вспомнишь, что это твой же констрейнт по его же ТЗ
...
Рейтинг: 0 / 0
08.04.2016, 10:35
    #39210808
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
Возник ещё 1 вопрос. Хотел установить ограничение на дату документа (запретить на ввод будущей даты). Запускаю скрипт, а ORCLE ругается:
Код: plsql
1.
2.
3.
alter table dbo.Table1
  add constraint CK_Table1_DocDate
  check (DocDate <= trunc(sysdate));


Ругается так:
Oracle Error: ORA-02436
Date or system variable wrongly specified in CHECK constraint


А как надо было написать? Разве нельзя использовать SYSDATE?
...
Рейтинг: 0 / 0
08.04.2016, 10:38
    #39210814
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из MS SQL Server в ORACLE
studierenРазве нельзя использовать SYSDATE?RTFM Restrictions on Check Constraints (FAQ)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перевод из MS SQL Server в ORACLE / 25 сообщений из 120, страница 1 из 5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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