Pre-Requisites: ————–
a) set of books should be defined
b) Current Conversion rates and accounting periods need to be defines
c) Source and Category Name Should be defined
Interface Tables:
—————-
GL_INTERFACE
Base Tables:
———–
GL_JE_HEADERS
GL_JE_LINES
GL_JE_BATCHES
Standard Program:
Go to General Ledger Vision Operations(USA)
Run =>Import
Here Give the Source name and Save.
While Click on the save button Back end One Program Concurrent Program is running.If it is Success the Records are Successfully loaded from interface table to base Table Others wise Some Error are there.
Copy that Request_id and Enter into Generals our Records will be there………..
Validation Columns:
——————
Source period_name currency_code set_of_books_id
je_source je_catregory accounting_date entered_dr , entered_cr
accounted_cr accounted_dr encumberance_type_id
Source = ‘NEW’
period need to be open status in gl_period_statuses
souce_name defined in gl_je_source table
category_name defines gl_je_Category
currency available in fnd_Currencies
accounted_cr and accounted_dr total should be same.
Control file for GL_Interface:
LOAD DATA
INFILE *
TRUNCATE INTO TABLE GL_INTERFACE_TEMP
FIELDS TERMINATED BY ‘,’ OPTIONALLY ENCLOSED BY ‘”‘
TRAILING NULLCOLS
(STATUS,
SET_OF_BOOKS_ID,
ACCOUNTING_DATE,
CURRENCY_CODE,
DATE_CREATED,
CREATED_BY,
ACTUAL_FLAG,
USER_JE_CATEGORY_NAME,
USER_JE_SOURCE_NAME,
SEGMENT1,
SEGMENT2,
SEGMENT3,
SEGMENT4,
SEGMENT5,
ENTERED_DR,
ENTERED_CR,
ACCOUNTED_DR,
ACCOUNTED_CR,
GROUP_ID)
BEGIN DATA
NEW,1,11-AUG-2002,USD,11-AUG-2002,1318,A,Inventory,JETFORMS,01,110,7730,0000,000,555,555,555,555,11
NEW,1,11-AUG-2002,USD,11-AUG-2002,1318,A,Inventory,JETFORMS,01,110,7730,0000,000,554,554,554,554,11
Script
sqlldr apps/apps control=’/apps/aptest/visappl/xxcus/11.5.0/bin/xx_gl.ctl’ log=’/apps/aptest/visappl/xxcus/11.5.0/bin/xx_gl.log’
exit 0
GL Interface Package:
CREATE OR REPLACE package body APPS.xx_gl_int_pkg
is
procedure dis_log(p_msg in varchar2)
is
begin
fnd_file.put_line(fnd_file.log,p_msg);
end;
procedure main(errbuf out varchar2,
retcode out varchar2
)
is
cursor c1 is select a.rowid row_id,a.* from GL_INTERFACE_TEMP a;
v_gl_int gl_interface%rowtype;
v_process_flag varchar2(10);
v_error_msg varchar2(100);
v_tot_err_msg varchar2(1000);
begin
dis_log(‘before entering the loop’);
for i in c1 loop
v_error_msg :=null;
v_process_flag:=’S’;
v_tot_err_msg:=null;
v_gl_int:=null;
–currency_code validation
begin
select currency_code into v_gl_int.currency_code
from fnd_currencies
where currency_code=i.currency_code;
exception
when no_data_found then
v_process_flag:=’E’;
v_error_msg := ‘Invalid Currency Code =>’||i.currency_code;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
when others then
v_process_flag:=’E’;
v_error_msg := ‘ Exception at Currency Code =>’||i.currency_code;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
end;
–user_je_source_name validation
begin
select user_je_source_name into v_gl_int.user_je_source_name
from gl_je_sources
where user_je_source_name=i.user_je_source_name;
exception
when no_data_found then
v_process_flag:=’E’;
v_error_msg := ‘Invalid Sourec Name =>’||i.user_je_source_name;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
when others then
v_process_flag:=’E’;
v_error_msg := ‘ Exception at Sourec Name =>’||i.user_je_source_name;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
end;
–category_name validation
begin
select user_je_category_name into v_gl_int.user_je_category_name
from gl_je_categories
where user_je_category_name=i.user_je_category_name;
exception
when no_data_found then
v_process_flag:=’E’;
v_error_msg := ‘Invalid category_name =>’||i.user_je_category_name;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
when others then
v_process_flag:=’E’;
v_error_msg := ‘ Exception at category_name =>’||i.user_je_category_name;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
end;
–user id validation
begin
select user_id into v_gl_int.created_by from fnd_user
where user_id = i.created_by;
exception
when no_data_found then
v_process_flag:=’E’;
v_error_msg := ‘Invalid user id =>’||i.created_by;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
when others then
v_process_flag:=’E’;
v_error_msg := ‘ Exception at user id =>’||i.created_by;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
end;
— set of books id validation
begin
SELECT SET_OF_BOOKS_ID INTO v_gl_int.set_of_books_id
FROM GL_SETS_OF_BOOKS WHERE SET_OF_BOOKS_ID=i.set_of_books_id;
exception
when no_data_found then
v_process_flag:=’E’;
v_error_msg := ‘Invalid set of books id =>’||i.set_of_books_id;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
when others then
v_process_flag:=’E’;
v_error_msg := ‘ Exception atset of books id =>’||i.set_of_books_id;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
end;
v_gl_int.status :=i.status;
— v_gl_int.set_of_books_id :=i.set_of_books_id;
v_gl_int.accounting_date :=i.accounting_date;
— v_gl_int.currency_code :=i.currency_code;
v_gl_int.date_created :=i.date_created;
–v_gl_int.created_by :=i.created_by;
v_gl_int.actual_flag :=i.actual_flag ;
–v_gl_int.user_je_category_name :=i.user_je_category_name;
–v_gl_int.user_je_source_name :=i.user_je_source_name;
v_gl_int.segment1 :=i.segment1;
v_gl_int.segment2 :=i.segment2;
v_gl_int.segment3 :=i.segment3;
v_gl_int.segment4 :=i.segment4;
v_gl_int.segment5 :=i.segment5 ;
v_gl_int.entered_dr :=i.entered_dr;
v_gl_int.entered_cr :=i.entered_cr;
v_gl_int.accounted_dr :=i.accounted_dr;
v_gl_int.accounted_cr :=i.accounted_cr;
v_gl_int.group_id :=i.group_id;
dis_log(‘before inserting the loop’);
if v_process_flag = ‘S’ then
insert into gl_interface values v_gl_int;
end if;
update GL_INTERFACE_TEMP set process_flag=v_process_flag,
error_message=v_tot_err_msg
where rowid=i.row_id;
dis_log(‘after inserting the loop’);
end loop;
exception
when others then
dis_log(‘exception occured at main loop’);
end main;
end xx_gl_int_pkg;
Complete GL Interface – PL/SQL Procedure
————–
a) set of books should be defined
b) Current Conversion rates and accounting periods need to be defines
c) Source and Category Name Should be defined
Interface Tables:
—————-
GL_INTERFACE
Base Tables:
———–
GL_JE_HEADERS
GL_JE_LINES
GL_JE_BATCHES
Standard Program:
Go to General Ledger Vision Operations(USA)
Run =>Import
Here Give the Source name and Save.
While Click on the save button Back end One Program Concurrent Program is running.If it is Success the Records are Successfully loaded from interface table to base Table Others wise Some Error are there.
Copy that Request_id and Enter into Generals our Records will be there………..
Validation Columns:
——————
Source period_name currency_code set_of_books_id
je_source je_catregory accounting_date entered_dr , entered_cr
accounted_cr accounted_dr encumberance_type_id
Source = ‘NEW’
period need to be open status in gl_period_statuses
souce_name defined in gl_je_source table
category_name defines gl_je_Category
currency available in fnd_Currencies
accounted_cr and accounted_dr total should be same.
Control file for GL_Interface:
LOAD DATA
INFILE *
TRUNCATE INTO TABLE GL_INTERFACE_TEMP
FIELDS TERMINATED BY ‘,’ OPTIONALLY ENCLOSED BY ‘”‘
TRAILING NULLCOLS
(STATUS,
SET_OF_BOOKS_ID,
ACCOUNTING_DATE,
CURRENCY_CODE,
DATE_CREATED,
CREATED_BY,
ACTUAL_FLAG,
USER_JE_CATEGORY_NAME,
USER_JE_SOURCE_NAME,
SEGMENT1,
SEGMENT2,
SEGMENT3,
SEGMENT4,
SEGMENT5,
ENTERED_DR,
ENTERED_CR,
ACCOUNTED_DR,
ACCOUNTED_CR,
GROUP_ID)
BEGIN DATA
NEW,1,11-AUG-2002,USD,11-AUG-2002,1318,A,Inventory,JETFORMS,01,110,7730,0000,000,555,555,555,555,11
NEW,1,11-AUG-2002,USD,11-AUG-2002,1318,A,Inventory,JETFORMS,01,110,7730,0000,000,554,554,554,554,11
Script
sqlldr apps/apps control=’/apps/aptest/visappl/xxcus/11.5.0/bin/xx_gl.ctl’ log=’/apps/aptest/visappl/xxcus/11.5.0/bin/xx_gl.log’
exit 0
GL Interface Package:
CREATE OR REPLACE package body APPS.xx_gl_int_pkg
is
procedure dis_log(p_msg in varchar2)
is
begin
fnd_file.put_line(fnd_file.log,p_msg);
end;
procedure main(errbuf out varchar2,
retcode out varchar2
)
is
cursor c1 is select a.rowid row_id,a.* from GL_INTERFACE_TEMP a;
v_gl_int gl_interface%rowtype;
v_process_flag varchar2(10);
v_error_msg varchar2(100);
v_tot_err_msg varchar2(1000);
begin
dis_log(‘before entering the loop’);
for i in c1 loop
v_error_msg :=null;
v_process_flag:=’S’;
v_tot_err_msg:=null;
v_gl_int:=null;
–currency_code validation
begin
select currency_code into v_gl_int.currency_code
from fnd_currencies
where currency_code=i.currency_code;
exception
when no_data_found then
v_process_flag:=’E’;
v_error_msg := ‘Invalid Currency Code =>’||i.currency_code;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
when others then
v_process_flag:=’E’;
v_error_msg := ‘ Exception at Currency Code =>’||i.currency_code;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
end;
–user_je_source_name validation
begin
select user_je_source_name into v_gl_int.user_je_source_name
from gl_je_sources
where user_je_source_name=i.user_je_source_name;
exception
when no_data_found then
v_process_flag:=’E’;
v_error_msg := ‘Invalid Sourec Name =>’||i.user_je_source_name;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
when others then
v_process_flag:=’E’;
v_error_msg := ‘ Exception at Sourec Name =>’||i.user_je_source_name;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
end;
–category_name validation
begin
select user_je_category_name into v_gl_int.user_je_category_name
from gl_je_categories
where user_je_category_name=i.user_je_category_name;
exception
when no_data_found then
v_process_flag:=’E’;
v_error_msg := ‘Invalid category_name =>’||i.user_je_category_name;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
when others then
v_process_flag:=’E’;
v_error_msg := ‘ Exception at category_name =>’||i.user_je_category_name;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
end;
–user id validation
begin
select user_id into v_gl_int.created_by from fnd_user
where user_id = i.created_by;
exception
when no_data_found then
v_process_flag:=’E’;
v_error_msg := ‘Invalid user id =>’||i.created_by;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
when others then
v_process_flag:=’E’;
v_error_msg := ‘ Exception at user id =>’||i.created_by;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
end;
— set of books id validation
begin
SELECT SET_OF_BOOKS_ID INTO v_gl_int.set_of_books_id
FROM GL_SETS_OF_BOOKS WHERE SET_OF_BOOKS_ID=i.set_of_books_id;
exception
when no_data_found then
v_process_flag:=’E’;
v_error_msg := ‘Invalid set of books id =>’||i.set_of_books_id;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
when others then
v_process_flag:=’E’;
v_error_msg := ‘ Exception atset of books id =>’||i.set_of_books_id;
v_tot_err_msg:= v_tot_err_msg||’ ‘||v_error_msg ;
end;
v_gl_int.status :=i.status;
— v_gl_int.set_of_books_id :=i.set_of_books_id;
v_gl_int.accounting_date :=i.accounting_date;
— v_gl_int.currency_code :=i.currency_code;
v_gl_int.date_created :=i.date_created;
–v_gl_int.created_by :=i.created_by;
v_gl_int.actual_flag :=i.actual_flag ;
–v_gl_int.user_je_category_name :=i.user_je_category_name;
–v_gl_int.user_je_source_name :=i.user_je_source_name;
v_gl_int.segment1 :=i.segment1;
v_gl_int.segment2 :=i.segment2;
v_gl_int.segment3 :=i.segment3;
v_gl_int.segment4 :=i.segment4;
v_gl_int.segment5 :=i.segment5 ;
v_gl_int.entered_dr :=i.entered_dr;
v_gl_int.entered_cr :=i.entered_cr;
v_gl_int.accounted_dr :=i.accounted_dr;
v_gl_int.accounted_cr :=i.accounted_cr;
v_gl_int.group_id :=i.group_id;
dis_log(‘before inserting the loop’);
if v_process_flag = ‘S’ then
insert into gl_interface values v_gl_int;
end if;
update GL_INTERFACE_TEMP set process_flag=v_process_flag,
error_message=v_tot_err_msg
where rowid=i.row_id;
dis_log(‘after inserting the loop’);
end loop;
exception
when others then
dis_log(‘exception occured at main loop’);
end main;
end xx_gl_int_pkg;
Share this:
How to find INV Onhand Quantity at given date?
SELECT SUM (target_qty), item_id
FROM ( SELECT moqv.subinventory_code subinv,
moqv.inventory_item_id item_id,
SUM (transaction_quantity) target_qty
FROM mtl_onhand_qty_cost_v moqv
WHERE moqv.organization_id = :org_id
AND moqv.inventory_item_id = :item_id
GROUP BY moqv.subinventory_code,
moqv.inventory_item_id,
moqv.item_cost
UNION
SELECT mmt.subinventory_code subinv,
mmt.inventory_item_id item_id,
-SUM (primary_quantity) target_qty
FROM mtl_material_transactions mmt, mtl_txn_source_types mtst
WHERE mmt.organization_id = :org_id
AND transaction_date >= TO_DATE (:hist_date) + 1
AND mmt.transaction_source_type_id =
mtst.transaction_source_type_id
AND mmt.inventory_item_id = :item_id
GROUP BY mmt.subinventory_code, mmt.inventory_item_id) oq
GROUP BY oq.item_id
Share this:
Cursors In Oracle
Two types of classification s:
I.STATIC CURSOR S:
Static : Normal cursor (implicit or explicit)
Cursor attributes for implicit and explicit:
%FOUND – records fetched successfully
%NOTFOUND – no records fetched
%ROWCOUNT – Number of records fetched
%ISOPEN – returns TRUE if cursor is open
a. Implicit :
Cannot be opened outside the statement
More fast and less coding effort.
Will never raise INVALID_CURSOR error
Raises NO_DATA_FOUND and TOO_MANY_ROWS exceptions (eg: select <stmt>)
Example Implicit Cursor:
select * from emp
If SQL%FOUND then
v_count:= SQL%ROWCOUNT
end if;
b. Explicit : 2 network round trips. Store data first then retrieve data.
More programmatic control.
Programmer could open; fetch data, close, check attributes etc.
Syntax:
open c1; — cursor c1 is select <stmt>
fetch <>
exit when c1%NOTFOUND
Example Explicit cursor:
Without Using Loop s
Declare
Cursor cur1 is
select ename,empno,sal from emp
where sal<50000 and deptno=50
begin
open cur1;
fetch cur1 into v_ename,v_empno,v_sal;
exit when cur1%notfound;
—<do processing>
close cur1;
end;
Using Loops:
Declare
Cursor cur1 is
select ename,empno,sal from emp
where sal<50000 and deptno=50
begin
For rec in cur1
loop
dbms_output.put_line(‘Employee Number ‘||rec.empno);
end loop;
end;
Using Loops with Cursor Parameters:
Declare
Cursor cur1( cp_deptNo Number)
is
select ename,empno,sal from emp
where sal<50000 and deptno=cp_deptNo
l_deptNo Number :=50;
begin
For rec in cur1(l_deptNo)
loop
dbms_output.put_line(‘Employee Number ‘||rec.empno);
end loop;
end;
II. DYNAMIC CURSOR s :
Oracle REF CURSOR Types:
With the REF_CURSOR you can return a recordset/cursor from a stored procedure
(i.e Ref Cursors can have Record/s as return types.)
Could be declared once and defined many times in different procedures.
a)Strong : For the strong ref cursor the returning columns with data type and length need to be known at compile time.
b)Weak :For the weak ref cursor the structure does not need to be known at compile time.
Example For the Ref Cursor :
–SPECK PACKAGE
CREATE OR REPLACE PACKAGE REFCURSOR_PKG
AS
TYPE WEAK_REF_CURSOR IS REF CURSOR; — Until 9i
TYPE STRONG_REF_CURSOR IS REF CURSOR RETURN EMP%ROWTYPE;
END REFCURSOR_PKG;
The pl/sql procedure that returns a ref-cursor looks like this:
–BODY PACKAGE
CREATE OR REPLACE PACKAGE BODY REFCURSOR_PKG
AS
— For Weak Ref Cursor:
PROCEDURE
WEAK_REF_CUR_PRC( p_deptno IN number,
p_cursor OUT REFCURSOR_PKG.WEAK_REF_CURSOR — Until 9i
—- From 9i (p_cursor OUT SYS_REFCURSOR )—-
)
IS
BEGIN
OPEN p_cursor FOR
SELECT * FROM emp
WHERE deptno = p_deptno;
end WEAK_REF_CUR_PRC;
— For Strong Ref Cursor:
PROCEDURE
STRONG_REF_CUR_PRC( p_deptno IN number,
p_cursor OUT REFCURSOR_PKG.STRONG_REF_CURSOR
)
IS
BEGIN
SELECT * FROM emp
WHERE deptno = p_deptno;
end STRONG_REF_CUR_PRC;
END REFCURSOR_PKG;
Share this:
Bulk Collect in Oracle PL/SQL
In order to reduce the number of these context switches we can use bulk collecting feature
Bulk collecting lets us to transfer rows between the sql engine and the plsql engine as collections.
Bulk collecting is available for select, insert, delete and update statements.
Below are some examples:
create table BULK_COLLECT_TEST as select * from PER_ALL_PEOPLE_F;
Table created.
insert into BULK_COLLECT_TEST
select * from BULK_COLLECT_TEST;
20000 rows created.
–BLOCK1:Using Loops
declare
cursor c1
is select object_name from BULK_COLLECT_TEST;
rec1 c1%rowtype;
begin
open c1;
loop
fetch c1 into rec1;
exit when c1%notfound;
null;
end loop;
end;
total Elapsed Time is : 45 Secs
–BLOCK2: Using Bulk Collecting
declare
cursor c1 is select object_name from BULK_COLLECT_TEST;
type c1_type is table of c1%rowtype;
rec1 c1_type;
begin
open c1;
fetch c1 bulk collect into rec1;
end;
total Elapsed Time is : 5 Sec
So bulk collecting the rows shows a huge performance improvement over fetching row by row.
Some cases there are many rows to process, we can limit the number of rows to bulk collect, process those rows and fetch again.
Otherwise process memory gets bigger and bigger as you fetch the rows.
–Bulk Collect Example using LIMIT :
declare
cursor c1 is select object_name from BULK_COLLECT_TEST;
type c1_type is table of c1%rowtype;
rec1 c1_type;
begin
open c1;
loop
fetch c1 bulk collect into rec1 limit 200;
for i in 1..rec1.count loop
null;
end loop;
exit when c1%notfound;
end loop;
end;
Share this:
Submitting Concurrent Program From Back end / PL SQL
Step1: Data Definition and Template to be created
Step2: Concurrent program needs to be created
Steps To Create the PL/SQL package:
1. Initialize the Session Specific variable using fnd_global.APPS_INITIALIZE
2. Set The BI publisher report layout Before submitting the concurrent program
3. Submit the Concurrent Program
Code: (Tested in R12.1.1 )
DECLARE
l_user_id fnd_user.user_id%TYPE;
l_resp_id fnd_responsibility.responsibility_id%TYPE;
l_resp_appl_id fnd_application.application_id%TYPE;
l_set_layout boolean;
l_request_id NUMBER;
l_phase VARCHAR2 (100);
l_status VARCHAR2 (100);
l_dev_phase VARCHAR2 (100);
l_dev_status VARCHAR2 (100);
l_wait_for_request boolean := FALSE;
l_get_request_status boolean := FALSE;
Output_layout_failed EXCEPTION;
request_submission_failed EXCEPTION;
request_completion_abnormal EXCEPTION;
BEGIN
l_request_id := NULL;
—
— Get the Apps Intilization Variables
—
SELECT fnd.user_id, fresp.responsibility_id, fresp.application_id
INTO l_user_id, l_resp_id, l_resp_appl_id
FROM fnd_user fnd, fnd_responsibility_tl fresp
WHERE fnd.user_name = ‘OEAG’
AND fresp.responsibility_name = ‘Custom XML Reports’;
—
–Initialize the Apps Variables
—
fnd_global.APPS_INITIALIZE (user_id => l_user_id,
resp_id => l_resp_id,
resp_appl_id => l_resp_appl_id);
COMMIT;
—
— Set the Layout for BI Publisher Report
—
l_set_layout :=
fnd_request.add_layout (template_appl_name => ‘XXERP’,
template_code => ‘XXORACLEERPAPPSGUIDE’,
–Data Template Code
template_language => ‘en’,
template_territory => ‘US’,
output_format => ‘PDF’);
IF l_set_layout
THEN
— Submit the Request
l_request_id :=
fnd_request.submit_request (application => ‘XXERP’,
program => ‘XXOEAG_PG’,
description => ”,
start_time => SYSDATE,
sub_request => FALSE,
argument1 => l_person_id);
COMMIT;
IF l_request_id > 0
THEN
—
–waits for the request completion
—
l_wait_for_request :=
fnd_concurrent.wait_for_request (request_id => l_request_id,
interval => 60,
max_wait => 0,
phase => l_phase,
status => l_status,
dev_phase => l_dev_phase,
dev_status => l_dev_status,
MESSAGE => l_messase);
COMMIT;
—
— Get the Request Completion Status.
—
l_get_request_status :=
fnd_concurrent.get_request_status (
request_id => l_request_id,
appl_shortname => NULL,
program => NULL,
phase => l_phase,
status => l_status,
dev_phase => l_dev_phase,
dev_status => l_dev_status,
MESSAGE => l_messase
);
—
–Check the status if It IS completed Normal Or Not
—
IF UPPER (l_dev_phase) != ‘COMPLETED’
AND UPPER (l_dev_status) != ‘NORMAL’
THEN
RAISE request_completion_abnormal;
END IF;
ELSE
RAISE request_submission_failed;
END IF;
ELSE
RAISE Output_layout_failed;
END IF;
p_request_id := l_request_id;
EXCEPTION
WHEN Output_layout_failed
THEN
DBMS_OUTPUT.put_line (‘Out put Layout failed’);
WHEN request_submission_failed
THEN
DBMS_OUTPUT.put_line (‘Concurrent request submission failed’);
WHEN request_completion_abnormal
THEN
DBMS_OUTPUT.put_line (
‘Submitted request completed with error’ || l_request_id
);
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (‘ERROR:’ || SUBSTR (SQLERRM, 0, 240));
END;
/
You can Create this as PL/SQL Procedure and register into Concurrent Program also.
Share this: