Oracle Certification, Database Administration, SQL, Application, Programming Reference Books
E-mailing Report Output to User (Method 2)

To redirect the output of a report, you need to create a database trigger on fnd_concurrent_requests and a PRO*C program.
The PRO*C program is a daemon program which runs in background and continuously monitor the PIPE to see whether there is
something to e-mail.

/*Database Trigger */
CREATE OR REPLACE TRIGGER email_output_trg
  AFTER INSERT OR UPDATE ON fnd_concurrent_requests
  FOR EACH ROW
DECLARE
   l_program_name
            fnd_concurrent_programs.user_concurrent_program_name%TYPE;
   l_mail_string varchar2(200);
   result NUMBER;
   l_print_flag VARCHAR2(1);
BEGIN
  BEGIN
       SELECT  DISTINCT USER_CONCURRENT_PROGRAM_NAME,
                            PRINT_FLAG
        INTO  l_program_name,l_print_flag
        FROM  fnd_concurrent_programs
        WHERE  application_id =
                            :new.program_application_id
         AND  concurrent_program_id =
                            :new.concurrent_program_id ;
  EXCEPTION
  WHEN no_data_found THEN
   null;
  END;
        /* Create the e-mail string to be sent to PRO*C program */
  SELECT 'mail -s '||'"'||l_program_name||'"'||
   ' alok_chadda@usa.net'  || ' < '||
                  :new.outfile_name
  INTO l_mail_string
 FROM dual ;

        /* Check to see whether the Concurrent Program
           Ended successfully */
  IF :new.phase_code = 'C'
  and :new.status_code in ('C','G','I','R')
   and :new.outcome_product = 'FND' THEN
                /* Pack and Send the Message to PRO*C program */
       DBMS_PIPE.PACK_MESSAGE(l_mail_string);
       result :=
                      DBMS_PIPE.SEND_MESSAGE('emailoutputpipe');
                /* Raise Error in case SEND_MESSAG is
                       not successful */
  IF result <> 0 THEN
           RAISE_APPLICATION_ERROR(-2000,'Mailer Error');
       END IF;
  END IF;
END;
/
 
 
 
 
 

EXEC SQL BEGIN DECLARE SECTION;
      int     status;
      char    retval[2000];
 char *uid = "apps/fnd";
EXEC SQL END DECLARE SECTION;

EXEC SQL INCLUDE SQLCA;

main()
{
     /* Connect to the same schema which created the pipe in
  the database trigger */
     EXEC SQL CONNECT :uid;
     for (;;)
     {
         EXEC SQL EXECUTE
             DECLARE
              typ INTEGER;
          sta INTEGER;
              chr VARCHAR2(200);
             BEGIN
                 chr := '';
          /* Receive the message */
                 sta := dbms_pipe.receive_message('emailoutputpipe');
                 IF sta = 0 THEN
   /* Unpack the message */
                     dbms_pipe.unpack_message(chr);
                 END IF;
                 :status := sta;
                 :retval := chr;
             END;
         END-EXEC;
         if (status == 0)
  system(retval);
  /* The system() call will execute the
   "mail" string which is sent over the pipe */
     }
}

Return to : Oracle Database, SQL, Application, Programming Tips