There are several different types of Oracle Applications patches. E-Business Suite patching is a very broad topic. So we have decided to split it into two logical parts.

Part 1 – Oracle E-Business Suite patch terminology.

  • patch type hierarchy
  • patch naming convention
  • naming differences between 11i and R12

Part 2 – Querying patches, patchsets, family packs.

  • How to check which E-Business Suite Technology Patchsets have been applied?

Patch hierarchy in 11i

One-off Patches

The One-off patch category was common in the older versions R11 (11.0.x) and early releases of 11i. Typically, they fix single or isolated set of bugs. They are less and less common these days. Unless they fix a very critical and isolated bug, Oracle won’t release patches as standalone, but will consolidate them into larger bundles.

Product Patchsets (formerly known as Minipacks)

Standalone patchsets were common in early releases of 11i. They can enhance functionality and typically fix a large number of bugs for a single product. Once a patchset is applied, it increments the patchset level of a product (the product is sometimes also referred to as module). There are around 200 products integrated in EBS, and each product has specific patchset level. For most products, patchsets are no longer distributed as standalone (which means you won’t be able to download them from metalink), but are grouped into Family Packs.

Rollup Patches

Roll-up patches are a special kind that started to become more common as 11i matured. They are a collection of bugfixes for a specific product and relate to specific patchset level. They are released outside of a patchset release cycle. If a particular patchset turns out to be buggy it can have several roll-up patches, which are usually cumulative. These patches are sometimes referred to as a number after a patchset letter, as in case of 11i.AD.I.4.

Family Packs

As the complexity and dependencies between individual products increased, it became more and more difficult to release isolated patchsets for each product. Oracle grouped all interrelated products into families fulfilling a specific functional purpose. Family packs are seta of product patchsets for a particular family (such as Financials, Project Suite, Applications Technology, and so on). The family pack’s advantage is that the patchset levels were tested together, and should therefore be more stable and require fewer pre-requisites. Despite that fact, applying a family pack is a major change to the system, and should be rolled out carefully.

Consolidated Updates

As the EBS product matured in version 11i, Oracle started to release consolidated updates. These are huge updates similar to maintenance packs. They introduce change the fourth version number. You can think of it as a set of compatible family packs. The best-known consolidated update is CU2 which upgrades your system to version 11.5.10.2.

Maintenance Packs (in R12 Release Update Packs)

Maintenance packs deliver a new version of a product. Unlike major release upgrades, maintenance packs change the release number, which is the third number in a version name (for 11i). They are still considered patches, but the changes they introduce are system-wide. Often they also bring in brand new products.

Patch naming conventions

Every patch, irrespective of kind, has an identifier in form of a seven-digit number, that particular identifier corresponds with a bug number. The bug can be just a placeholder for the consolidation of other patches that are eventually merged into a bigger patchset, family pack etc.

For one-off patches, the 7-digit number is their only identifier.

There are around 200 products in E-Business Suite, and each product has a specific product name and product abbreviation. The Patchset level naming convention has an alternative to the patch number for easier identification. It consists of the version number, product abbreviation, and a letter.

For example: 11i.FND.H refers to patchset H for product FND for version 11i and it can be found under patch number 3262159.

Family packs add an additional component to the short name which is “_PF” after the product name abbreviation.

For example: the Application Technology family pack is referred to as 11i.ATG_PF.H (which corresponds with patch number 3438354), and the Financial suite family pack is referred to as 11.FIN_PF.G etc.

Consolidated updates were introduced after release 11.5.10. They append another number after the version number. So consolidated update 2 is referred to as 11.5.10.2 or simply CU2 (or as patch number 3480000).

Maintenance packs are the last piece in the puzzle. Their alternative names are same as the version number, so it’s 11.5.9, 11.5.10 etc.

Changes with R12 and new facts in the patch naming conventions

R12 introduces some new terms—codeline and codelevel—and changes the meaning of several established terms.

codeline

This refers to a point release. Every codeline delivers a unique set of features. So release 12.0 is a understood as codeline A; release 12.1 is understood as codeline B; release 12.2 will be understood as codeline C, and so on.

