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

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

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

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

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

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

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

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

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

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

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

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


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

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

Еще учесть надо to_number('3E10')
Учесть надо второй и третий параметр to_number, блин.
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39209533
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Перевод из MS SQL Server в ORACLE
    #39209544
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перевод из MS SQL Server в ORACLE
    #39210808
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возник ещё 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
Перевод из MS SQL Server в ORACLE
    #39210814
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studierenРазве нельзя использовать SYSDATE?RTFM Restrictions on Check Constraints (FAQ)
...
Рейтинг: 0 / 0
25 сообщений из 120, страница 1 из 5
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перевод из MS SQL Server в ORACLE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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