Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Пожалуйста разъясните  [new]
ORA-600
Member

Откуда:
Сообщений: 96
  1  CREATE OR REPLACE VIEW ANT_S AS
  2  select a.KL,a.KOD,a.OBZN,a.PAR_TIP,a.TIP,a.NAM,a.DATN,a.DATK,a.VSBL
  3    from ant a
  4    join filial b on (b.kl=a.FILIAL)
  5    join firm c on (c.kl=b.FIRMA)
  6  where (a.VSBL='0' and a.FILIAL=cns.get_filial) or
  7         (a.VSBL='1' and c.kl=cns.get_firm) or
  8         (a.VSBL='2' and c.grcp=cns.get_grcp)
  9*  WITH CHECK OPTION
SQL> /

Представление создано.

SQL> select * from user_updatable_columns where table_name='ANT_S'
  2  /

OWNER                          TABLE_NAME                     COLUMN_NAME                    UPD INS DEL
------------------------------ ------------------------------ ------------------------------ --- --- ---
EUGENE                         ANT_S                          KL                             YES YES YES
EUGENE                         ANT_S                          KOD                            YES YES YES
EUGENE                         ANT_S                          OBZN                           YES YES YES
EUGENE                         ANT_S                          PAR_TIP                        YES YES YES
EUGENE                         ANT_S                          TIP                            YES YES YES
EUGENE                         ANT_S                          NAM                            YES YES YES
EUGENE                         ANT_S                          DATN                           YES YES YES
EUGENE                         ANT_S                          DATK                           YES YES YES
EUGENE                         ANT_S                          VSBL                           NO  NO  NO

9 строк выбрано.

SQL> ed
Записано file afiedt.buf

  1  CREATE OR REPLACE VIEW ANT_S AS
  2  select a.KL,a.KOD,a.OBZN,a.PAR_TIP,a.TIP,a.NAM,a.DATN,a.DATK,a.VSBL
  3    from ant a
  4    join filial b on (b.kl=a.FILIAL)
  5    join firm c on (c.kl=b.FIRMA)
  6  where a.VSBL='0' and a.FILIAL=cns.get_filial and
  7         a.VSBL='1' and c.kl=cns.get_firm and
  8         a.VSBL='2' and c.grcp=cns.get_grcp
  9*  WITH CHECK OPTION
SQL> /

Представление создано.

SQL> select * from user_updatable_columns where table_name='ANT_S'
  2  /

OWNER                          TABLE_NAME                     COLUMN_NAME                    UPD INS DEL
------------------------------ ------------------------------ ------------------------------ --- --- ---
EUGENE                         ANT_S                          KL                             YES YES YES
EUGENE                         ANT_S                          KOD                            YES YES YES
EUGENE                         ANT_S                          OBZN                           YES YES YES
EUGENE                         ANT_S                          PAR_TIP                        YES YES YES
EUGENE                         ANT_S                          TIP                            YES YES YES
EUGENE                         ANT_S                          NAM                            YES YES YES
EUGENE                         ANT_S                          DATN                           YES YES YES
EUGENE                         ANT_S                          DATK                           YES YES YES
EUGENE                         ANT_S                          VSBL                           YES YES YES

9 строк выбрано.
почему поле VSBL нельзя изменять в первом случае? и как это побороть?
версия базы 10G
11 сен 08, 13:04    [6173244]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста разъясните  [new]
gggп
Guest
а что второй запрос что должен возвращать? как это может быть a.VSBL='0' and a.VSBL='1'?
11 сен 08, 14:26    [6173859]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста разъясните  [new]
ILoveCoffee
Member

Откуда: Astana
Сообщений: 986
В первом случае было разделено

  1  CREATE OR REPLACE VIEW ANT_S AS
  2  select a.KL,a.KOD,a.OBZN,a.PAR_TIP,a.TIP,a.NAM,a.DATN,a.DATK,a.VSBL
  3    from ant a
  4    join filial b on (b.kl=a.FILIAL)
  5    join firm c on (c.kl=b.FIRMA)
  6  where (a.VSBL='0' and a.FILIAL=cns.get_filial) or
  7         (a.VSBL='1' and c.kl=cns.get_firm) or
  8         (a.VSBL='2' and c.grcp=cns.get_grcp)
  9*  WITH CHECK OPTION
SQL> /
а далее ты обьединил вырожения проверки
CREATE OR REPLACE VIEW ANT_S AS
select a.KL,a.KOD,a.OBZN,a.PAR_TIP,a.TIP,a.NAM,a.DATN,a.DATK,a.VSBL
from ant a
join filial b on (b.kl=a.FILIAL)
join firm c on (c.kl=b.FIRMA)
where 
a.VSBL='0' and a.FILIAL=cns.get_filial 
and
a.VSBL='1' and c.kl=cns.get_firm 
and
a.VSBL='2' and c.grcp=cns.get_grcp
WITH CHECK OPTION
/
зачем ?

Часто путаю F5 и F8 из-за этого долго не могу обновить страницу.
11 сен 08, 14:37    [6173943]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста разъясните  [new]
Elic
Member

Откуда:
Сообщений: 29980
ORA-600
  6  where (a.VSBL='0' and a.FILIAL=cns.get_filial) or
  7         (a.VSBL='1' and c.kl=cns.get_firm) or
  8         (a.VSBL='2' and c.grcp=cns.get_grcp)
  9*  WITH CHECK OPTION

OWNER                          TABLE_NAME                     COLUMN_NAME                    UPD INS DEL
------------------------------ ------------------------------ ------------------------------ --- --- ---
EUGENE                         ANT_S                          VSBL                           NO  NO  NO
почему поле VSBL нельзя изменять в первом случае?
Это условие нельзя преобразовать в CHECK CONDITION так, чтобы можно было однозначно определить, нарушается ли CHECK OPTION значением VSBL или нет. Вот оно и помечается неизменяемым.
IMHO.
11 сен 08, 14:55    [6174100]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста разъясните  [new]
ORA-600
Member

Откуда:
Сообщений: 96
Elic
ORA-600
  6  where (a.VSBL='0' and a.FILIAL=cns.get_filial) or
  7         (a.VSBL='1' and c.kl=cns.get_firm) or
  8         (a.VSBL='2' and c.grcp=cns.get_grcp)
  9*  WITH CHECK OPTION

OWNER                          TABLE_NAME                     COLUMN_NAME                    UPD INS DEL
------------------------------ ------------------------------ ------------------------------ --- --- ---
EUGENE                         ANT_S                          VSBL                           NO  NO  NO
почему поле VSBL нельзя изменять в первом случае?
Это условие нельзя преобразовать в CHECK CONDITION так, чтобы можно было однозначно определить, нарушается ли CHECK OPTION значением VSBL или нет. Вот оно и помечается неизменяемым.
IMHO.

Логика такая если значение поле '0' то проверь по такой функции если '1' то такой а если 2 то третьей
Да я тоже так думаю что нарушается CHECK OPTION, но я не вижу нарушения CHECK OPTION.
Куда я неправильно смотрю.
11 сен 08, 15:09    [6174231]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста разъясните  [new]
ORA-600
Member

Откуда:
Сообщений: 96
ILoveCoffee
В первом случае было разделено
а далее ты обьединил вырожения проверки
зачем ?

Я хотел показать что если заменить Условие AND на OR ORACLE Запрещает DML со столбцом представления. конечно смысла во втором нет никакого мне нужен первый вариант.
11 сен 08, 15:14    [6174278]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста разъясните  [new]
ORA-600
Member

Откуда:
Сообщений: 96
Решил проблему денормализацией БД. хоть и неприятно, а другого выбора пока не нашол
  1  CREATE OR REPLACE VIEW ANT_S AS
  2  select a.KL,a.KOD,a.OBZN,a.PAR_TIP,a.TIP,a.NAM,a.DATN,a.DATK,a.VSBL
  3    from ant a
  4  where (a.VSBL='0' and a.FILIAL=cns.get_filial) or
  5         (a.VSBL='1' and a.FIRMA=cns.get_firm) or
  6         (a.VSBL='2' and a.GRCP=cns.get_grcp)
В этом случае проблем нет. но это не самый интересный вариант
11 сен 08, 15:58    [6174694]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста разъясните  [new]
Elic
Member

Откуда:
Сообщений: 29980
ORA-600
другого выбора пока не нашол
  • instead of trigger
  • FGAC(?)
  • 11 сен 08, 16:02    [6174726]     Ответить | Цитировать Сообщить модератору
    Все форумы / Oracle Ответить