codelevel

Codelevel can resemble patchset level from 11i. For each codeline, there can be a set of updates, which deliver mostly bugfixes and reflects the particular product codelevel after the codeline letter.For example: R12.AP.A.4 means Account Payables product on codeline A (Release 12.0) on codelevel 4 (Part of release 12.0.4).

The important thing to understand is that if you install a specific R12 release such as 12.0.4, all products will not only be on the same codeline (A), but also on the same codelevel (4). Further updates for a specific codelevel are delivered in form of delta updates. So instead of going from 12.AD.A.4 to 12.AD.A.5 as you’d expect from 11i, you’d go from 12.AD.A.4 to 12.AD.A.4.delta1, 12.AD.A.4.delta2, and so on. The codelevel is incremented via Release Update Packs.

Release Update Packs

What was formerly known as a maintenance pack is now called a Release Update Pack with short name of RUP. This could be confused with another RUP (Roll-Up) as it was used in context of 11i. RUPs actually upgrade all products to higher codelevel. These point release upgrades can introduce substantial changes to the system, therefore need to be carefully planned.For example: RUP2 is equivalent to R12.0.2, RUP6 is equivalent to R12.0.6 etc.

The final note for R12 is that patch numbers no longer have to be unique: the same patch can be released in multiple shapes for different codelevels.

How to check which E-Business Suite Technology Patchsets have been applied?

Please see the selects below, to check for the Technology Patchsets on a E-Business Suite Release 11i and Release 12.x. Please be aware, that there are separate selects for a Single-Node Install and a Multi-Node-Install.

For a Single Tier Release 11i use this SELECT via sqlplus

SET head off Lines 120 pages 100
col n_patch format A65
col bug_number format A10
col patch_name format A10
spool atg_pf_ptch_level.txt
select ' atg_pf ' FROM dual;
/

select bug_number, decode(bug_number,
'3438354', '11i.ATG_PF.H',
'4017300', '11i.ATG_PF.H.RUP1',
'4125550', '11i.ATG_PF.H.RUP2',
'4334965', '11i.ATG_PF.H RUP3',
'4676589', '11i.ATG_PF.H RUP4',
'5382500', '11i.ATG_PF.H RUP5 HELP',
'5473858', '11i.ATG_PF.H.5',
'5674941', '11i.ATG_PF.H RUP5 SSO Integrat',
'5903765', '11i.ATG_PF.H RUP6',
'6117031', '11i.ATG_PF.H RUP6 SSO 10g Integration',
'6330890', '11i.ATG_PF.H RUP6 HELP',
'6241631', '11i.ATG_PF.H.RUP7',
'8248307', '11i.ATG_PF.H RUP7 HELP'
) n_patch, last_update_date
FROM ad_bugs
WHERE bug_number
IN ( '3438354', '4017300', '4125550', '4334965', '4676589', '5382500', '5473858', '5674941', '5903765', '6117031', '6330890', '6241631', '8248307' );

For a Multi Tier Install of Release 11i, please use this SELECT via sqlplus

set serveroutput on size 100000
DECLARE
TYPE p_patch_array_type is varray(100) of varchar2(10);
TYPE a_abstract_array_type is varray(100) of varchar2(60);
p_patchlist p_patch_array_type;
a_abstract a_abstract_array_type;
p_appltop_name VARCHAR2(50);
p_patch_status VARCHAR2(15);
p_appl_top_id NUMBER;

CURSOR alist_cursor IS
SELECT appl_top_id, name
FROM ad_appl_tops;

procedure println(msg in varchar2)
IS
BEGIN
dbms_output.put_line(msg);
END;

BEGIN
open alist_cursor;

