CftClub.ru
Клуб специалистов ЦФТ-Банк

Разименование

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих
Предыдущая тема :: Следующая тема  
Автор Сообщение
storysoft
Участник со стажем


Вступление в Клуб: 18.07.2014
СообщениеСр Июл 30, 2014 16:09   Разименование Ответить с цитатой
Полезность: Нет оценки
Подскажите чем отличается обращение через <.> (точку) и ->
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеЧт Июл 31, 2014 05:38    Ответить с цитатой
Полезность: Нет оценки
-> это приведение к типу например
prod->([PR_CRED])
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеЧт Июл 31, 2014 05:41   Re: Разименование Ответить с цитатой
Полезность: 3
storysoft пишет:
Подскажите чем отличается обращение через <.> (точку) и ->


При обращении через стрелку можно указать внешнее или внутреннее соединение:

a.[ACC_REF]->(false)[NAME]

a - алиас таблицы
a.[ACC_REF] - реквизит этой таблицы, ссылка на AC_FIN
a.[ACC_REF]->(false) - внутреннее соединение (то есть счёт должен существовать обязательно)
a.[ACC_REF]->(false)[NAME] - вытащить наименование счёта

a.[ACC_REF]->(true)[NAME]

- внешнее соединение (то есть если счёт не существует, использовать значение NULL)

Через точку по умолчанию используется внешнее соединение. Однако если к таблице уже использовано внутреннее, замены на внешнее не произойдёт:

a.[ACC_REF]->(false)[NAME] :C_NAME
, a.[ACC_REF].[CODE] :C_CODE -- всё ещё внутреннее соединение

Ещё стрелка используется для преобразования типа.
Например, точно известно, что из счёта А ссылка CLIENT_V - это физ.лицо. А реквизит ссылается на родительский класс CLIENT.
В этом случае допустимо написать, например:

a.[CLIENT_V]->(::[CL_PRIV])[NAME_CL] - реквизит NAME_CL есть только у физиков.

Через точку такого не получится.
Reddom
Участник со стажем


Вступление в Клуб: 25.01.2013
СообщениеЧт Июл 31, 2014 08:16   Re: Разименование Ответить с цитатой
Полезность: Нет оценки
Random пишет:
storysoft пишет:
Подскажите чем отличается обращение через <.> (точку) и ->


При обращении через стрелку можно указать внешнее или внутреннее соединение:


А в чем разница с?:
Код:

for (select a(a.[ACCOUNT](true).[NAME] : x) in ::[DEPN] all) loop
  null;
end loop;

Код:

declare
  cursor c_obj is
    select  a2.C_NAME X
    from Z#AC_FIN a2, Z#DEPN a1
    where a1.C_ACCOUNT=a2.id(+);
  A   c_obj%rowtype;
begin
  for plp$c_obj in c_obj loop
    A := plp$c_obj;
    null;
  end loop;
end;
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеЧт Июл 31, 2014 14:18   Re: Разименование Ответить с цитатой
Полезность: Нет оценки
Reddom пишет:
Random пишет:
storysoft пишет:
Подскажите чем отличается обращение через <.> (точку) и ->


При обращении через стрелку можно указать внешнее или внутреннее соединение:


А в чем разница с?:
Код:

for (select a(a.[ACCOUNT](true).[NAME] : x) in ::[DEPN] all) loop
  null;
end loop;

Код:

declare
  cursor c_obj is
    select  a2.C_NAME X
    from Z#AC_FIN a2, Z#DEPN a1
    where a1.C_ACCOUNT=a2.id(+);
  A   c_obj%rowtype;
begin
  for plp$c_obj in c_obj loop
    A := plp$c_obj;
    null;
  end loop;
end;


Неудачный у вас пример.
Код:

   select a(a.[ACCOUNT].[NAME]      )    in ::[DEPN] into vTmp;

конвертируется в непонятное
            select  a3.C_NAME
            into VTMP
            from Z#ACCOUNT a3, Z#PRODUCT a2, Z#DEPN a1
            where a2.COLLECTION_ID is NULL and a1.id=a2.id and a1.C_ACCOUNT=a3.id(+);


Однако вот другие примеры для сравнения:
Код:

declare
vTmp      varchar2;
begin
   select a(1) in ::[AC_FIN] where nvl(a.[CLIENT_V].[NAME],'jdhf') ='lkdfh' into vTmp; -- внутреннее соединение, так как есть условие на a.CLIENT_V.NAME. Хотя тут явно недоработка парсера - функции над полями надо бы исключать
   select a(1) in ::[AC_FIN] where nvl(a.[CLIENT_V]->(true)[NAME],'jdhf') ='lkdfh' into vTmp; -- внешнее, так как явно указано внешнее
   select a(1) in ::[AC_FIN] where nvl(a.[CLIENT_V]->(false)[NAME],'jdhf') ='lkdfh' into vTmp; -- снова внутреннее, явно указано

   select a(a.[CLIENT_V].[NAME]      )    in ::[AC_FIN] into vTmp; -- а тут по умолчанию внешнее, потому что кто его знает, хотите вы все счета, или только часть. Поэтому по умолчанию предлагаются все
   select a(a.[CLIENT_V]->(true)[NAME])   in ::[AC_FIN] into vTmp; -- внешнее
   select a(a.[CLIENT_V]->(false)[NAME])    in ::[AC_FIN] into vTmp; -- внутреннее, явно указали, что счета, у которых клиентов нет, нафик не нужны
end;


а вот, обратите внимание, тоже бред, но, как говорится, пользователь лучше знает:
Код:

   select a(1) in ::[AC_FIN] where a.[CLIENT_V]->(true)[NAME] ='lkdfh' into vTmp;

трансформируется в

            select  1
            into VTMP
            from Z#CLIENT a2, Z#AC_FIN a1
            where a1.C_CLIENT_V=a2.id(+)
              and (a2.C_NAME = 'lkdfh');


Всё равно все значения, полученные внешним соединением на условии равенства будут исключены, здесь просто напрашивается внутреннее соединение...
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru