Advertisement
Guest User

Untitled

a guest
Jan 26th, 2015
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.76 KB | None | 0 0
  1. CREATE OR REPLACE PACKAGE PK_DISPOSITIVOS IS
  2.  
  3. --function leer_dispositivo(p_url varchar2, p_param varchar2, p_out_resultado OUT varchar2, P_TIPO_SERVICIO VARCHAR2) return varchar2;
  4. FUNCTION leer_dispositivo(p_url VARCHAR2, p_param VARCHAR2, p_out_resultado OUT VARCHAR2) RETURN VARCHAR2;
  5. FUNCTION envio_peticion (pdispositivo VARCHAR2, pfuncion NUMBER) RETURN VARCHAR2;
  6. FUNCTION Envio_Peticion (pdispositivo VARCHAR2, pfuncion NUMBER,p_parametros VARCHAR2 ) RETURN VARCHAR2 ;
  7. FUNCTION Envio_Peticion (pdispositivo VARCHAR2, pfuncion NUMBER,p_parametros VARCHAR2, p_mensaje VARCHAR2) RETURN VARCHAR2 ;
  8. FUNCTION Envio_Peticion (pdispositivo VARCHAR2, pfuncion NUMBER,p_parametros VARCHAR2, p_mensaje VARCHAR2,p_respuesta_clob OUT CLOB) RETURN VARCHAR2 ;
  9. FUNCTION Envio_Peticion (pdispositivo VARCHAR2, pfuncion NUMBER,p_parametros VARCHAR2, p_mensaje VARCHAR2,p_codigo_operacion VARCHAR2,p_respuesta_clob OUT CLOB) RETURN VARCHAR2 ;
  10. end;
  11. /
  12. CREATE OR REPLACE PACKAGE BODY PK_DISPOSITIVOS IS
  13.  
  14.  
  15.  
  16. function leer_dispositivo(p_url varchar2, p_param varchar2, p_out_resultado OUT varchar2) return varchar2 is
  17. req UTL_HTTP.REQ;
  18. resp UTL_HTTP.RESP;
  19. value VARCHAR2(1024); -- URL to post to
  20. v_url VARCHAR2(200) ;
  21. -- Post Parameters
  22. v_param VARCHAR2(500);
  23. v_param_length NUMBER := length(v_param);
  24. v_peso varchar2(100);
  25. v_xml_clob clob;
  26. v_xml xmltype;
  27.  
  28. v_retorno VARCHAR2 (32767);
  29. v_send_message CLOB;
  30. v_resultado VARCHAR2 (30);
  31. v_conn_req UTL_HTTP.req;
  32. v_conn_resp UTL_HTTP.resp;
  33. v_reply_line VARCHAR2 (32767);
  34. v_reply_message VARCHAR2 (32767);
  35. v_nombre VARCHAR2 (4000);
  36. v_valor VARCHAR2 (32767);
  37. v_respuesta_xml XMLTYPE;
  38.  
  39. v_incremento NUMBER := 4000;
  40. v_trozo VARCHAR2 (4000);
  41. v_puntero NUMBER := 1;
  42. v_xml_response CLOB;
  43. v_estado_respuesta varchar2(100);
  44. v_resultado_respuesta varchar2(100);
  45.  
  46. begin
  47. BEGIN
  48.  
  49. DBMS_LOB.createtemporary (lob_loc => v_xml_clob, CACHE => TRUE);
  50. 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>');
  51. DBMS_LOB.append(v_xml_clob,p_param);
  52. DBMS_LOB.append(v_xml_clob,'</soapenv:Body></soapenv:Envelope>');
  53.  
  54. v_resultado := 'OK';
  55. v_conn_req := UTL_HTTP.begin_request (p_url, 'POST', 'HTTP/1.1');
  56. UTL_HTTP.set_transfer_timeout (180);
  57. UTL_HTTP.set_header (v_conn_req,
  58. 'Content-Type',
  59. 'text/xml charset="UTF-8"'
  60. );
  61. UTL_HTTP.set_body_charset (v_conn_req, 'UTF-8');
  62. UTL_HTTP.set_header (v_conn_req,
  63. 'Content-Length',
  64. TO_CHAR (LENGTH (v_xml_clob))
  65. );
  66. UTL_HTTP.set_header(v_conn_req,'SOAPAction','http://edisa.com/comdisws/mensaje');
  67.  
  68. LOOP
  69. v_trozo := DBMS_LOB.SUBSTR (v_xml_clob, v_incremento, v_puntero);
  70. v_puntero := v_puntero + v_incremento;
  71. --pkpantallas.log(v_xml_clob,'trozo',v_trozo);
  72. UTL_HTTP.write_text (v_conn_req, v_trozo);
  73.  
  74. IF (v_puntero > LENGTH (v_xml_clob))
  75. THEN
  76. EXIT;
  77. END IF;
  78. END LOOP;
  79.  
  80. --RECEPCION DE RESPUESTA
  81. v_conn_resp := UTL_HTTP.get_response (v_conn_req);
  82.  
  83. FOR i IN 1 .. UTL_HTTP.get_header_count (v_conn_resp)
  84. LOOP
  85. UTL_HTTP.get_header (v_conn_resp, i, v_nombre, v_valor);
  86. END LOOP;
  87.  
  88. DBMS_LOB.createtemporary (lob_loc => v_xml_response, CACHE => TRUE);
  89. BEGIN
  90. LOOP
  91.  
  92. UTL_HTTP.READ_TEXT (v_conn_resp, v_reply_line,100);
  93. DBMS_LOB.append (v_xml_response, v_reply_line);
  94.  
  95. END LOOP;
  96.  
  97. UTL_HTTP.end_response (v_conn_resp);
  98. EXCEPTION
  99. WHEN UTL_HTTP.end_of_body
  100. THEN
  101.  
  102. UTL_HTTP.end_response (v_conn_resp);
  103. END;
  104.  
  105.  
  106. v_respuesta_xml :=xmltype(v_xml_response);
  107.  
  108. select extractvalue(
  109. extract (v_respuesta_xml,
  110. '//soapenv:Envelope/soapenv:Body/node()','xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"'),
  111. '//ns1:respuesta/resultado/estado/text()','xmlns:ns1="http://edisa.com/comdisws/"' ) as resultado,
  112. extractvalue(
  113. extract (v_respuesta_xml,
  114. '//soapenv:Envelope/soapenv:Body/node()','xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"'),
  115. '//ns1:respuesta/resultado/resultado/text()','xmlns:ns1="http://edisa.com/comdisws/"' ) as resultado_respuesta
  116. into v_resultado,v_resultado_respuesta
  117. from dual;
  118.  
  119. --pkpantallas.log(v_resultado||'-'||v_resultado_respuesta,'v','v');
  120. p_out_resultado := v_resultado_respuesta;
  121. EXCEPTION
  122. WHEN OTHERS
  123. THEN
  124. pkpantallas.LOG (SQLERRM,'PK_DISPOSITIVOS','COMUNICA_SERVIDOR_HTTP');
  125. v_resultado:='ERR';
  126. --return v_result;
  127. END;
  128. return v_resultado;
  129.  
  130. EXCEPTION
  131. WHEN UTL_HTTP.END_OF_BODY THEN
  132. UTL_HTTP.END_RESPONSE(resp);
  133. return 'ERR';
  134.  
  135. END;
  136.  
  137. 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
  138. v_url VARCHAR2(2000);
  139. v_peticion VARCHAR2(2000);
  140. v_datos_envio VARCHAR2(2000);
  141. v_protocolo VARCHAR2(2000);
  142. v_chars_envio NUMBER(4);
  143. v_chars_recibidos NUMBER(4);
  144. v_paquete VARCHAR2(2000);
  145. v_lectura VARCHAR2(2000);
  146. v_rdo VARCHAR2(2000);
  147. v_funcion_invocacion_java DISPOSITIVOS_SOCKET_DIALOGOS.FUNCION_INVOCACION_JAVA%TYPE;
  148. v_tipo_servicio DISPOSITIVOS_SOCKET.WS_TIPO%TYPE;
  149. v_codigo_dispositivo DISPOSITIVOS_SOCKET.CODIGO_DISPOSITIVO%TYPE;
  150. v_nombre_dispositivo DISPOSITIVOS_SOCKET.NOMBRE_DISPOSITIVO%TYPE;
  151. v_ip DISPOSITIVOS_SOCKET.DIRECCION_IP%TYPE;
  152. v_puerto DISPOSITIVOS_SOCKET.PUERTO_SOCKET%TYPE;
  153. v_timeout NUMBER(10);
  154. v_clase_implementacion DISPOSITIVOS_SOCKET.CLASE_IMPLEMENTACION_JAVA%TYPE;
  155. v_clob_respuesta CLOB;
  156. v_blob_respuesta BLOB;
  157. v_id_transaccion NUMBER;
  158. v_out_texto_error VARCHAR2(4000);
  159. v_funcion_solicitada VARCHAR2(1009);
  160. v_lectura_xml XMLTYPE;
  161.  
  162. BEGIN
  163.  
  164. v_url := NULL;
  165.  
  166. IF pdispositivo IS NULL OR Pfuncion IS NULL THEN
  167. pkpantallas.log ('ERROR: No esta definido el dispositivo o la funciĆ³n','PK_DISPOSITIVOS',null);
  168. RETURN NULL;
  169. ELSE
  170. BEGIN
  171. SELECT url, ws_tipo, codigo_dispositivo,nombre_dispositivo, direccion_ip, puerto_socket, timeout_dialogo*1000,clase_implementacion_java
  172. INTO v_url, v_tipo_servicio, v_codigo_dispositivo, v_nombre_dispositivo, v_ip, v_puerto, v_timeout,v_clase_implementacion
  173. FROM dispositivos_socket
  174. WHERE codigo_dispositivo = Pdispositivo;
  175. EXCEPTION
  176. WHEN NO_DATA_FOUND
  177. THEN
  178. v_url := NULL;
  179. END;
  180.  
  181. IF v_url IS NOT NULL THEN
  182. BEGIN
  183. SELECT datos_envio, texto_protocolo, n_chars_envio, n_chars_recibidos, pkg_interpreta_respuesta,funcion_invocacion_java
  184. INTO v_datos_envio, v_protocolo, v_chars_envio, v_chars_recibidos, v_paquete,v_funcion_invocacion_java
  185. FROM dispositivos_socket_dialogos
  186. WHERE codigo_dispositivo = Pdispositivo
  187. AND funcion_solicitada = Pfuncion;
  188. EXCEPTION
  189. WHEN NO_DATA_FOUND THEN
  190. v_datos_envio := '';
  191. END;
  192.  
  193. IF v_tipo_servicio = 'SOAP' THEN
  194. v_peticion :='<com:mensaje><dispositivo>'||Pdispositivo||'</dispositivo><operacion><codigo_operacion>'||NVL(p_codigo_operacion,v_funcion_invocacion_java)||'</codigo_operacion>';
  195.  
  196. IF v_datos_envio IS NOT NULL THEN
  197. v_peticion := v_peticion ||'<datos_envio>'||v_datos_envio||'</datos_envio>';
  198. END IF;
  199.  
  200. IF v_chars_envio IS NOT NULL THEN
  201. v_peticion := v_peticion ||'<chars_envio>'||TO_CHAR(v_chars_envio)||'</chars_envio>';
  202. END IF;
  203.  
  204. IF v_chars_recibidos IS NOT NULL THEN
  205. v_peticion := v_peticion ||'<chars_recibido>'||TO_CHAR(v_chars_recibidos)||'</chars_recibido>';
  206. END IF;
  207.  
  208. IF v_protocolo IS NOT NULL THEN
  209. v_peticion := v_peticion ||'<textos_protocolo>'||v_protocolo||'</textos_protocolo>';
  210. END IF;
  211.  
  212. IF p_parametros IS NOT NULL THEN
  213. v_peticion := v_peticion ||'<parametros><![CDATA['||p_parametros||']]></parametros>';
  214. END IF;
  215.  
  216. v_peticion := v_peticion||'</operacion></com:mensaje>';
  217.  
  218. v_rdo := pk_dispositivos.leer_dispositivo(v_url, v_peticion,v_lectura);
  219.  
  220. ELSIF v_tipo_servicio='REST' THEN
  221. v_peticion :='?'||'id='||v_codigo_dispositivo||chr(38)||
  222. 'descripcion='||v_nombre_dispositivo||chr(38)||
  223. 'codigo_operacion='||NVL(p_codigo_operacion,v_funcion_invocacion_java)||chr(38)||
  224. 'clase_dispositivo='||v_clase_implementacion||chr(38)||
  225. 'datos_envio='||nvl(p_mensaje,v_datos_envio)||chr(38)||
  226. 'chars_envio='||to_char(v_chars_envio)||chr(38)||
  227. 'chars_recibido='||to_char(v_chars_recibidos)||chr(38)||
  228. 'textos_protocolo='||v_protocolo||chr(38)||
  229. 'protocolo='||v_protocolo||chr(38)||
  230. 'modo='||v_protocolo||chr(38)||
  231. 'ip='||to_char(v_ip)||chr(38)||
  232. 'puerto='||to_char(v_puerto)||chr(38)||
  233. 'timeout='||to_char(v_timeout)||chr(38)||
  234. 'parametros='||p_parametros;
  235.  
  236. --pkpantallas.log('ERNEST v_peticion:'||v_peticion);
  237. --v_rdo:= pk_galileo.comunica_con_servicio_web(v_codigo_dispositivo, null, v_clob_respuesta, v_out_texto_error, PFuncion,v_peticion);
  238. 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,
  239. 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');
  240. --pkpantallas.log(v_clob_respuesta);
  241. --v_lectura:=v_clob_respuesta;
  242. p_respuesta_clob:=v_clob_respuesta;
  243. SELECT EXTRACTVALUE(
  244. EXTRACT (XMLTYPE(v_clob_respuesta),'//soapenv:Envelope/soapenv:Body/node()','xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"'),
  245. '//ns1:respuesta/resultado/estado/text()','xmlns:ns1="http://edisa.com/comdisws/"' ) as resultado,
  246. EXTRACTVALUE(
  247. EXTRACT (XMLTYPE(v_clob_respuesta),'//soapenv:Envelope/soapenv:Body/node()','xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"'),
  248. '//ns1:respuesta/resultado/resultado/text()','xmlns:ns1="http://edisa.com/comdisws/"' ) as resultado_respuesta
  249. INTO v_rdo,v_lectura
  250. FROM dual;
  251. END IF;
  252.  
  253.  
  254. IF NVL(v_rdo,'MAL') != 'OK' THEN
  255. pkpantallas.log ('ERROR: No hay respuesta del Web Sercice','PK_DISPOSITIVOS',null);
  256. RETURN NULL;
  257. ELSE
  258. -- Llamar al paquete parametrizado que interpreta la respuesta del dispositivo socket ....
  259. -- Pendiente
  260. --pkpantallas.log('Respuesta del dispositivo:'||v_lectura,'PK_DISPOSITIVOS',null);
  261. IF v_paquete IS NOT NULL THEN
  262. EXECUTE IMMEDIATE 'begin :resultado := '|| RTRIM (v_paquete)|| ' (:p_parametro); END;'USING OUT v_rdo,IN v_LECTURA;
  263. RETURN v_rdo;
  264. ELSE
  265. RETURN v_lectura;
  266. END IF;
  267. END IF;
  268. ELSE
  269.  
  270. pkpantallas.log ('ERROR: No esta definida la url del webservice','PK_DISPOSITIVOS',null);
  271. RETURN NULL;
  272. END IF;
  273.  
  274. END IF;
  275. END;
  276.  
  277. FUNCTION Envio_Peticion (Pdispositivo VARCHAR2, PFuncion NUMBER,p_parametros VARCHAR2, p_mensaje VARCHAR2,p_respuesta_clob OUT CLOB) RETURN VARCHAR2 IS
  278. BEGIN
  279. RETURN envio_peticion(pdispositivo,pfuncion,p_parametros,p_mensaje,NULL,p_respuesta_clob);
  280. END;
  281.  
  282. FUNCTION envio_peticion (Pdispositivo VARCHAR2, PFuncion NUMBER,p_parametros VARCHAR2 , p_mensaje VARCHAR2) RETURN VARCHAR2 IS
  283. v_clob_respuesta CLOB;
  284. BEGIN
  285. RETURN envio_peticion(pdispositivo,pfuncion,p_parametros,p_mensaje,v_clob_respuesta);
  286. END;
  287.  
  288. FUNCTION Envio_Peticion (Pdispositivo Varchar2, PFuncion Number,p_parametros varchar2) RETURN VARCHAR2 IS
  289. begin
  290. return envio_peticion(pdispositivo, pfuncion, p_parametros,null);
  291. end;
  292.  
  293. Function Envio_Peticion (Pdispositivo Varchar2, PFuncion Number ) return Varchar2 is
  294. Begin
  295. return Envio_Peticion (Pdispositivo , PFuncion ,null,null);
  296. End;
  297.  
  298.  
  299. end;
  300. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement