помогите

вот сложнее. хотя тоже простенький :


CREATE OR REPLACE PACKAGE fact.pkg_ws_account_execute_ehi
AS
-- пакет содержит процедуры для работы с веб-сервисом WSAccountExecuteEHI16



/*
-= пример сформированного запроса: =-

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsac="http://WSAccountExecuteEHI16.EQ.CS.ws.alfabank.ru">
<soapenv:Header/>
<soapenv:Body>
<wsac:WSAccountExecuteEHIExecuteFactor>
<inCommonParms>
<userID>WSFR</userID>
<branchNumber>0000</branchNumber>
<externalSystemCode>AFACTOR</externalSystemCode>
<externalUserCode>AF</externalUserCode>
</inCommonParms>
<inParms>
<set>FCT1</set> --- Action set константа FCT1. WSTypeChar4
<erf></erf> --- Референс EHI (не заполняется в реквесте, взовращается в респонсе, подставляется в метод Delete для удаления проводки). WSTypeChar16
<type>M</type> --- Тип операции M - моновалютная, C - конверсионная, R - быстрая корр. WSTypeChar1
<brn>MOCO</brn> --- Отделение ввода операции. WSTypeChar4
<pbr>YR1C</pbr> --- Пользователь операции. WSTypeChar5
<vfr>2018-07-11</vfr> --- Дата учёта операции. WSTypeDate
<eand>47803810400000000743</eand> --- Номер счёта Дт операции. WSTypeChar20
<eanc>47401810400000000352</eanc> --- Номер счёта Кт операции. WSTypeChar20
<amd>100</amd> --- Сумма в валюте счёта Дт операции. WSTypeDecimal150
<amc>100</amc> --- Сумма в валюте счёта Кт операции. WSTypeDecimal150
<amnds>0</amnds> --- Сумма НДС операции. /всегода ноль/ WSTypeDecimal150
<nr>описание проводки</nr> --- Содержание операции. WSTypeChar140
<prft>6Ж8</prft> --- tran.profitcentre WSTypeChar3
<dlid>1354081047</dlid> --- номер сделки WSTypeChar32
<tarc>8A7</tarc> --- Допинфо Тарифный сборник операции. WSTypeChar3
</inParms>
</wsac:WSAccountExecuteEHIExecuteFactor>
</soapenv:Body>
</soapenv:Envelope>



-= ответ: =-


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns3:WSAccountExecuteEHIExecuteFactorResponse xmlns:ns3="http://WSAccountExecuteEHI16.EQ.CS.ws.alfabank.ru" xmlns:ns2="http://WSCommonTypes10.CS.ws.alfabank.ru">
<response>
<outCommonParms>
<outCommonParmsExt>
<name>logUID</name>
<value>eqWS11-181022-151724-08374</value>
</outCommonParmsExt>
</outCommonParms>
<outParms>
<erf>FCT1_MAXOVYA0001</erf> --- Референс EHI (не заполняется в реквесте, взовращается в респонсе, подставляется в метод Delete для удаления проводки). WSTypeChar16
</outParms>
</response>
</ns3:WSAccountExecuteEHIExecuteFactorResponse>
</soapenv:Body>
</soapenv:Envelope>

*/



-- function get_response_code (in_rec_tran in cur_tran%rowtype, in_raise integer := const.raise) return varchar2;

PROCEDURE send_entries(in_to_date date);


END pkg_ws_account_execute_ehi;
/


/******************************************************************************/

/********************** PACKAGE BODY *************************************/

/******************************************************************************/


CREATE OR REPLACE PACKAGE BODY fact.pkg_ws_account_execute_ehi
AS

-- cursor cur_tran is select * from tran where classified = 1355740258;

CURSOR cur_tran(in_to_date date)
IS
SELECT /*+ USE_NL(tmpcls,tran,doc) */
tran.classified,
tran.nazn,
tran.docdate,
tran.accdeb,
tran.acccred,
tran.ssum,
tran.profitcentre,
coalesce (to_char (doc.classified), a_fact_getgdnumbyabs (tran.classified), '') dlid, -- номер сделки
decode (reftran.isprofit, 1,
get_com_service_code (a_fact_getisenergy (doc.agmtid), doc.productid, doc.scaner, psb_fact_isfinance (doc.classified)), '') tarc -- тариф
FROM tran
JOIN reftran ON (tran.typetrans = reftran.classified)
LEFT JOIN doc ON (tran.docid = doc.classified)
WHERE tran.typetrans NOT IN (get_reftran ('#FIN'), get_reftran ('#REST'))
AND NOT (getacccode (tran.accdeb) LIKE '40701%' AND getacccode (tran.acccred) LIKE '47423%' AND tran.typetrans = get_reftran('#UDZ#EXPIRATION'))
-- AND tran.classified = 1355740258
AND tran.docdate >= in_to_date -- to_date ('29.10.2018', 'dd.mm.yyyy')
AND tran.erf is null -- если поле tran.erf заполнено - значит проводка уже в EQ
FOR UPDATE OF tran.state, tran.packnum NOWAIT;




-- -----------------------------------------------------------------------------
-- возвращает блок входных параметров XML-запроса веб-серверу
-- располагающийся между тегами <inParms> </inParms>
-- для последующей вставки в полный SOAP-запрос
-- -----------------------------------------------------------------------------
FUNCTION generate_inparams (in_rec_tran IN cur_tran%ROWTYPE)
RETURN XMLTYPE
IS
l_req XMLTYPE;
BEGIN
SELECT xmlelement ("inParms",
xmlforest ('FCT1' AS "set", --- Action set константа FCT1. WSTypeChar4
'' AS "erf", --- Референс EHI (не заполняется в реквесте, взовращается в респонсе). WSTypeChar16
'M' AS "type", --- Тип операции M - моновалютная, C - конверсионная, R - быстрая корр. WSTypeChar1
'MOCO' AS "brn", --- Отделение ввода операции. WSTypeChar4
'YR1C' AS "pbr", --- Пользователь операции. WSTypeChar5
--to_char (in_rec_tran.docdate, 'yyyy-mm-dd') AS "vfr", --- Дата учёта операции. WSTypeDate
'2018-11-19' AS "vfr",
getacccode (in_rec_tran.accdeb) AS "eand", --- Номер счёта Дт операции. WSTypeChar20
getacccode (in_rec_tran.acccred) AS "eanc", --- Номер счёта Кт операции. WSTypeChar20
to_char (in_rec_tran.ssum * 100) AS "amd", --- Сумма в валюте счёта Дт операции. WSTypeDecimal150
to_char (in_rec_tran.ssum * 100) AS "amc", --- Сумма в валюте счёта Кт операции. WSTypeDecimal150
'0' AS "amnds", --- Сумма НДС операции. WSTypeDecimal150
substr (in_rec_tran.nazn, 1, 140) AS "nr", --- Содержание операции. WSTypeChar140
in_rec_tran.profitcentre AS "prft", --- Профит-центр WSTypeChar3
in_rec_tran.dlid AS "dlid", --- номер сделки WSTypeChar32
in_rec_tran.tarc AS "tarc" --- Доп.инфо 'Тарифный сборник' операции
))
INTO l_req
FROM dual;

pkg_debug.put_line ('из ф-ции generate_inparams:' || l_req.getstringval);

RETURN l_req;

exception

when others then pkg_debug.put_line ('ошибка в ф-ции generate_inparams... ' || ' SQLCODE: ' || sqlcode || ' -SQLERRM- ' || sqlerrm);

return (null);

END generate_inparams;




-- --------------------------------------------------------------------------
-- парсит XML-ответ от веб-сервиса
-- если проводка прошла вернется код в тегах <erf>
-- если неудачно - сообщение о причине ошибки в тэгах <faultstring>
-- --------------------------------------------------------------------------
FUNCTION parse_response (in_xml IN SYS.XMLTYPE)
RETURN VARCHAR2
IS
ws_response_error EXCEPTION; -- генерится при отсутствии в респонсе веб-сервиса тэга <erf>
PRAGMA EXCEPTION_INIT (ws_response_error, 100); -- SQLCODE: 100 -SQLERRM- ORA-01403: данные не найдены
l_response_code VARCHAR2 (200); -- tran.erf%type
l_errror_string VARCHAR2 (500)
:= 'ошибка в ф-ции парсинга ответа от веб-сервиса '
|| chr (10)
|| 'pkg_ws_account_execute_ehi.parse_response.'
|| chr (10);
BEGIN
-- pkg_debug.put_line('из ф-ции parse_response: in_xml.getstringval =' || in_xml.getstringval);

SELECT erf INTO l_response_code
FROM xmltable ('//outParms' PASSING (in_xml) COLUMNS erf VARCHAR2 (16) PATH 'erf');

--pkg_debug.put_line('из ф-ции parse_response: l_response_code = ' || l_response_code);

RETURN l_response_code;


EXCEPTION
WHEN ws_response_error THEN
-- в случае ошибки веб-сервис возвращает ответ, содержащий тэг <faultstring> с сообщением о причине ошибки
SELECT faultstring INTO l_response_code
FROM xmltable ('//*:Fault' PASSING (in_xml) COLUMNS faultstring VARCHAR2 (200) PATH 'faultstring');

pkg_debug.put_line ('function parse_response exception: ' || l_response_code);
pkg_debug.put_line (l_errror_string || ' SQLCODE: ' || sqlcode || ' -SQLERRM- ' || sqlerrm);

RETURN l_response_code;

WHEN OTHERS THEN
l_errror_string := l_errror_string || ' SQLCODE: ' || sqlcode || ' -SQLERRM- ' || sqlerrm;
pkg_debug.put_line (l_errror_string);
-- raise_application_error (-20001, l_errror_string);
END parse_response;



