Oracle RMS Item Master
Everything in Oracle RMS revolves around items. The Item Master is where every product begins — its type, its level in a hierarchy, its classification, its status, and its relationship to suppliers and locations. If you don't understand ITEM_MASTER, you cannot write reliable RMS code.
What is the Item Master?
The ITEM_MASTER table is the central product catalog of Oracle RMS. Every product that exists in the system — whether it is a single sellable unit, a parent style, a pack of multiple items, or an inner component — has exactly one row in ITEM_MASTER. This table is the anchor point that connects the product to the merchandise hierarchy, to its suppliers, to its locations, and ultimately to every transaction that involves it.
Unlike a flat product list, the Oracle RMS item model is structured. Items can exist at different levels within a parent-child hierarchy (a style and its SKUs, for example), they can be packs containing multiple units, and they carry rich attributes covering everything from VAT treatment to unit of measure to differentiator values like colour and size.
Almost every table in Oracle RMS joins back to ITEM_MASTER directly
or indirectly. ITEM_LOC, ITEM_SUPPLIER,
ITEM_LOC_SOH, ORDLOC, TSFDETAIL — they all
reference ITEM_MASTER.ITEM. A solid understanding of the item model
is the foundation for every RMS query you will ever write.
The primary key of ITEM_MASTER is the column ITEM — declared as VARCHAR2(25). This single fact causes more bugs in RMS integrations than almost anything else. Item numbers in Oracle RMS are always strings, never integers, and must always be treated as such in SQL, PL/SQL, and any external system.
Item Levels — Transaction, Style and SKU
Oracle RMS supports items structured across up to three levels of a parent-child hierarchy. Two columns on ITEM_MASTER control this: ITEM_LEVEL (the position of this specific item in its hierarchy) and TRAN_LEVEL (the level at which transactions — sales, orders, transfers — actually occur).
The simplest structure. A single item that is both the catalog entry and the transaction unit. No parent, no children. Most basic retail items — a book, a bottle of shampoo — live here. ITEM_LEVEL = 1 and TRAN_LEVEL = 1.
The parent in a two-level hierarchy. A style groups related SKUs together — for example, a shirt model that comes in multiple sizes. The style itself cannot be ordered or sold. It exists as a reporting and catalog grouping. TRAN_LEVEL = 2 means transactions happen at the child level.
The child in a two-level hierarchy. This is where selling, ordering, and stock movements happen. Each SKU has its own item number in ITEM_MASTER and references its parent style via PARENT_ITEM. Differentiator values (colour, size, etc.) are stored on the SKU row.
Used in three-level hierarchies — for example, a style at Level 1, a colour-based parent at Level 2, and a specific size/colour combination at Level 3. The Level 3 item is the transaction unit. Three-level structures are less common but fully supported in RMS.
Items where ITEM_LEVEL TRAN_LEVEL are parent/style-level items.
You cannot create a purchase order line, a transfer line, or a sales
transaction against a style — only against its transaction-level children.
Code that tries to do so will fail at the RMS validation layer with a level
mismatch error.
Item Types — Regular, Simple Pack and Complex Pack
Beyond the level structure, RMS items are classified by whether they are standalone items or pre-packed bundles. This is controlled by two indicator columns: PACK_IND and SIMPLE_PACK_IND.
The most common item type. A regular item is a single, discrete sellable unit. It has its own stock on hand, its own cost and retail price, and its own supplier linkage. Whether it is a transaction-level item or a SKU within a style hierarchy, if PACK_IND = 'N' it is a regular item.
| Column | Type | Description |
|---|---|---|
PACK_IND | VARCHAR2(1) | — this item is not a pack |
SIMPLE_PACK_IND | VARCHAR2(1) | — not applicable for regular items |
ITEM_LEVEL | NUMBER(1) | 1, 2, or 3 depending on hierarchy depth |
TRAN_LEVEL | NUMBER(1) | The level at which transactions are posted |
A simple pack is a pre-packed bundle containing multiple units of the same item. A 12-pack of water bottles is a simple pack — the pack item has its own item number, but each unit inside is the same component item. Simple packs are commonly used for vendor pre-packs that are received as a unit and broken down at the store.
The relationship between the pack item and its component is stored in V_PACKSKU_QTY (a view) or the underlying PACKSKU table.
| Column | Type | Description |
|---|---|---|
PACK_IND | VARCHAR2(1) | — this item is a pack |
SIMPLE_PACK_IND | VARCHAR2(1) | — all units in the pack are the same item |
ORDERABLE_IND | VARCHAR2(1) | Usually — packs are ordered from suppliers as a unit |
SELLABLE_IND | VARCHAR2(1) | Depends on configuration — some packs are sold as-is |
A complex pack contains multiple different component items at specified quantities — for example, a gift set containing a perfume, a moisturiser, and a face wash. Each component has its own item number and quantity within the pack. Complex packs have their own ITEM_MASTER row and their own stock on hand as a pack unit.
The component breakdown is in the PACKSKU table, which holds one row per component per pack with the quantity of that component in the pack.
| Column | Type | Description |
|---|---|---|
PACK_IND | VARCHAR2(1) | — this item is a pack |
SIMPLE_PACK_IND | VARCHAR2(1) | — components are different items |
SELLABLE_IND | VARCHAR2(1) | Typically — sold as a bundled unit |
ORDERABLE_IND | VARCHAR2(1) | Typically — ordered and received as a unit |
ITEM_MASTER — Key Columns Deep Dive
The ITEM_MASTER table has over 80 columns in a full Oracle RMS installation. These are the columns you will encounter most frequently as a developer.
| Column | Type | Description |
|---|---|---|
ITEMPK | VARCHAR2(25) | Primary key. Always a string — zero-padded in some configurations. Never cast to NUMBER. |
ITEM_DESC | VARCHAR2(250) | Short description. Also stored in ITEM_DESC table for multilingual support. |
ITEM_LEVEL | NUMBER(1) | Position of this item in its level hierarchy: 1, 2, or 3. |
TRAN_LEVEL | NUMBER(1) | The level at which transactions post. For a transaction item: ITEM_LEVEL = TRAN_LEVEL. |
DEPTFK | NUMBER(4) | FK → DEPS.DEPT. Department classification. |
CLASSFK | NUMBER(4) | FK → CLASS(DEPT, CLASS). Class classification. |
SUBCLASSFK | NUMBER(4) | FK → SUBCLASS(DEPT, CLASS, SUBCLASS). Leaf of the merchandise hierarchy. |
STATUS | VARCHAR2(1) | Item lifecycle status. A = Active, I = Inactive, D = Deleted, C = Candidate. |
PACK_IND | VARCHAR2(1) | Y = this item is a pack (simple or complex). N = regular item. |
SIMPLE_PACK_IND | VARCHAR2(1) | Y = simple pack (same component). N = complex pack (mixed components). Only relevant when PACK_IND = 'Y'. |
PARENT_ITEMFK | VARCHAR2(25) | FK → ITEM_MASTER.ITEM. The parent item number for Level 2 and Level 3 items. NULL for Level 1 items. |
DIFF_1 | VARCHAR2(10) | First differentiator value — e.g. a specific colour code like 'BLK'. Applied to Level 2/3 child items. |
DIFF_2 | VARCHAR2(10) | Second differentiator value — e.g. a specific size code like 'XL'. |
DIFF_3 | VARCHAR2(10) | Third differentiator value — additional variant dimension. |
DIFF_4 | VARCHAR2(10) | Fourth differentiator value — additional variant dimension. |
DIFF_TYPE_1 | VARCHAR2(6) | Differentiator type for DIFF_1 — e.g. 'COLOUR'. Defined in DIFF_TYPE table. |
DIFF_TYPE_2 | VARCHAR2(6) | Differentiator type for DIFF_2 — e.g. 'SIZE'. |
SELLABLE_IND | VARCHAR2(1) | Y = item can be sold. N = internal/component use only. |
ORDERABLE_IND | VARCHAR2(1) | Y = item can be placed on a purchase order. |
SHIP_ALONE_IND | VARCHAR2(1) | Y = item must be shipped in its own carton (oversized/fragile items). |
UNIT_OF_MEASURE | VARCHAR2(4) | Base UOM — EA (each), KG, LT, etc. |
ITEM_XFORM_IND | VARCHAR2(1) | Y = transformable item (can be broken into components or built from them). |
GIFT_WRAP_IND | VARCHAR2(1) | Y = eligible for gift wrapping service. |
VAT_TYPE | VARCHAR2(6) | VAT calculation method — SIMPLE, COMPOUND, etc. |
HANDLING_TEMP | VARCHAR2(6) | Temperature requirement for storage and transport. |
WEIGHT | NUMBER(12,4) | Item weight in WEIGHT_UOM units. |
WEIGHT_UOM | VARCHAR2(4) | Unit of measure for weight — KG, LB, etc. |
LENGTH | NUMBER(12,4) | Item physical length in DIMENSION_UOM units. |
HEIGHT | NUMBER(12,4) | Item physical height in DIMENSION_UOM units. |
DEPTH | NUMBER(12,4) | Item physical depth in DIMENSION_UOM units. |
DIMENSION_UOM | VARCHAR2(4) | Unit of measure for physical dimensions — CM, IN, etc. |
Item Status Codes
The STATUS column on ITEM_MASTER drives a large amount of RMS business logic. Many batch processes, validation rules, and ordering controls check item status before allowing an operation to proceed.
The normal operating state. An Active item can be ordered, received, transferred, sold (subject to SELLABLE_IND), and ranged to new locations. The vast majority of queries filtering for live operational items should include AND STATUS = 'A'.
An Inactive item still exists in the system and may still have stock on hand. It cannot be ordered from suppliers or ranged to new locations. Existing stock can be sold and transferred. Inactive status is often used during range reviews — items no longer being bought but still being cleared through existing stock.
If you are writing inventory reconciliation or stock on hand queries, do not
filter STATUS = 'A' only. Inactive items with positive
STOCK_ON_HAND in ITEM_LOC_SOH are still real inventory that
must be accounted for.
A Candidate item has been created in RMS but is not yet ready for operational use. It is pending approval or completion of mandatory attributes. Candidate items cannot be ordered or ranged. In many implementations, items are created in Candidate status via integrations and only promoted to Active once all required data has been validated and approved.
A Deleted item has been marked for removal. RMS does not typically hard-delete item rows because of the cascade of historical references (stock ledger entries, purchase orders, sales history). Instead, items are soft-deleted by setting STATUS to 'D'. Deleted items should be excluded from almost all operational queries. Always filter these out in integration scripts that look up items.
ITEM_DESC — Multilingual Description Storage
Oracle RMS is built to support multiple languages. Item descriptions are stored in two places simultaneously: a short description in ITEM_MASTER.ITEM_DESC and the full, translatable description in the separate ITEM_DESC table.
The ITEM_DESC table has a composite primary key of ITEM + LANG. Every item will have at least one row in this table for the base language of the RMS instance. Multilingual deployments add additional rows for each supported language.
| Column | Type | Description |
|---|---|---|
ITEMPKFK | VARCHAR2(25) | FK → ITEM_MASTER.ITEM |
LANGPK | NUMBER(6) | Language code. Matches COMPHEAD.LANG for the base language. |
ITEM_DESC | VARCHAR2(250) | Full item description in this language. |
SHORT_DESC | VARCHAR2(120) | Abbreviated description for space-constrained displays. |
SECONDARY_DESC | VARCHAR2(250) | Secondary marketing description. Used in some storefront and label integrations. |
LONG_DESC | VARCHAR2(4000) | Long-form product description. Available in newer RMS versions for e-commerce integration. |
Relying on ITEM_MASTER.ITEM_DESC alone is a common shortcut that
breaks in multilingual environments. The authoritative description for
reporting and display is in the ITEM_DESC table. Always join with
AND id.lang = :v_lang (or the base language code from
COMPHEAD). In single-language instances this matters less, but the
habit will save you when you encounter a multilingual deployment.
How Items Attach to the Merchandise Hierarchy
Every item in ITEM_MASTER must belong to a valid DEPT + CLASS + SUBCLASS combination. These three columns form a composite foreign key reference to the bottom of the merchandise hierarchy. This attachment:
- Determines the item's VAT region defaults (from
DEPS.VAT_REGION) - Places the item under a Buyer and Merchandiser's responsibility
- Controls which pricing rules and markdown calendars apply
- Drives all reporting rollups from item level up through the hierarchy
To traverse from an item all the way up to its Division:
ITEM_MASTER → SUBCLASS → CLASS → DEPS → GROUPS → DIVISION. The
join keys are IM.DEPT, then IM.DEPT + IM.CLASS, then
IM.DEPT alone for DEPS, then DEPS.GROUP_NO for GROUPS,
then GROUPS.DIV_NO for DIVISION. This is the most written query
pattern in all of Oracle RMS development.
RC:Storefront is designed around the same structured catalog model as Oracle RMS — departments, categories, and attribute layers baked in, syncing natively with RC:OMS inventory in real time. Self-hosted on your own VPS. Zero transaction fees. Full data ownership.
See RC:Storefront →Key Database Tables — Quick Reference
Practical SQL Examples
1. Full item profile with hierarchy path
-- Complete item record with full merchandise hierarchy rollup
SELECT im.item,
id.item_desc,
im.item_level,
im.tran_level,
im.status,
im.pack_ind,
im.unit_of_measure,
d.div_name,
g.group_name,
dp.dept_name,
c.class_name,
s.sub_name
FROM item_master im
JOIN item_desc id ON id.item = im.item
AND id.lang = (SELECT lang FROM comphead)
JOIN subclass s ON s.dept = im.dept
AND s.class = im.class
AND s.subclass = im.subclass
JOIN class c ON c.dept = im.dept
AND c.class = im.class
JOIN deps dp ON dp.dept = im.dept
JOIN groups g ON g.group_no = dp.group_no
JOIN division d ON d.div_no = g.div_no
WHERE im.item = :v_item;2. Find all SKUs under a style parent
-- All transaction-level child items beneath a style
-- Works for both 2-level (style → SKU) and 3-level hierarchies
SELECT im.item,
id.item_desc,
im.item_level,
im.diff_1,
im.diff_2,
im.diff_type_1,
im.diff_type_2,
im.status
FROM item_master im
JOIN item_desc id ON id.item = im.item
AND id.lang = (SELECT lang FROM comphead)
WHERE im.parent_item = :v_parent_item
AND im.status = 'A'
ORDER BY im.diff_1, im.diff_2, im.item;3. Item status audit — counts by department
-- Item count by status within a department
-- Useful for range reviews and go-live readiness checks
SELECT dp.dept,
dp.dept_name,
im.status,
COUNT(im.item) item_count,
COUNT(CASE WHEN im.tran_level = im.item_level THEN 1 END)
tran_level_items
FROM deps dp
JOIN item_master im ON im.dept = dp.dept
WHERE dp.dept = :v_dept
GROUP BY dp.dept, dp.dept_name, im.status
ORDER BY im.status;4. Pack component breakdown for a complex pack
-- Components inside a complex pack item with individual item details
SELECT ps.pack_no,
ps.item component_item,
id.item_desc component_desc,
ps.quantity qty_in_pack,
cim.status component_status,
cim.unit_of_measure
FROM packsku ps
JOIN item_master cim ON cim.item = ps.item
JOIN item_desc id ON id.item = ps.item
AND id.lang = (SELECT lang FROM comphead)
WHERE ps.pack_no = :v_pack_item
ORDER BY ps.item;5. PL/SQL — Validate item exists, is active, and is at transaction level
-- Item validation function used in integration staging pipelines
-- Returns TRUE only if the item is active and can receive transactions
FUNCTION item_is_valid_tran (
p_item IN item_master.item%TYPE
) RETURN BOOLEAN IS
l_item_level item_master.item_level%TYPE;
l_tran_level item_master.tran_level%TYPE;
l_status item_master.status%TYPE;
BEGIN
SELECT item_level, tran_level, status
INTO l_item_level, l_tran_level, l_status
FROM item_master
WHERE item = p_item;
-- Item must be active AND at transaction level
RETURN (l_status = 'A' AND l_item_level = l_tran_level);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN FALSE;
WHEN OTHERS THEN
RETURN FALSE;
END item_is_valid_tran;
Common Gotchas for Developers
- !
Treating ITEM as a number in SQL or PL/SQL. The
ITEMcolumn isVARCHAR2(25). WritingWHERE item = 100050without quotes triggers an implicit conversion that suppresses the index on the ITEM column and causes a full table scan on a table that may have millions of rows. Always quote item numbers:WHERE item = '100050'. - !
Ordering or transferring a style-level item directly.
Items where
ITEM_LEVEL TRAN_LEVELare parent/style items and cannot appear on transaction documents — purchase orders, transfers, sales orders. Only items whereITEM_LEVEL = TRAN_LEVELcan be transacted. Integration scripts that do not check this will receive a validation error from the RMS API layer. - !
Querying ITEM_MASTER.ITEM_DESC without joining ITEM_DESC. The
ITEM_DESCcolumn onITEM_MASTERis a convenience field and may not always be kept in sync in every RMS implementation. The authoritative, multilingual description is in theITEM_DESCtable. Always joinITEM_DESCwhen displaying item names in reports or integrations. - !
Checking STATUS = 'A' only and missing Inactive items with stock.
Inactive items (
STATUS = 'I') can still have positiveSTOCK_ON_HANDinITEM_LOC_SOH. Any inventory reconciliation, stock audit, or on-hand reporting query that hard-filters for only Active status will produce incorrect totals if Inactive items hold stock. - !
Confusing ITEM_MASTER.ITEM_DESC with the item being ranged.
An item existing in
ITEM_MASTERwithSTATUS = 'A'does not mean it is available at any location. An item must be ranged to a location — a row must exist inITEM_LOC— before it can be ordered, received, or sold at that location. - !
Pack SOH is not the sum of component SOH. Pack items have their own independent stock on hand in
ITEM_LOC_SOH. If you receive a pack item, the pack SOH increases — not the component item SOH. The component SOH increases only when the pack is broken down. Queries that sum all SOH without accounting for pack relationships will double-count inventory. - !
Using PARENT_ITEM to traverse beyond two levels without recursion.
PARENT_ITEMpoints to an item's immediate parent only. In a three-level hierarchy, a Level 3 item'sPARENT_ITEMis a Level 2 item, whose ownPARENT_ITEMis the Level 1 style. A single-hop join onPARENT_ITEMwill not reach the Level 1 style from a Level 3 SKU. Use a hierarchical query (CONNECT BY PRIOR) or two explicit joins when you need to reach the top of a multi-level item tree.
Key Takeaways
- ✓ITEM_MASTER is the root of all product data in Oracle RMS. Every item — regular, pack, style, or SKU — has exactly one row here.
- ✓The ITEM column is VARCHAR2(25) — always a string. Never treat item numbers as integers in SQL, PL/SQL, or integration code.
- ✓ITEM_LEVEL indicates where this item sits in its hierarchy (1, 2, or 3). TRAN_LEVEL indicates at which level transactions post. Only items where ITEM_LEVEL = TRAN_LEVEL can be ordered, received, or sold.
- ✓PACK_IND = 'Y' marks a pack item. SIMPLE_PACK_IND = 'Y' means all components are the same item; 'N' means mixed components. Pack items have their own independent stock on hand.
- ✓PARENT_ITEM on a child item holds the immediate parent's item number. In three-level hierarchies, reaching the Level 1 style from a Level 3 SKU requires two hops or a hierarchical query.
- ✓Item descriptions are stored in both ITEM_MASTER.ITEM_DESC (convenience) and the ITEM_DESC table (authoritative, multilingual). Always join ITEM_DESC for reports and integrations.
- ✓STATUS = 'A' is Active (fully operational), 'I' is Inactive (no new orders/ranging but may hold stock), 'C' is Candidate (pending approval), 'D' is soft-deleted.
