Oracle 저장 프로시저에서 웹 서비스 액세스
Oracle 저장 프로시저에서 웹 서비스에 성공적으로 액세스한 사람이 있습니까?그렇다면 자바 저장 프로시저였나요?PL/SQL 저장 프로시저?
저장 프로시저에서 WS에 액세스하지 말아야 할 이유가 있습니까?
여기에 지금까지 발견한 몇 가지 참고 자료가 있습니다.
..분명히 말씀드리지만, 이건 SOAP 전화입니다.
우선 어떤 웹 서비스로 전화하시는 건가요?저는 SOAP 또는 REST 둘 중 하나를 가정하고 있습니다.
REST 웹 서비스의 경우 간단한 PL/SQL 저장 프로시저에서 약간의 XPath와 결합하면 UTL_HTTP로 충분한 경우가 많습니다.
SOAP 웹 서비스의 경우 얼마나 정교해야 하는지(또는 원하는 지)에 따라 달라집니다.XQuery를 사용하여 웹 서비스 사양에 맞는 XML 문서를 만들고 UTL_HTTP를 사용하여 문서를 게시하고 응답을 얻은 다음 일부 XPath를 사용하여 PL/SQL에서 응답을 모두 구문 분석할 수 있습니다.이는 비교적 수동적이고 비교적 단순한 솔루션이지만, 소수의 웹 서비스를 말하는 경우에는 최소한의 인프라스트럭처가 필요하므로 통화를 빠르게 통합할 수 있습니다.
시간이 지남에 따라 통화가 발전할 것으로 예상하거나 여러 웹 서비스를 호출하는 여러 절차가 있을 것으로 예상하는 경우 UTL_DBWS와 같은 분야에 시간을 투자하는 것이 합리적일 수 있습니다(그러나 일반적으로 몇 시간 안에 작업을 시작하는 것은 아닙니다).
UTL_HTTP를 편리한 기능으로 간단히 포장할 수 있습니다.
FUNCTION post
(
p_url IN VARCHAR2,
p_data IN CLOB,
p_timeout IN BINARY_INTEGER DEFAULT 60
)
RETURN CLOB
IS
--
v_request utl_http.req;
v_response utl_http.resp;
v_buffer CLOB;
v_chunk VARCHAR2(4000);
v_length NUMBER;
v_index NUMBER;
BEGIN
v_index := 1;
v_length := nvl(length(p_data), 0);
-- configure HTTP
utl_http.set_response_error_check(enable => FALSE);
utl_http.set_detailed_excp_support(enable => FALSE);
utl_http.set_transfer_timeout(p_timeout);
-- send request
v_request := utl_http.begin_request(p_url, 'POST','HTTP/1.0');
utl_http.set_header(v_request, 'Content-Type', 'text/xml');
utl_http.set_header(v_request, 'Content-Length', v_length);
WHILE v_index <= v_length LOOP
utl_http.write_text(v_request, substr(p_data, v_index, 4000));
v_index := v_index + 4000;
END LOOP;
-- check HTTP status code for error
IF v_response.status_code <> utl_http.http_ok THEN
raise_application_error(
cn_http_error,
v_response.status_code || ' - ' || v_response.reason_phrase
);
END IF;
-- get response
dbms_lob.createtemporary(v_buffer, FALSE);
v_response := utl_http.get_response(v_request);
BEGIN
LOOP
utl_http.read_text(v_response, v_chunk, 4000);
dbms_lob.writeappend(v_buffer, length(v_chunk), v_chunk);
END LOOP;
EXCEPTION
WHEN utl_http.end_of_body THEN NULL;
END;
utl_http.end_response(v_response);
RETURN v_buffer;
END;
그렇다면 비누 봉투를 게시하기 위해 무언가가 필요합니다.
FUNCTION invoke
(
p_url IN VARCHAR2,
p_method IN XMLTYPE,
p_timeout IN NUMBER := 60
)
RETURN XMLTYPE
IS
-- calls the given SOAP service
cn_procedure_name CONSTANT VARCHAR2(30) := 'invoke';
--
v_envelope XMLTYPE;
v_response CLOB;
v_fault XMLTYPE;
v_sqlerrm VARCHAR2(2000);
BEGIN
-- wrap method in SOAP envelope
SELECT
XMLElement(
"soap:Envelope",
XMLAttributes(
'http://schemas.xmlsoap.org/soap/envelope/' AS "xmlns:soap"
),
XMLElement(
"soap:Body",
p_method
)
)
INTO
v_envelope
FROM
dual;
-- POST request
v_response := post(
p_url,
'<?xml version="1.0" encoding="ISO-8859-1"?>' || chr(10) || v_envelope.getClobVal(),
p_timeout
);
IF v_response IS NULL THEN
RAISE null_response;
END IF;
-- parse response
BEGIN
v_envelope := XMLType(v_response);
EXCEPTION
WHEN OTHERS THEN
v_sqlerrm := SQLERRM;
RAISE xml_parse_error;
END;
-- check for a fault
v_fault := v_envelope.extract(
'/soap:Envelope/soap:Body/soap:Fault',
'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"'
);
IF v_fault IS NOT NULL THEN
v_sqlerrm := v_fault.extract('.//faultstring/text()').getStringVal();
RAISE soap_fault;
END IF;
-- the actual response is the child of the <soap:Body /> element
RETURN v_envelope.extract(
'/soap:Envelope/soap:Body/*[position() = 1]',
'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"'
);
END;
예제와 특별히 관련이 없으므로 예외 처리 블록을 제거했습니다.
이를 통해 서비스를 호출하고 호출을 통과한 후 반환 값을 구문 분석하는 데 필요한 XML을 생성할 수 있습니다.
우리는 이 솔루션을 9i 데이터베이스에서 개발했기 때문에 UTL_DBWS에 대해서는 아직 알아보지 못했습니다.그래도 잘 되네요.
언급URL : https://stackoverflow.com/questions/299002/access-web-service-from-oracle-stored-procedure
'programing' 카테고리의 다른 글
codeigniter db->delete () returns always true? (0) | 2023.10.16 |
---|---|
ES6+에서 두 개의 자바스크립트 객체를 함께 병합하려면 어떻게 해야 합니까? (0) | 2023.10.16 |
angularjs 및 local스토리지 변경 이벤트 (0) | 2023.10.16 |
null-terminal이 아닌 문자열의 strstr() (0) | 2023.10.16 |
여러 노드 유형에 대해 jstree 마우스 오른쪽 버튼 클릭 상황에 맞는 메뉴 구성 (0) | 2023.10.16 |