Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Fnd_Request.Submit_Request desde Trigger en R12

Estas en el tema de Fnd_Request.Submit_Request desde Trigger en R12 en el foro de Oracle en Foros del Web. Buenas noches (se nota que me encuentro en colombia). Les escribo por lo siguiente, tengo un problema con un desarrollo en una instancia Oracle R12, ...
  #1 (permalink)  
Antiguo 21/11/2011, 21:33
 
Fecha de Ingreso: enero-2007
Ubicación: Cali - Valle
Mensajes: 135
Antigüedad: 11 años, 11 meses
Puntos: 4
Pregunta Fnd_Request.Submit_Request desde Trigger en R12

Buenas noches (se nota que me encuentro en colombia).

Les escribo por lo siguiente, tengo un problema con un desarrollo en una instancia Oracle R12, tengo todo el codigo en un trigger y veo que me obtiene la info necesaria para setear con la siguiente instruccion Fnd_Global.Apps_Initialize, pero siempre me genera un error al tratar de inicializar y por consiguiente, no me deja lanzar el Fnd_Request.Submit_Request.

Adjunto codigo del trigger, Funcion de Seteo y error q almaceno en una tabla.

Error:

Código SQL:
Ver original
  1. ORA-20001: Error de Oracle -20001: Se detectó ORA-20001: Error de Oracle -4092: Se detectó ORA-04092: no se puede SET NLS en un disparador
  2.  en fnd_global.set_nls.set_parameter('NLS_LANGUAGE','LATIN AMERICAN SPANISH').
  3.  en fnd_global.set_nls.

--Codigo del Trigger

Código SQL:
Ver original
  1. CREATE OR REPLACE TRIGGER Xxcoo_Ap_Lanza_Concurrente
  2.   After UPDATE ON FND_CONCURRENT_REQUESTS
  3.   REFERENCING NEW AS NEW OLD AS OLD
  4.   FOR Each ROW  
  5. WHEN ((NEW.Phase_Code = 'C') AND (NEW.Status_Code = 'C') AND (NEW.Program_Application_Id = 673)  AND (NEW.Concurrent_Program_Id = 52355))
  6. DECLARE
  7.  
  8.   v_Org_Id    NUMBER;
  9.   Nrequest_Id NUMBER;
  10.   v_Resp_Id   NUMBER;
  11.  
  12.   v_User_Name      Varchar2(50);
  13.   v_Responsability Varchar2(200);
  14.   v_Context        Varchar2(100);
  15.   v_Context2       Varchar2(500);
  16.  
  17.   l_Boolean BOOLEAN;
  18.  
  19. BEGIN
  20.  
  21.  
  22.   SELECT Requestor,
  23.          Responsibility_Id
  24.     INTO v_User_Name,
  25.          v_Resp_Id
  26.     FROM Fnd_Conc_Req_Summary_v
  27.    WHERE Request_Id = :NEW.Request_Id
  28.    ORDER BY Request_Id DESC;
  29.  
  30.  
  31.   SELECT Responsibility_Name
  32.     INTO v_Responsability
  33.     FROM Fnd_Responsibility_Vl
  34.    WHERE Responsibility_Id = v_Resp_Id;
  35.  
  36.   SELECT To_Number(Substr(v.Profile_Option_Value, 1, 30))
  37.     INTO v_Org_Id
  38.     FROM Applsys.Fnd_Profile_Options       p,
  39.          Applsys.Fnd_Profile_Option_Values v,
  40.          Applsys.Fnd_Responsibility        Rsp,
  41.          Hr.Hr_All_Organization_Units      o,
  42.          Applsys.Fnd_Responsibility_Tl     r
  43.    WHERE p.Profile_Option_Id = v.Profile_Option_Id(+)
  44.      AND Rsp.Application_Id(+) = v.Level_Value_Application_Id
  45.      AND Rsp.Responsibility_Id(+) = v.Level_Value
  46.      AND Rsp.Responsibility_Id = r.Responsibility_Id
  47.      AND r.Responsibility_Name LIKE v_Responsability --'Coomeva AP Superuser Colombia'
  48.      AND r.LANGUAGE = 'ESA'
  49.      AND p.Profile_Option_Name = 'ORG_ID'
  50.      AND To_Char(o.Organization_Id) = Substr(v.Profile_Option_Value, 1, 30);
  51.  
  52.  
  53.   -- Setting the context ----
  54.   v_Context := Xxcoo_Ap_Utilitiescheq_Co_Pkg.Set_Context(v_User_Name,
  55.                                                          v_Responsability,
  56.                                                          v_Org_Id);
  57.  
  58.   --v_Context := Set_Context('&V_USER_NAME', '&V_RESPONSIBILITY', 82);
  59.  
  60.   v_Context2 := 'v_User_Name: ' || v_User_Name || ', v_Responsability: ' ||
  61.                 v_Responsability || ', v_Org_Id: ' || v_Org_Id ||
  62.                 ', v_Context: ' || v_Context;
  63.  
  64.   IF v_Context = 'F' THEN
  65.     Dbms_Output.Put_Line('Error while setting the context');
  66.   END IF;
  67.  
  68.  
  69.   l_Boolean := Fnd_Request.Set_Mode(TRUE);
  70.  
  71.   Nrequest_Id := Fnd_Request.Submit_Request(Application => 'XXCOO',
  72.                                             Program     => 'XXCOOAPMOVTEF2',
  73.                                             Start_Time  => Sysdate,
  74.                                             Sub_Request => FALSE,
  75.                                             Argument1   => :NEW.Request_Id);
  76.  
  77.   --Commit;
  78.   -- End If;
  79.  
  80.   INSERT INTO Cvj_Prueba_Trigger
  81.     (Request_Id_Eft, Request_Id_Mov, Fecha, Variables_Contex)
  82.   VALUES
  83.     (:NEW.Request_Id, Nrequest_Id, Sysdate, v_Context2);
  84.  
  85.   --Commit;
  86.  
  87. END;

