Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CREATE OR REPLACE PACKAGE PK_DISPOSITIVOS IS
- --function leer_dispositivo(p_url varchar2, p_param varchar2, p_out_resultado OUT varchar2, P_TIPO_SERVICIO VARCHAR2) return varchar2;
- FUNCTION leer_dispositivo(p_url VARCHAR2, p_param VARCHAR2, p_out_resultado OUT VARCHAR2) RETURN VARCHAR2;
- FUNCTION envio_peticion (pdispositivo VARCHAR2, pfuncion NUMBER) RETURN VARCHAR2;
- FUNCTION Envio_Peticion (pdispositivo VARCHAR2, pfuncion NUMBER,p_parametros VARCHAR2 ) RETURN VARCHAR2 ;
- FUNCTION Envio_Peticion (pdispositivo VARCHAR2, pfuncion NUMBER,p_parametros VARCHAR2, p_mensaje VARCHAR2) RETURN VARCHAR2 ;
- FUNCTION Envio_Peticion (pdispositivo VARCHAR2, pfuncion NUMBER,p_parametros VARCHAR2, p_mensaje VARCHAR2,p_respuesta_clob OUT CLOB) RETURN VARCHAR2 ;
- FUNCTION Envio_Peticion (pdispositivo VARCHAR2, pfuncion NUMBER,p_parametros VARCHAR2, p_mensaje VARCHAR2,p_codigo_operacion VARCHAR2,p_respuesta_clob OUT CLOB) RETURN VARCHAR2 ;
- end;
- /
- CREATE OR REPLACE PACKAGE BODY PK_DISPOSITIVOS IS
- function leer_dispositivo(p_url varchar2, p_param varchar2, p_out_resultado OUT varchar2) return varchar2 is
- req UTL_HTTP.REQ;
- resp UTL_HTTP.RESP;
- value VARCHAR2(1024); -- URL to post to
- v_url VARCHAR2(200) ;
- -- Post Parameters
- v_param VARCHAR2(500);
- v_param_length NUMBER := length(v_param);
- v_peso varchar2(100);
- v_xml_clob clob;
- v_xml xmltype;
- v_retorno VARCHAR2 (32767);
- v_send_message CLOB;
- v_resultado VARCHAR2 (30);
- v_conn_req UTL_HTTP.req;
- v_conn_resp UTL_HTTP.resp;
- v_reply_line VARCHAR2 (32767);
- v_reply_message VARCHAR2 (32767);
- v_nombre VARCHAR2 (4000);
- v_valor VARCHAR2 (32767);
- v_respuesta_xml XMLTYPE;
- v_incremento NUMBER := 4000;
- v_trozo VARCHAR2 (4000);
- v_puntero NUMBER := 1;
- v_xml_response CLOB;
- v_estado_respuesta varchar2(100);
- v_resultado_respuesta varchar2(100);
- begin
- BEGIN
- DBMS_LOB.createtemporary (lob_loc => v_xml_clob, CACHE => TRUE);
- DBMS_LOB.append(v_xml_clob,'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://www.example.org/comdisws/"><soapenv:Header/><soapenv:Body>');
- DBMS_LOB.append(v_xml_clob,p_param);
- DBMS_LOB.append(v_xml_clob,'</soapenv:Body></soapenv:Envelope>');
- v_resultado := 'OK';
- v_conn_req := UTL_HTTP.begin_request (p_url, 'POST', 'HTTP/1.1');
- UTL_HTTP.set_transfer_timeout (180);
- UTL_HTTP.set_header (v_conn_req,
- 'Content-Type',
- 'text/xml charset="UTF-8"'
- );
- UTL_HTTP.set_body_charset (v_conn_req, 'UTF-8');
- UTL_HTTP.set_header (v_conn_req,
- 'Content-Length',
- TO_CHAR (LENGTH (v_xml_clob))
- );
- UTL_HTTP.set_header(v_conn_req,'SOAPAction','http://edisa.com/comdisws/mensaje');
- LOOP
- v_trozo := DBMS_LOB.SUBSTR (v_xml_clob, v_incremento, v_puntero);
- v_puntero := v_puntero + v_incremento;
- --pkpantallas.log(v_xml_clob,'trozo',v_trozo);
- UTL_HTTP.write_text (v_conn_req, v_trozo);
- IF (v_puntero > LENGTH (v_xml_clob))
- THEN
- EXIT;
- END IF;
- END LOOP;
- --RECEPCION DE RESPUESTA
- v_conn_resp := UTL_HTTP.get_response (v_conn_req);
- FOR i IN 1 .. UTL_HTTP.get_header_count (v_conn_resp)
- LOOP
- UTL_HTTP.get_header (v_conn_resp, i, v_nombre, v_valor);
- END LOOP;
- DBMS_LOB.createtemporary (lob_loc => v_xml_response, CACHE => TRUE);
- BEGIN
- LOOP
- UTL_HTTP.READ_TEXT (v_conn_resp, v_reply_line,100);
- DBMS_LOB.append (v_xml_response, v_reply_line);
- END LOOP;
- UTL_HTTP.end_response (v_conn_resp);
- EXCEPTION
- WHEN UTL_HTTP.end_of_body
- THEN
- UTL_HTTP.end_response (v_conn_resp);
- END;
- v_respuesta_xml :=xmltype(v_xml_response);
- select extractvalue(
- extract (v_respuesta_xml,
- '//soapenv:Envelope/soapenv:Body/node()','xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"'),
- '//ns1:respuesta/resultado/estado/text()','xmlns:ns1="http://edisa.com/comdisws/"' ) as resultado,
- extractvalue(
- extract (v_respuesta_xml,
- '//soapenv:Envelope/soapenv:Body/node()','xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"'),
- '//ns1:respuesta/resultado/resultado/text()','xmlns:ns1="http://edisa.com/comdisws/"' ) as resultado_respuesta
- into v_resultado,v_resultado_respuesta
- from dual;
- --pkpantallas.log(v_resultado||'-'||v_resultado_respuesta,'v','v');
- p_out_resultado := v_resultado_respuesta;
- EXCEPTION
- WHEN OTHERS
- THEN
- pkpantallas.LOG (SQLERRM,'PK_DISPOSITIVOS','COMUNICA_SERVIDOR_HTTP');
- v_resultado:='ERR';
- --return v_result;
- END;
- return v_resultado;
- EXCEPTION
- WHEN UTL_HTTP.END_OF_BODY THEN
- UTL_HTTP.END_RESPONSE(resp);
- return 'ERR';
- END;
- FUNCTION Envio_Peticion (Pdispositivo VARCHAR2, PFuncion NUMBER,p_parametros VARCHAR2, p_mensaje VARCHAR2,p_codigo_operacion VARCHAR2,p_respuesta_clob OUT CLOB) RETURN VARCHAR2 IS
- v_url VARCHAR2(2000);
- v_peticion VARCHAR2(2000);
- v_datos_envio VARCHAR2(2000);
- v_protocolo VARCHAR2(2000);
- v_chars_envio NUMBER(4);
- v_chars_recibidos NUMBER(4);
- v_paquete VARCHAR2(2000);
- v_lectura VARCHAR2(2000);
- v_rdo VARCHAR2(2000);
- v_funcion_invocacion_java DISPOSITIVOS_SOCKET_DIALOGOS.FUNCION_INVOCACION_JAVA%TYPE;
- v_tipo_servicio DISPOSITIVOS_SOCKET.WS_TIPO%TYPE;
- v_codigo_dispositivo DISPOSITIVOS_SOCKET.CODIGO_DISPOSITIVO%TYPE;
- v_nombre_dispositivo DISPOSITIVOS_SOCKET.NOMBRE_DISPOSITIVO%TYPE;
- v_ip DISPOSITIVOS_SOCKET.DIRECCION_IP%TYPE;
- v_puerto DISPOSITIVOS_SOCKET.PUERTO_SOCKET%TYPE;
- v_timeout NUMBER(10);
- v_clase_implementacion DISPOSITIVOS_SOCKET.CLASE_IMPLEMENTACION_JAVA%TYPE;
- v_clob_respuesta CLOB;
- v_blob_respuesta BLOB;
- v_id_transaccion NUMBER;
- v_out_texto_error VARCHAR2(4000);
- v_funcion_solicitada VARCHAR2(1009);
- v_lectura_xml XMLTYPE;
- BEGIN
- v_url := NULL;
- IF pdispositivo IS NULL OR Pfuncion IS NULL THEN
- pkpantallas.log ('ERROR: No esta definido el dispositivo o la funciĆ³n','PK_DISPOSITIVOS',null);
- RETURN NULL;
- ELSE
- BEGIN
- SELECT url, ws_tipo, codigo_dispositivo,nombre_dispositivo, direccion_ip, puerto_socket, timeout_dialogo*1000,clase_implementacion_java
- INTO v_url, v_tipo_servicio, v_codigo_dispositivo, v_nombre_dispositivo, v_ip, v_puerto, v_timeout,v_clase_implementacion
- FROM dispositivos_socket
- WHERE codigo_dispositivo = Pdispositivo;
- EXCEPTION
- WHEN NO_DATA_FOUND
- THEN
- v_url := NULL;
- END;
- IF v_url IS NOT NULL THEN
- BEGIN
- SELECT datos_envio, texto_protocolo, n_chars_envio, n_chars_recibidos, pkg_interpreta_respuesta,funcion_invocacion_java
- INTO v_datos_envio, v_protocolo, v_chars_envio, v_chars_recibidos, v_paquete,v_funcion_invocacion_java
- FROM dispositivos_socket_dialogos
- WHERE codigo_dispositivo = Pdispositivo
- AND funcion_solicitada = Pfuncion;
- EXCEPTION
- WHEN NO_DATA_FOUND THEN
- v_datos_envio := '';
- END;
- IF v_tipo_servicio = 'SOAP' THEN
- v_peticion :='<com:mensaje><dispositivo>'||Pdispositivo||'</dispositivo><operacion><codigo_operacion>'||NVL(p_codigo_operacion,v_funcion_invocacion_java)||'</codigo_operacion>';
- IF v_datos_envio IS NOT NULL THEN
- v_peticion := v_peticion ||'<datos_envio>'||v_datos_envio||'</datos_envio>';
- END IF;
- IF v_chars_envio IS NOT NULL THEN
- v_peticion := v_peticion ||'<chars_envio>'||TO_CHAR(v_chars_envio)||'</chars_envio>';
- END IF;
- IF v_chars_recibidos IS NOT NULL THEN
- v_peticion := v_peticion ||'<chars_recibido>'||TO_CHAR(v_chars_recibidos)||'</chars_recibido>';
- END IF;
- IF v_protocolo IS NOT NULL THEN
- v_peticion := v_peticion ||'<textos_protocolo>'||v_protocolo||'</textos_protocolo>';
- END IF;
- IF p_parametros IS NOT NULL THEN
- v_peticion := v_peticion ||'<parametros><![CDATA['||p_parametros||']]></parametros>';
- END IF;
- v_peticion := v_peticion||'</operacion></com:mensaje>';
- v_rdo := pk_dispositivos.leer_dispositivo(v_url, v_peticion,v_lectura);
- ELSIF v_tipo_servicio='REST' THEN
- v_peticion :='?'||'id='||v_codigo_dispositivo||chr(38)||
- 'descripcion='||v_nombre_dispositivo||chr(38)||
- 'codigo_operacion='||NVL(p_codigo_operacion,v_funcion_invocacion_java)||chr(38)||
- 'clase_dispositivo='||v_clase_implementacion||chr(38)||
- 'datos_envio='||nvl(p_mensaje,v_datos_envio)||chr(38)||
- 'chars_envio='||to_char(v_chars_envio)||chr(38)||
- 'chars_recibido='||to_char(v_chars_recibidos)||chr(38)||
- 'textos_protocolo='||v_protocolo||chr(38)||
- 'protocolo='||v_protocolo||chr(38)||
- 'modo='||v_protocolo||chr(38)||
- 'ip='||to_char(v_ip)||chr(38)||
- 'puerto='||to_char(v_puerto)||chr(38)||
- 'timeout='||to_char(v_timeout)||chr(38)||
- 'parametros='||p_parametros;
- --pkpantallas.log('ERNEST v_peticion:'||v_peticion);
- --v_rdo:= pk_galileo.comunica_con_servicio_web(v_codigo_dispositivo, null, v_clob_respuesta, v_out_texto_error, PFuncion,v_peticion);
- v_rdo:=PK_GALILEO.COMUNICA_CON_SERVIDOR_HTTP(p_dispositivo_socket=>v_codigo_dispositivo,p_funcion_solicitada=>pfuncion,p_url=>null,p_path_alternativo=>v_peticion,
- p_clob_peticion=>null,p_out_respuesta_clob=>v_clob_respuesta,p_out_respuesta_blob=>v_blob_respuesta,p_out_error=>v_out_texto_error,p_out_id_transaccion=>v_id_transaccion,p_tipo_clob=>'S');
- --pkpantallas.log(v_clob_respuesta);
- --v_lectura:=v_clob_respuesta;
- p_respuesta_clob:=v_clob_respuesta;
- SELECT EXTRACTVALUE(
- EXTRACT (XMLTYPE(v_clob_respuesta),'//soapenv:Envelope/soapenv:Body/node()','xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"'),
- '//ns1:respuesta/resultado/estado/text()','xmlns:ns1="http://edisa.com/comdisws/"' ) as resultado,
- EXTRACTVALUE(
- EXTRACT (XMLTYPE(v_clob_respuesta),'//soapenv:Envelope/soapenv:Body/node()','xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"'),
- '//ns1:respuesta/resultado/resultado/text()','xmlns:ns1="http://edisa.com/comdisws/"' ) as resultado_respuesta
- INTO v_rdo,v_lectura
- FROM dual;
- END IF;
- IF NVL(v_rdo,'MAL') != 'OK' THEN
- pkpantallas.log ('ERROR: No hay respuesta del Web Sercice','PK_DISPOSITIVOS',null);
- RETURN NULL;
- ELSE
- -- Llamar al paquete parametrizado que interpreta la respuesta del dispositivo socket ....
- -- Pendiente
- --pkpantallas.log('Respuesta del dispositivo:'||v_lectura,'PK_DISPOSITIVOS',null);
- IF v_paquete IS NOT NULL THEN
- EXECUTE IMMEDIATE 'begin :resultado := '|| RTRIM (v_paquete)|| ' (:p_parametro); END;'USING OUT v_rdo,IN v_LECTURA;
- RETURN v_rdo;
- ELSE
- RETURN v_lectura;
- END IF;
- END IF;
- ELSE
- pkpantallas.log ('ERROR: No esta definida la url del webservice','PK_DISPOSITIVOS',null);
- RETURN NULL;
- END IF;
- END IF;
- END;
- FUNCTION Envio_Peticion (Pdispositivo VARCHAR2, PFuncion NUMBER,p_parametros VARCHAR2, p_mensaje VARCHAR2,p_respuesta_clob OUT CLOB) RETURN VARCHAR2 IS
- BEGIN
- RETURN envio_peticion(pdispositivo,pfuncion,p_parametros,p_mensaje,NULL,p_respuesta_clob);
- END;
- FUNCTION envio_peticion (Pdispositivo VARCHAR2, PFuncion NUMBER,p_parametros VARCHAR2 , p_mensaje VARCHAR2) RETURN VARCHAR2 IS
- v_clob_respuesta CLOB;
- BEGIN
- RETURN envio_peticion(pdispositivo,pfuncion,p_parametros,p_mensaje,v_clob_respuesta);
- END;
- FUNCTION Envio_Peticion (Pdispositivo Varchar2, PFuncion Number,p_parametros varchar2) RETURN VARCHAR2 IS
- begin
- return envio_peticion(pdispositivo, pfuncion, p_parametros,null);
- end;
- Function Envio_Peticion (Pdispositivo Varchar2, PFuncion Number ) return Varchar2 is
- Begin
- return Envio_Peticion (Pdispositivo , PFuncion ,null,null);
- End;
- end;
- /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement