Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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');
|
Всё равно все значения, полученные внешним соединением на условии равенства будут исключены, здесь просто напрашивается внутреннее соединение... |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|