Userenv terminal

He migrado una aplicación de la 4.5 a la 9i y me he encontrado con el siguiente problema, resulta que en la 4.5 las formas tenían puesto el nombre de la maquina cliente correspondiente, esto lo sacaban al cargar la forma con la siguiente sentencia:
Select SYS_CONTEXT('USERENV', 'TERMINAL') FROM DUAL;
Pero en la 9i no tira, no retorna ningún valor, con 'HOST' me retorna el nombre del servidor.
¿Sabes cómo puedo sacar el nombre de la maquina cliente en la 9i?

1 Respuesta

Respuesta
1
Porque Developer Forms a partir de la versión 6i esta basado en required support files 8.0.6 usted no puede escribir la sentencia dual
que menciona ddirectamente en un program unit o trigger de forms. Usted debe crear una función en la base de datos y llamarla desde forms.
Un ejemplo de stored function puede ser:
CREATE OR REPLACE Function pantalla RETURN Varchar2 IS v_pant Varchar2(30); Begin
Select SYS_CONTEXT('USERENV','TERMINAL') Into v_pant From Dual; Return v_pant;
End;
Esta función solo sirve para ser utilizada desde la sesión del cliente. Cuando se ejecuta desde el servidor la respuesta sera nula.
Se puede obtener Instance name (y Host name) desde V$INSTANCE, y Database name desde V$DATABASE.
Lo lamento pero así funciona Oracle (por seguridad pienso yo)
ARA
Hola,
Lo primero agradecerte tu interés y rapidez. He creado esa función en la base de datos y la he llamado desde forms, cuando ejecuto el forms que tengo en mi equipo me retorna correctamente el nombre de mi maquina, pero cuando este mismo forms lo llevo al servidor y lo ejecuto desde mi equipo no me retorna nada, ¿sabes por qué puede ser?
Hola,
Perdona mi torpeza e ignorancia, he estado mirando por ahí pero no veo claro como meter lo de V$INSTANCE en código pl/sql para averiguar el Host name, ¿podrías ponerme algunas lineas como ejemplo?.
Gracias.
La verdad es que analizando detenidamente el uso de v_$instance necesitarías brindarle permiso de dba lo cual complicaría el asunto. La alternativa viable que veo son dos:
1. Verificar que tienes instalado el paquete ORA_JAVA, en caso contrario tienes que importar (adelante te digo como se importa con la segunda opción) el Java class: java.net.InetAddress
o bajar el patchset de ftp://oracle-ftp.oracle.com/dev_tools/patchsets/dev2k/Win95NT/6i/
Después se crea una función del siguiente estilo:
FUNCTION get_hostname
RETURN VARCHAR2
IS
l_host ORA_JAVA.JOBJECT;
BEGIN
l_host := INETADDRESS.getLocalHost;
RETURN INETADDRESS.getHostName(l_host);
END get_hostname;
Si necesitas IP-adress se usa el método de getHostAddress en lugar de getHostName.
La segunda opción es:
Crear el siguiente programa con el nombre de LocalHost.java
import java.net.*; public class LocalHost { public String getName() { String macname; try { InetAddress inet= InetAddress.getLocalHost(); macname=inet.getHostName(); return macname; } catch( java.net.UnknownHostException e) { e.printStackTrace();} return null; } }
Compilarlo utilizando jdk.
javac LocalHost.java
copiar la clase generada ( LocalHost.class) en ORACLE_HOME\forms60\java o ORACLE_HOME\forms90\java.
Abrir Forms Builder para importar la Java class, ir al menu "Programs/Import Java Classes..." el wizard te guía...
Escoger la class LocalHost que reside en la raíz del árbol.
Click Import
Después se puede crear un botón en la forma para usarlo:
Declare
obj ORA_JAVA.JOBJECT; macname varchar2(100);
begin obj:=LocalHost.new; macname:= LocalHost.getName(obj );
message( macname );
end;
Hola,
Lo primero es agradecerte tu paciencia e interés, he siguido tus pasos tal y como me has comentado y no me retorna nada, me he puesto a depurar la forma y me he dado cuenta que cuando se mete en la unidad de programa "LocalHost", y llega a la linea:
cls := JNI.GET_CLASS('LocalHost');
Se para y no continua, para importar la clase me toco meter en la variable de entorno classpath la ruta donde estaba la clase LocalHost.class, en principio he hecho todo lo que me pusiste, la forma es nueva y no tiene otro código que el necesario para averiguar el nombre de la máquina cliente. También he preguntado en metalink y no me solucionan el problema, empiezo a creer que esto va a ser algo más que complicado. Me gustaría saber si tu has probado esto, así seguiría pegándome con ello porque estoy empezando a desilusionarme un poco. Recuerda que la forma esta hospedada en el servidor de aplicaciones y yo la ejecuto desde mi navegador (I. Explorer), en el ordenador cliente.
Gracias.
Efectivamente en el CLASSPATH debe aparecer algo similar a lo siguiente si estas usando forms60:
D:\ORACLE\...\forms60\java;D:\ORACLE\...\forms60\java\f60srv.jar;D:\Oracle\...\TOOLS\COMMON60\JAVA\importer.jar;D:\ORACLE\...\forms60\java\UploadServer.jar;D:\ORACLE\...\forms60\java\UploadClient.jar.sig;D:\jdk1.2.2\jre\lib;D:\jdk1.2.2\jre\bin\cl
En caso contrario no ejecuta el programa anterior, puede generar error ORA-105100 o FRM-92101.
Existe un demo que utiliza java bean para obtener la IP y se llama GetClientInfo y esta disponible en OTN.
También se pueden usar las funciones
OWA_UTIL. GET_CGI_ENV retornan la IP address de la middle tier mientras que
WWCTX_API.GET_IP_ADDRESS retornan la IP del cliente browser.
Los ejemplos de como usar estos los encuentra en metalink
ARA
Muchísimas gracias, voy a pegarme con ello que me has dejado en el buen camino y tiene muy buena pinta, espero que con esto último se solucione, gracias de nuevo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas