Web services 从Oracle触发器调用Webservice

Web services 从Oracle触发器调用Webservice,web-services,plsql,Web Services,Plsql,我试图从数据插入的触发器调用web服务 下面是编写的触发服务调用的触发器 create or replace trigger TRG_EDI_TRANSACTIONS before insert on edi_transactions for each row declare --SOAP REQUESTS/RESPONSE soap_req_msg VARCHAR2(2000); -- HTTP REQUEST/RESPONSE http_req UTL_HTTP.

我试图从数据插入的触发器调用web服务

下面是编写的触发服务调用的触发器

create or replace trigger TRG_EDI_TRANSACTIONS
  before insert on edi_transactions
  for each row
declare
  --SOAP REQUESTS/RESPONSE
  soap_req_msg VARCHAR2(2000);

  -- HTTP REQUEST/RESPONSE
  http_req  UTL_HTTP.req;
  http_resp UTL_HTTP.resp;
  buffer    varchar2(4000);
  PRAGMA AUTONOMOUS_TRANSACTION;
begin

  soap_req_msg := '
               <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:edi="http://edi.hnb.com" xmlns:xsd="http://edi.hnb.com/xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <edi:processEDIData>
         <edi:request>
     <xsd:bankCode>' || :NEW.Bank_Code ||
                  '</xsd:bankCode>
            <xsd:brCode>' || :NEW.Br_Code ||
                  '</xsd:brCode>
            <xsd:cardParticular>' || :NEW.Tran_Particular ||
                  '</xsd:cardParticular>
            <xsd:crncyCode>' || :NEW.Crncy_Code ||
                  '</xsd:crncyCode>
            <xsd:dateStatus>' || :NEW.Date_Status ||
                  '</xsd:dateStatus>
            <xsd:dthInitSolId>' || :NEW.Dth_Init_Sol_Id ||
                  '</xsd:dthInitSolId>
            <xsd:foracid>' || :NEW.Foracid ||
                  '</xsd:foracid>
            <xsd:partTranSrlNum>' ||
                  :NEW.Part_Tran_Srl_Num || '</xsd:partTranSrlNum>
            <xsd:partTranType>' || :NEW.Part_Tran_Type ||
                  '</xsd:partTranType>
            <xsd:pstdDate>' || :NEW.Pstd_Date ||
                  '</xsd:pstdDate>
            <xsd:retry>' || :NEW.Retry ||
                  '</xsd:retry>
            <xsd:solId>' || :NEW.Sol_Id ||
                  '</xsd:solId>
            <xsd:tranAmt>' || :NEW.Tran_Amt ||
                  '</xsd:tranAmt>
            <xsd:tranCrncyCode>' || :NEW.Tran_Crncy_Code ||
                  '</xsd:tranCrncyCode>
            <xsd:tranDate>' || :NEW.Tran_Date ||
                  '</xsd:tranDate>
            <xsd:tranId>' || :NEW.Tran_Id ||
                  '</xsd:tranId>
            <xsd:tranParticular>' || :NEW.Tran_Particular ||
                  '</xsd:tranParticular>
            <xsd:tranRmks>' || :NEW.Tran_Rmks ||
                  '</xsd:tranRmks>
            <xsd:tranSubType>' || :NEW.Tran_Sub_Type ||
                  '</xsd:tranSubType>
            <xsd:tranType>' || :NEW.Tran_Type ||
                  '</xsd:tranType>
            <xsd:trfStatus>' || :NEW.Trf_Status || '</xsd:trfStatus>
         </edi:request>
      </edi:processEDIData>
   </soapenv:Body>
</soapenv:Envelope>
  ';

  http_req := UTL_HTTP.begin_request('http://10.110.6.49:8305/services/prxy_edi_router_svc ',
                                     'POST',
                                     'HTTP/1.1');
  UTL_HTTP.set_header(http_req, 'Accept-Encoding', 'gzip,deflate');
  UTL_HTTP.set_header(http_req, 'Content-Type', 'text/xml');
  utl_http.set_header(http_req, 'SOAPAction', 'processEDIData');
  UTL_HTTP.set_header(http_req, 'Content-Length', length(soap_req_msg));
  UTL_HTTP.set_header(http_req, 'Host', '10.110.6.49:8305');
  UTL_HTTP.set_header(http_req, 'Connection', 'Keep-Alive');
  UTL_HTTP.write_text(http_req, soap_req_msg);

  http_resp := UTL_HTTP.get_response(http_req);

  begin
    loop
      utl_http.read_line(http_resp, buffer);
      dbms_output.put_line(buffer);
    end loop;
    utl_http.end_response(http_resp);
  exception
    when utl_http.end_of_body then
      utl_http.end_response(http_resp);
  end;