-- Funcion Set_Context
Código SQL:
Ver original
  1. FUNCTION Set_Context(i_User_Name IN Varchar2,
  2.                        i_Resp_Name IN Varchar2,
  3.                        i_Org_Id    IN NUMBER) RETURN Varchar2 IS
  4.  
  5.     v_User_Id      NUMBER;
  6.     v_Resp_Id      NUMBER;
  7.     v_Resp_Appl_Id NUMBER;
  8.     v_Lang         Varchar2(100);
  9.     v_Session_Lang Varchar2(100) := Fnd_Global.Current_Language;
  10.     v_Return       Varchar2(10) := 'T';
  11.     v_Nls_Lang     Varchar2(100);
  12.     v_Org_Id       NUMBER := i_Org_Id;
  13.  
  14.     v_Mensaje Varchar2(4000) := NULL;
  15.     /* Cursor to get the user id information based on the input user name */
  16.     Cursor Cur_User IS
  17.       SELECT User_Id FROM Fnd_User WHERE User_Name = i_User_Name;
  18.     /* Cursor to get the responsibility information */
  19.     Cursor Cur_Resp IS
  20.       SELECT Responsibility_Id,
  21.              Application_Id,
  22.              LANGUAGE
  23.         FROM Fnd_Responsibility_Tl
  24.        WHERE Responsibility_Name = i_Resp_Name
  25.          AND LANGUAGE = 'ESA';
  26.  
  27.     /* Cursor to get the nls language information for setting the language context */
  28.     Cursor Cur_Lang(p_Lang_Code Varchar2) IS
  29.       SELECT Nls_Language
  30.         FROM Fnd_Languages
  31.        WHERE Language_Code = p_Lang_Code;
  32.   BEGIN
  33.     /* To get the user id details */
  34.     OPEN Cur_User;
  35.     Fetch Cur_User
  36.       INTO v_User_Id;
  37.     IF Cur_User%Notfound THEN
  38.    
  39.       v_Mensaje := Sqlerrm;
  40.    
  41.       INSERT INTO Cvj_Prueba_Trigger
  42.         (Request_Id_Eft, Request_Id_Mov, Fecha, Variables_Contex)
  43.       VALUES
  44.         (0,
  45.          0,
  46.          Sysdate,
  47.          'Error en el usuario: ' || i_User_Name || '. Problema: ' ||
  48.          v_Mensaje);
  49.    
  50.       v_Return := 'F';
  51.    
  52.     END IF; --IF cur_user%NOTFOUND
  53.     Close Cur_User;
  54.  
  55.     /* To get the responsibility and responsibility application id */
  56.     OPEN Cur_Resp;
  57.     Fetch Cur_Resp
  58.       INTO v_Resp_Id, v_Resp_Appl_Id, v_Lang;
  59.     IF Cur_Resp%Notfound THEN
  60.    
  61.       v_Mensaje := Sqlerrm;
  62.    
  63.       INSERT INTO Cvj_Prueba_Trigger
  64.         (Request_Id_Eft, Request_Id_Mov, Fecha, Variables_Contex)
  65.       VALUES
  66.         (0,
  67.          0,
  68.          Sysdate,
  69.          'Error en la responsabilidad: ' || i_Resp_Name || '. Problema: ' ||
  70.          v_Mensaje);
  71.    
  72.       v_Return := 'F';
  73.    
  74.     END IF; --IF cur_resp%NOTFOUND
  75.     Close Cur_Resp;
  76.  
  77.     /* Setting the oracle applications context for the particular session */
  78.     Fnd_Global.Apps_Initialize(User_Id      => v_User_Id,
  79.                                Resp_Id      => v_Resp_Id,
  80.                                Resp_Appl_Id => v_Resp_Appl_Id);
  81.  
  82.     /* Setting the org context for the particular session */
  83.     Mo_Global.Set_Policy_Context('S', v_Org_Id);
  84.  
  85.     /*    \* setting the nls context for the particular session *\
  86.     If v_Session_Lang != v_Lang Then
  87.       Open Cur_Lang(v_Lang);
  88.       Fetch Cur_Lang
  89.         Into v_Nls_Lang;
  90.       Close Cur_Lang;
  91.       Fnd_Global.Set_Nls_Context(v_Nls_Lang);
  92.     End If; --IF v_session_lang != v_lang*/
  93.  
  94.     Commit;
  95.  
  96.     RETURN v_Return;
  97.   Exception
  98.     WHEN Others THEN
  99.    
  100.       v_Mensaje := Sqlerrm;
  101.    
  102.       INSERT INTO Cvj_Prueba_Trigger
  103.         (Request_Id_Eft, Request_Id_Mov, Fecha, Variables_Contex)
  104.       VALUES
  105.         (0, 0, Sysdate, v_Mensaje);
  106.    
  107.    
  108.       RETURN 'F';
  109.    
  110.   END Set_Context;

