Phase 3 · Item Management · Oracle RMS Series

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.

14 min read📅April 21, 2026✍️Priyanshu Pandey📚Oracle RMS Series

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.

💡
Why the Item Master matters for developers

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

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).

Calendar Rollup Hierarchy
Level 1 — Transaction ItemITEM_LEVEL=1, TRAN_LEVEL=1

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.

Level 1 — Style (Parent)ITEM_LEVEL=1, TRAN_LEVEL=2

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.

Level 2 — SKU (Child of Style)ITEM_LEVEL=2, TRAN_LEVEL=2

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.

Level 3 — SKU (Child of Level 2)ITEM_LEVEL=3, TRAN_LEVEL=3

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.

⚠️
Style items cannot be ordered or sold directly

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

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.

01Regular Item
PACK_IND = 'N'

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.

ColumnTypeDescription
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
02Simple Pack
PACK_IND = 'Y', SIMPLE_PACK_IND = 'Y'

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.

ColumnTypeDescription
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
03Complex Pack
PACK_IND = 'Y', SIMPLE_PACK_IND = 'N'

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.

ColumnTypeDescription
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 Columns

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.

ColumnTypeDescription
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

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.

0AActive
STATUS = 'A'

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'.

0IInactive
STATUS = 'I'

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.

💡
Don't exclude Inactive items from all queries

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.

0CCandidate
STATUS = 'C'

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.

0DDeleted
STATUS = 'D'

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 Descriptions

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.

ColumnTypeDescription
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.
⚠️
Always join ITEM_DESC when displaying item names

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.

Hierarchy Attachment

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
The full item-to-hierarchy join pattern

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 · Self-Hosted Headless E-Commerce
Building a product catalog with the same disciplined hierarchy thinking?

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
Quick Reference

Key Database Tables — Quick Reference

Item Master — Core Tables in Oracle RMS
ITEM_MASTER
Item catalog root
ITEM_DESC
Item descriptions (multilingual)
PACKSKU
Pack component breakdown
ITEM_SUPPLIER
Item–Supplier link
ITEM_LOC
Item–Location ranging
ITEM_LOC_SOH
Stock on hand
Practical SQL

Practical SQL Examples

1. Full item profile with hierarchy path

SQL
-- 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

SQL
-- 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

SQL
-- 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

SQL
-- 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

PL/SQL

-- 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;

Gotchas

Common Gotchas for Developers

  • !

    Treating ITEM as a number in SQL or PL/SQL. The ITEM column is VARCHAR2(25). Writing WHERE item = 100050 without 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_LEVEL are parent/style items and cannot appear on transaction documents — purchase orders, transfers, sales orders. Only items where ITEM_LEVEL = TRAN_LEVEL can 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_DESC column on ITEM_MASTER is a convenience field and may not always be kept in sync in every RMS implementation. The authoritative, multilingual description is in the ITEM_DESC table. Always join ITEM_DESC when displaying item names in reports or integrations.

  • !

    Checking STATUS = 'A' only and missing Inactive items with stock.

    Inactive items (STATUS = 'I') can still have positive STOCK_ON_HAND in ITEM_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_MASTER with STATUS = 'A' does not mean it is available at any location. An item must be ranged to a location — a row must exist in ITEM_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_ITEM points to an item's immediate parent only. In a three-level hierarchy, a Level 3 item's PARENT_ITEM is a Level 2 item, whose own PARENT_ITEM is the Level 1 style. A single-hop join on PARENT_ITEM will 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

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.
RetailCoder
All systems operational
v1.0 Live

RC:OMS

Multi-channel order management with double-entry inventory ledger. Amazon, Flipkart, Shopify, WooCommerce — one source of truth.

Launch demo →
v1.0 Live

RC:Storefront

Self-hosted headless e-commerce. Your server, your data, zero transaction fees. Native RC:OMS inventory sync.

Visit Storefront →
Pipeline

RC:Pulse

AI-powered retail analytics and demand forecasting — built natively on top of your RC:OMS and Storefront data.

Request early access →
Built in India 🇮🇳  ·  Architected by Priyanshu PandeyTalk to an engineer →