end TRG_EDI_TRANSACTIONS;
创建或替换触发器TRG\u EDI\u事务
在edi_交易中插入之前
每行
声明
--SOAP请求/响应
soap_req_msg VARCHAR2(2000年);
--HTTP请求/响应
http_req UTL_http.req;
http_resp UTL_http.resp;
缓冲区varchar2(4000);
布拉格自治交易;
开始
soap_请求_消息:='
“||:新的.Bank|u代码||
'
“||:新的.Br|u代码||
'
“| |”:NEW.Tran|u special||
'
“||:新的.Crncy|u代码||
'
“| |:NEW.Date|u状态||
'
“||:新的.Dth_Init_Sol_Id”||
'
“| |:新的||
'
' ||
:NEW.Part_Tran_Srl_Num|
“| |”:新的.Part|u转换类型||
'
“| |:NEW.Pstd| u日期||
'
“| |:新建。重试||
'
'| |:NEW.Sol|u Id||
'
“| |”:NEW.Tran|u Amt||
'
“| |:新的.Tran_Crncy_代码||
'
“| |:NEW.Tran|u日期||
'
“| |:NEW.Tran_Id”||
'
“| |”:NEW.Tran|u special||
'
“| |:NEW.Tran|Rmks||
'
“||:新的.Tran_子类型”||
'
“| |”:新的.Tran_类型||
'
“||:NEW.Trf|u Status |”
';
http\U请求:=UTL\U http.begin\U请求('http://10.110.6.49:8305/services/prxy_edi_router_svc ',
"岗位",,
“HTTP/1.1”);
UTL_HTTP.set_头(HTTP_-req,'Accept-Encoding','gzip,deflate');
UTL_HTTP.set_头(HTTP_-req,'Content-Type','text/xml');
utl_http.set_头(http_-req,'SOAPAction','processEDIData');
UTL_HTTP.set_头(HTTP_-req,'Content-Length',Length(soap_-req_-msg));
UTL_HTTP.set_头(HTTP_-req,'Host','10.110.6.49:8305');
UTL_HTTP.set_头(HTTP_-req,'Connection','Keep-Alive');
UTL_HTTP.write_text(HTTP_请求,soap_请求消息);
http_resp:=UTL_http.get_响应(http_请求);
开始
环
utl_http.read_行(http_resp,缓冲区);
dbms_output.put_行(缓冲区);
端环;
utl_http.end_响应(http_resp);
例外
当utl_http.end_为_体时
utl_http.end_响应(http_resp);
结束;
结束培训和电子数据交换交易;
有没有办法不等待回应

(与WSO2 ESB中发送请求的“OUT_ONLY”属性类似 并且不期望得到响应)

问题是当我通过触发器调用web服务时,如果web服务关闭,则会发生连接超时,触发器正在等待响应,并且会抛出错误

如果有人能在这方面提供指导,我将不胜感激


Oracle 11.2.0.3.0版。

您可以使用
dbms\u作业。提交
。此包计划和管理作业队列中的作业

  dbms_job.submit(job => my_job, 
    what => 'my_procedure(foo);'
    next_date => sysdate+1,
    interval => 'sysdate+1');

您可以阅读更多信息。

Hi@mkuligowski,感谢您的快速响应,阅读了吗,在my_过程中,似乎也需要等待响应,我正在尝试消除这一点,这似乎像是一种队列机制。@Yasothar您的触发器不会等待作业。作业将只安排在适当的时间内执行,我的_程序将在适当的时间内执行。当然,my_过程必须等待web服务响应,但您的触发器不会。@Yasothar和mkuligowski您有从Oracle触发器调用REST web服务的示例吗?我的要求是,对于特定表、特定列(字符串)上的每个CRUD操作,我应该调用REST webservice。