Si alguien sabe que puedo hacer para solucionar el error se lo agradeceria, la verdad se necesita esto lo mas pronto posible para poder llevarlo a la instancia de producción.

Muchas gracias.

Scooby.


  #2 (permalink)  
Antiguo 22/11/2011, 17:04
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 11 años, 1 mes
Puntos: 84
Respuesta: Fnd_Request.Submit_Request desde Trigger en R12

Esto es un bug de Oracle que se da al ejecutar fnd_global.apps_initialize dentro del contexto de un trigger. Pero teniendo en cuenta el código ORA-04092, un error conocido cuando se intenta hacer un commit o rollback dentro de un trigger, es probable que el bug esté en el diseño de las transacciones del paquete fnd_global, lo que podrías evitar (en teoría) con el código:

Código:
FUNCTION Set_Context(i_User_Name IN Varchar2,
                       i_Resp_Name IN Varchar2,
                       i_Org_Id    IN Number) RETURN Varchar2 IS
  ...
  Begin
  ...  
    /*Fnd_Global.Apps_Initialize(User_Id      => v_User_Id,
                               Resp_Id      => v_Resp_Id,
                               Resp_Appl_Id => v_Resp_Appl_Id);*/

    /*procedimiento para llamar a fnd_global.apps_initialize*/
    proc1 (User_Id      => v_User_Id,
                               Resp_Id      => v_Resp_Id,
                               Resp_Appl_Id => v_Resp_Appl_Id);
  ...
  End Set_Context;

PROCEDURE Proc1 (i_User_Name IN Varchar2,
                       i_Resp_Name IN Varchar2,
                       i_Org_Id    IN Number) IS

pragma autonomous_transaction; 

Begin 
  fnd_global.APPS_INITIALIZE(p_user_id,1,1); 
  commit; 
End Proc1;
El pragma autonomous_transaction hace que un procedimiento se ejecute en una transacción independiente del proceso que lo invoca.

Saludos
  #3 (permalink)  
Antiguo 02/12/2011, 14:43
 
Fecha de Ingreso: enero-2007
Ubicación: Cali - Valle
Mensajes: 135
Antigüedad: 11 años, 11 meses
Puntos: 4
Respuesta: Fnd_Request.Submit_Request desde Trigger en R12

Hola Matanga.

Apenas me acorde en agradecerte por el comentario, efectivamente eso fue lo que hice, colocar el procedimiento como transaccion autonoma y me funciono perfecto.

Muchas gracias.

Saludos.
  #4 (permalink)  
Antiguo 14/09/2012, 17:12
 
Fecha de Ingreso: junio-2007
Mensajes: 4
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Fnd_Request.Submit_Request desde Trigger en R12

AYUDA por favor... no se si alguien sepa como inicializar el EXEC MO_GLOBAL.SET_POLICY_CONTEXT('S',799) para que se ejecute desde php, pues resulta que hay querys que hice que solo deuelven resultados desde toad al ejecutar dicha sentencia, pero al hacer la ejecucioon desde php no me da resultado
  #5 (permalink)  
Antiguo 16/09/2012, 20:02
 
Fecha de Ingreso: enero-2007
Ubicación: Cali - Valle
Mensajes: 135
Antigüedad: 11 años, 11 meses
Puntos: 4
Respuesta: Fnd_Request.Submit_Request desde Trigger en R12

Cita:
Iniciado por artvro78 Ver Mensaje
AYUDA por favor... no se si alguien sepa como inicializar el EXEC MO_GLOBAL.SET_POLICY_CONTEXT('S',799) para que se ejecute desde php, pues resulta que hay querys que hice que solo deuelven resultados desde toad al ejecutar dicha sentencia, pero al hacer la ejecucioon desde php no me da resultado
Hola artvro78

Te digo 2 cosas:
  1. No debes de activar un hilo que llevaba ya tiempo sin actualizaciones, eso esta prohibido por las normas del foro, para eso lo que deberias de hacer es crear un post nuevo.
  2. Para resolver tu duda, esto lo debes hacer es en la base de datos, no desde phpen el php debes de mandar la orden a una funcion que este en un paquete para que lo haga y procese toda la información. Si tu problema no se resuelve, debes crear un nuevo tema especificando bien todo el problema, lo que tienes y lo que esperas de resultado.

Saludos

Etiquetas: select, tabla, trigger
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:49.