--------------------------------------------------------------------------------
-- Возвращает тэг <erf>FCT1_MAXOVYA0001</erf> содержащий код,
-- который можно использовать в запросе для удаления проводки,
-- загрузка которой сгенерировала этот код.
-- В случае ошибки, возвращает код (текст) ошибки
--------------------------------------------------------------------------------
FUNCTION get_response_code (in_rec_tran IN cur_tran%ROWTYPE, in_raise INTEGER := const.raise)
RETURN VARCHAR2
IS
l_params XMLTYPE;
l_response CLOB;
l_response_code VARCHAR2 (200);
BEGIN


l_params := generate_inparams (in_rec_tran);

-- отправляем запрос к веб-сервису и получаем xml-ответ, помещаемый в CLOB
l_response := pkg_ws.send (get_ws_ref ('#WSACCOUNTEXECUTEEHI_EXECUTEFACTOR'), l_params);

-- извлекаем из xml-ответа нужное поле
l_response_code := parse_response (xmltype (l_response));

RETURN l_response_code;
EXCEPTION
WHEN OTHERS
THEN
pkg_debug.put_line ('ошибка в функции get_response_code' || ' SQLCODE: ' || sqlcode || ' -SQLERRM- ' || sqlerrm);
-- raise_application_error ( -20002, 'ошибка в функции get_response_code' || ' SQLCODE: ' || sqlcode || ' -SQLERRM- ' || sqlerrm);
-- if (in_raise = const.raise)
-- then
-- raise;
-- else
return (null);
-- end if;
END get_response_code;



PROCEDURE send_entries(in_to_date DATE)
IS
rec_tran cur_tran%ROWTYPE;
l_response_code VARCHAR2 (200);
t1 PLS_INTEGER;
t2 PLS_INTEGER;
i PLS_INTEGER := 0;
BEGIN
IF cur_tran%ISOPEN THEN CLOSE cur_tran; END IF;

OPEN cur_tran(in_to_date);

LOOP
FETCH cur_tran INTO rec_tran;

t1 := dbms_utility.get_time ();


l_response_code := get_response_code (rec_tran, const.raise);

pkg_debug.put_line ('rec_tran.classified = ' || rec_tran.classified);

UPDATE tran
SET erf = l_response_code
WHERE classified = rec_tran.classified;

i := i + 1;

t2 := dbms_utility.get_time ();
pkg_debug.put_line ('номер операции: ' || i || '; затраченное время: ' || to_char( (t2 - t1)/100) );

EXIT WHEN cur_tran%NOTFOUND;
END LOOP;

CLOSE cur_tran;

pkg_debug.put_line ('l_response_code = ' || l_response_code);
EXCEPTION
WHEN OTHERS
THEN
CLOSE cur_tran;
pkg_debug.put_line ('ошибка в процедуре send_entries' || ' SQLCODE: ' || sqlcode || ' -SQLERRM- ' || sqlerrm);
--raise_application_error (-20003, 'ошибка в процедуре send_entries' || ' SQLCODE: ' || sqlcode || ' -SQLERRM- ' || sqlerrm);
END;
END pkg_ws_account_execute_ehi;
/
Какие мы ранимые) я прикалолась, что поиск любви, а сортировка по цене. Ищешь проститутку?
 
Реализм
-----—

Обычным утром, распахнув глаза
В объятьях чувств раз в сутки повторимых
Услышишь за окном знакомый писк
обычных птиц семейства воробьиных

Борясь со сном ты увлажнишь лицо
Водой изъятой из водопровода,
И внутрь себя привычно поместишь
Набор белков, жиров и углеводов

Привычно же на улицу пойдешь
где на поверхности асфальтовой дороги
в тебя доставят пыль и кислород
обычные воздушные потоки.

Из пункта А в пункт Б переместясь
Достигнешь места, где твое предназначенье
Положенное время повторять
ума и рук стандартные движенья.

Когда к закату двинет желтый диск,
Понизив мощность ультрафиолета,
Обратный путь до дома совершишь
В трамвае предсказуемого цвета.

Унылым вечером, после таких же дней
Под серыми с рожденья небесами
В толпе непримечательных людей
Ты встетишь девушку с обычными глазами

Обмен стандартных слов произведешь
В границах утвержденной парадигмы
И ожидаемо потом произнесешь
банальностью наполненные рифмы.

Разбавив этанолом пустоту
Слегка улучшив мир его парами
Ты удалишься с нею в темноту
Чтоб потереться скучными телами

На грани бодрости и сна мелькнет
Надежда перемен и вдохновленность...
Нет, показалось. После сна пройдёт.
Восторжествует предопределенность.
 
Стандартный набор :-D:-D:-D я последний раз жёстко болела;( не хочу больше
Я тоже не хочу. Но как-то так все время получается. Помню студенческие годы. В кармане 5 рублей. Берешь или две бутылки пива и пакет чипсов или бутылку пива и два пакета чипсов. И часто чипсы перевешивали :)
 
Назад
Сверху Снизу