p_patchlist := p_patch_array_type(
'3438354',
'4017300',
'4125550',
'4334965',
'4676589',
'5382500',
'5473858',
'5674941',
'5903765',
'6117031',
'6330890',
'6241631',
'8248307'
);
a_abstract := a_abstract_array_type(
'11i.ATG_PF.H',
'11i.ATG_PF.H.RUP1',
'11i.ATG_PF.H.RUP2',
'11i.ATG_PF.H RUP3',
'11i.ATG_PF.H RUP4',
'11i.ATG_PF.H RUP5 HELP',
'11i.ATG_PF.H.5',
'11i.ATG_PF.H RUP5 SSO Integrat',
'11i.ATG_PF.H RUP6',
'11i.ATG_PF.H RUP6 SSO 10g Integration',
'11i.ATG_PF.H RUP6 HELP',
'11i.ATG_PF.H.RUP7',
'11I.ATG_PF.H RUP7 HELP'
);

LOOP
FETCH alist_cursor INTO p_appl_top_id, p_appltop_name;
EXIT WHEN alist_cursor%NOTFOUND;
IF p_appltop_name NOT IN ('GLOBAL','*PRESEEDED*')
THEN
println(p_appltop_name || ':');
for i in 1..p_patchlist.count
LOOP
p_patch_status := ad_patch.is_patch_applied('11i', p_appl_top_id, p_patchlist(i));
println('..Patch ' || a_abstract(i)
||' '||p_patchlist(i)||' was '||
p_patch_status);
END LOOP;
END IF;
println('.');
END LOOP;
close alist_cursor;
END;
/

For a Single Tier Install of Release 12 use this SELECT via sqlplus

SET head off Lines 120 pages 100
col n_patch format A65
col bug_number format A10
col patch_name format A10
spool atg_pf_ptch_level.txt
select ' atg_pf ' FROM dual;
/

select bug_number, decode(bug_number,
'7237006', 'R12.ATG_PF.A.DELTA.6',
'6594849', 'R12.ATG_PF.A.DELTA.5',
'6272680', 'R12.ATG_PF.A.delta.4',
'6077669', 'R12.ATG_PF.A.delta.3',
'5917344', 'R12.ATG_PF.A.delta.2',
'8919491', 'R12.ATG_PF.B.3',
'7651091', 'R12.ATG_PF.B.2',
'7307198', 'R12.ATG_PF.B.1'
) n_patch, last_update_date
FROM ad_bugs
WHERE bug_number
IN ('7237006','6594849','6272680','6077669','5917344','8919491','7651091','7307198');

For a Multi-Tier installation of Release 12, please use this SELECT via sqlplus

set serveroutput on size 100000
DECLARE
TYPE p_patch_array_type is varray(100) of varchar2(10);
TYPE a_abstract_array_type is varray(100) of varchar2(60);
p_patchlist p_patch_array_type;
a_abstract a_abstract_array_type;
p_appltop_name VARCHAR2(50);
p_patch_status VARCHAR2(15);
p_appl_top_id NUMBER;

CURSOR alist_cursor IS
SELECT appl_top_id, name
FROM ad_appl_tops;

procedure println(msg in varchar2)
IS
BEGIN
dbms_output.put_line(msg);
END;

BEGIN
open alist_cursor;

p_patchlist := p_patch_array_type( '7237006','6594849','6272680','6077669','5917344','8919491','7651091','7307198');
a_abstract := a_abstract_array_type(
'R12.ATG_PF.A.DELTA.6',
'R12.ATG_PF.A.DELTA.5',
'R12.ATG_PF.A.delta.4',
'R12.ATG_PF.A.delta.3',
'R12.ATG_PF.A.delta.2',
'8919491', 'R12.ATG_PF.B.3',
'7651091', 'R12.ATG_PF.B.2',
'7307198', 'R12.ATG_PF.B.1');

LOOP
FETCH alist_cursor INTO p_appl_top_id, p_appltop_name;
EXIT WHEN alist_cursor%NOTFOUND;
IF p_appltop_name NOT IN ('GLOBAL','*PRESEEDED*')
THEN
println(p_appltop_name || ':');
for i in 1..p_patchlist.count
LOOP
p_patch_status := ad_patch.is_patch_applied('12', p_appl_top_id, p_patchlist(i));
println('..Patch ' || a_abstract(i)
||' '||p_patchlist(i)||' was '||
p_patch_status);
END LOOP;
END IF;
println('.');
END LOOP;
close alist_cursor;
END;
/