Как сделать запрос с явными преобразованиями типов данных?
Есть запрос, но мне сказали сделать его с явными преобразованиями типом данных.
Подскажите, как сделать и куда смотреть в этом случае?
select
CMS.ARTICLE, CMS.name
from supermag.smcard cms
left join (
SELECT ost.ARTICLE, sum (OST.QUANTITY) quanto
from supermag.SMGOODS ost
GROUP BY ost.ARTICLE) ost on (ost.ARTICLE=CMS.ARTICLE and OST.QUANTO=0)
LEFT JOIN (
SELECT logi.article
FROM supermag.SMCARDSECURITYLOG logi
where logi.ACTIONCODE = 1
and logi.EVENTTIME between (RepSqlText.ToSqlDate(sLastDate))-90
and RepSqlText.ToSqlDate(sLastDate)) n on (n.article=cms.article)
LEFT JOIN (
SELECT reps.article
from supermag.FFMAPREP reps
where reps.saletype NOT IN ('WI', 'WO', 'IW', 'CS', 'CR', 'PO', 'PN', 'PE')
and REPS.SALEDATE between RepSqlText.ToSqlDate(sFirstDate)
and RepSqlText.ToSqlDate(sLastDate)) reps on (reps.ARTICLE=CMS.ARTICLE)
where CMS.ARTICLE=OST.ARTICLE
and OST.QUANTO is not null
and cms.ACCEPTED=1
and n.article is null
and reps.article is null
GROUP BY CMS.ARTICLE, cms.Name
Ответы (1 шт):
но мне сказали сделать его с явным типом преобразований
Те, кто это сказал, имели ввиду следующее.
Во первых, ознакомится и понять разницу между явным и неявным преобразованием типов данных. В этой гл. в первых строчках перечисленно, почему предпочтительно использовать явные преобразования.
Oracle recommends that you specify explicit conversions, rather than rely on implicit or automatic conversions [...]
Например, в следующем запросе все преобразования неявные и он рабочий:
create table tab (numcol int, chrcol varchar2 (8), datcol date)
/
create or replace function foo (val varchar2) return varchar2 is
begin return val;
end;
/
select numcol, chrcol, datcol--to_char (datcol, 'dd.mm.yyyy hh24:mi')
from tab
where numcol = '123'
and chrcol = foo (567)
and trunc (datcol) = '29.04.2021'
/
no rows selected
Но при изменении настроек/параметров сессии или БД, запрос выше, в лучшем случае, выдаст ошибку, а в худшем, даст неверный результат, который нарушит логику приложения его вызвавшего.
В следующем примере этого не случится:
select numcol, chrcol, to_char (datcol, 'dd.mm.yyyy hh24:mi') datcol
from tab
where numcol = to_number ('123', 'fm99999999')
and chrcol = foo (to_char (567, 'fm99999999'))
and trunc (datcol) = to_date ('29.04.2021', 'dd.mm.yyyy hh24:mi')
/
no rows selected
Аналогично примерам выше, найдите все неявные преобразования в запросе из вопроса, замените их явными, и задача будет успешно решена.