Phase 3 · Item Management · Oracle RMS Series

Oracle RMS Item Creation Workflow

Creating an item in Oracle RMS is not a single INSERT. It is a seven-step pipeline spanning multiple tables — from generating an item number to writing the final ITEM_LOC row that makes the item available at a physical location. This guide walks every step with the SQL to match.

16 min read📅April 22, 2026✍️Priyanshu Pandey📚Oracle RMS Series

Overview — The Item Creation Pipeline

In Oracle RMS, a "created item" is not simply a row in a table. It is a chain of related records across multiple tables, each unlocking a capability the item needs to participate in retail operations — to be described, to be ordered, to hold stock, and finally to be sold at a location.

The full creation pipeline has seven distinct steps. Some steps are always mandatory. Some are conditional. One step — ranging — is the final gate that makes an item commercially operational at a specific store or warehouse.

Calendar Rollup Hierarchy
Step 1 — Item NumberVARCHAR2(25)

An item number is reserved from the sequence or assigned manually. This becomes the primary key for all downstream records.

Step 2 — ITEM_MASTERCore record

The root row is written. Item type, level, merchandise hierarchy (DEPT/CLASS/SUBCLASS), and pack indicators are all set here.

Step 3 — ITEM_DESCPer language

At least one description row is written in the base language. Additional rows for each supported language follow.

Step 4 — ITEM_SUPPLIERCost & lead time

The item is linked to at least one active supplier. Unit cost, lead time, and pack sizes are set. One supplier must be flagged as primary.

Step 5 — UDA AssignmentOptional

User Defined Attributes are assigned if the item's department requires them. Season, brand, material — retailer-defined attributes live here.

Step 6 — Activation'C' → 'A'

Item status is promoted from Candidate to Active. This is the approval gate. Only Active items can appear on purchase orders and transfers.

Step 7 — ITEM_LOC RangingOperational

The item is ranged to one or more stores or warehouses. ITEM_LOC and ITEM_LOC_SOH rows are created. The item is now orderable and stockable at those locations.

💡
Two different creation paths — UI vs Integration

Items can be created through the Oracle RMS Forms-based UI (one at a time, manually) or through an integration pipeline (bulk, programmatic). Both paths must satisfy the same data requirements across the same tables. The integration path uses a staging table layer — covered in the Integration-Based Item Creation section below.

Prerequisites

Prerequisites — What Must Exist Before You Start

Before a single item can be created, the following foundation data must already exist and be in Active status. Attempting to create an item against missing foundation data will either fail immediately with an integrity constraint error or silently produce an incomplete record that fails downstream.

01Merchandise Hierarchy
DEPS · CLASS · SUBCLASS

The DEPT, CLASS, and SUBCLASS that the item will belong to must all exist as valid, active rows in DEPS, CLASS, and SUBCLASS respectively. The composite combination must be valid — you cannot reference a CLASS that belongs to a different DEPT than the one you are using.

SQL
-- Validate that a dept/class/subclass combination exists before item creation
SELECT s.dept, s.class, s.subclass,
dp.dept_name, c.class_name, s.sub_name
FROM   subclass s
JOIN   class    c  ON c.dept  = s.dept AND c.class = s.class
JOIN   deps     dp ON dp.dept = s.dept
WHERE  s.dept     = :v_dept
AND  s.class    = :v_class
AND  s.subclass = :v_subclass;
02Active Supplier
SUPS

At least one active supplier must exist in SUPS before Step 4 (ITEM_SUPPLIER). The item itself can be created in ITEM_MASTER without a supplier, but it cannot be activated or ordered until the supplier link is in place. Getting this dependency wrong is the most common cause of items stuck in Candidate status.

03Diff Types (if styled item)
DIFF_TYPE · DIFF_GROUP

If you are creating a style with child SKUs differentiated by colour, size, or other attributes, the differentiator type must exist in the DIFF_TYPE table and values must exist in DIFF_IDS. Without valid diff records, you cannot create child-level items that reference those differentiators. This only applies to multi-level item structures — single-level transaction items have no differentiators.

04Valid Locations (for ranging)
STORE · WH

For Step 7 (ranging), every location you intend to range the item to must exist in either STORE (with STATUS = 'A') or WH. Ranging to an inactive or non-existent location will fail at the constraint level. For warehouse ranging, ensure you are targeting a Physical warehouse — virtual warehouses cannot directly receive ranged items in all RMS configurations.

Step 1

Step 1 — Item Number Generation

The item number is the primary key of ITEM_MASTER — declared as VARCHAR2(25). Every downstream table that references an item uses this number. Getting it right at the start matters because it cannot be changed once created.

Oracle RMS supports two item numbering approaches:

Auto-generated numbers — Most implementations use a database sequence (ITEM_NO_SEQ) to generate item numbers automatically. The RMS front-end calls ITEM_NO_SEQ.NEXTVAL when a new item is initiated. Numbers are typically numeric strings, often zero-padded to a fixed width (e.g. '0000100050').

Manual / externally assigned numbers — Some retailers bring item numbers from an upstream system (ERP, PLM). In this case the item number is passed in directly. The RMS import layer inserts this value as-is into ITEM_MASTER.ITEM.

⚠️
Always store item numbers as strings — never cast to NUMBER

The moment an item number like '000012345' is cast to a number, the leading zeros are lost and it becomes 12345. That is a completely different value. Every external system, every spreadsheet, every API endpoint that handles item numbers must preserve them as strings. This is one of the most common and most damaging integration bugs in Oracle RMS projects.

Step 2

Step 2 — Creating the ITEM_MASTER Record

The ITEM_MASTER row is the root record. Everything else in the creation workflow is a child or satellite record of this row. When creating via integration, this is the first INSERT of the pipeline.

02Mandatory ITEM_MASTER Columns
Minimum viable record

Not all 80+ columns on ITEM_MASTER need to be set at creation time, but the following columns are always required for a valid, non-rejected record:

ColumnTypeDescription
ITEMPK
VARCHAR2(25)Item number — from sequence or external assignment
ITEM_DESC
VARCHAR2(250)Short description. Also stored in ITEM_DESC table.
ITEM_LEVEL
NUMBER(1)Position in hierarchy: 1 (standalone), 2 (child of style), 3 (child of level-2)
TRAN_LEVEL
NUMBER(1)Transaction level: must equal ITEM_LEVEL for transaction items
DEPTFK
NUMBER(4)FK → DEPS.DEPT. Must be a valid active department.
CLASSFK
NUMBER(4)FK → CLASS(DEPT,CLASS). Composite FK with DEPT.
SUBCLASSFK
NUMBER(4)FK → SUBCLASS(DEPT,CLASS,SUBCLASS). Three-column composite FK.
STATUS
VARCHAR2(1)Set to 'C' (Candidate) at creation. Promoted to 'A' in Step 6.
SELLABLE_IND
VARCHAR2(1)Y = can be sold. N = internal/component only.
ORDERABLE_IND
VARCHAR2(1)Y = can be placed on purchase orders.
PACK_IND
VARCHAR2(1)N for regular items. Y for simple or complex packs.
UNIT_OF_MEASURE
VARCHAR2(4)EA (each), KG, LT, etc. Must match a valid UOM code.

For child items in a style hierarchy (Level 2 or Level 3), two additional columns must be set at creation:

ColumnTypeDescription
PARENT_ITEMFK
VARCHAR2(25)FK → ITEM_MASTER.ITEM. Points to the immediate parent. NULL for Level 1 items.
DIFF_1
VARCHAR2(10)First differentiator value (e.g. colour code 'BLK'). Must exist in DIFF_IDS.
DIFF_TYPE_1
VARCHAR2(6)The type for DIFF_1 (e.g. 'COLOUR'). Must exist in DIFF_TYPE.
DIFF_2
VARCHAR2(10)Second differentiator value (e.g. size code 'XL'). Optional second dimension.
DIFF_TYPE_2
VARCHAR2(6)The type for DIFF_2 (e.g. 'SIZE').
⚠️
STATUS must be 'C' at creation — not 'A'

It is technically possible to INSERT an ITEM_MASTER row with STATUS = 'A' via direct SQL. Do not do this. The RMS application layer performs validation checks when promoting from Candidate to Active — checking for supplier linkage, descriptions, and mandatory attributes. Skipping this gate by inserting directly as Active leaves items that may be missing critical data in a fully operational state, which causes silent downstream failures.

Step 3

Step 3 — Item Descriptions (ITEM_DESC)

The ITEM_DESC table stores the translatable, multilingual description for every item. At minimum, one row must exist in the base language of the RMS instance. The base language is found in COMPHEAD.LANG.

03ITEM_DESC
Multilingual descriptions

The composite primary key is ITEM + LANG. Inserting without the correct LANG value is a common integration error — the row is created but the RMS UI cannot find it because it queries by the base language code.

ColumnTypeDescription
ITEMPKFK
VARCHAR2(25)FK → ITEM_MASTER.ITEM
LANGPK
NUMBER(6)Language code. Get base language from: SELECT lang FROM comphead
ITEM_DESC
VARCHAR2(250)Primary display description. Used in RMS screens and most reports.
SHORT_DESC
VARCHAR2(120)Abbreviated description for space-constrained contexts (labels, till receipts).
SECONDARY_DESC
VARCHAR2(250)Secondary marketing description. Used in some storefront integrations.
LONG_DESC
VARCHAR2(4000)Long-form description. Available in newer RMS versions for e-commerce feeds.
SQL
-- Insert ITEM_DESC in the base language — the minimal required description row
INSERT INTO item_desc
(item, lang, item_desc, short_desc)
SELECT :v_item,
ch.lang,
:v_item_desc,
:v_short_desc
FROM   comphead ch;
Step 4

Step 4 — Item-Supplier Setup

An item without a supplier cannot be ordered from anyone. Step 4 creates the commercial link between the item and its source of supply. This step involves two tables: ITEM_SUPPLIER (the trading agreement) and ITEM_SUPP_COUNTRY (the country of origin and FOB cost).

04ITEM_SUPPLIER
Trading agreement

One row per item-supplier combination. If the item has multiple suppliers, there is one row here per supplier. Exactly one row must have PRIMARY_SUPP_IND = 'Y' — the default source of replenishment.

ColumnTypeDescription
ITEMPKFK
VARCHAR2(25)FK → ITEM_MASTER.ITEM
SUPPLIERPKFK
NUMBER(10)FK → SUPS.SUPPLIER
UNIT_COST
NUMBER(20,4)Agreed unit cost from this supplier in supplier's currency
LEAD_TIME
NUMBER(4)Lead time in days for this item from this supplier. Overrides SUPS.LEAD_TIME.
SUPP_PACK_SIZE
NUMBER(12,4)Outer case quantity — units per carton as shipped by this supplier
INNER_PACK_SIZE
NUMBER(12,4)Inner pack quantity within each case
PRIMARY_SUPP_IND
VARCHAR2(1)Y = default supplier. Exactly one 'Y' allowed per item across all ITEM_SUPPLIER rows.
PRIMARY_COUNTRY_ID
VARCHAR2(3)Default country of origin for this item-supplier combination
ROUND_TO_INNER_PKG
VARCHAR2(1)Y = PO quantities must be multiples of INNER_PACK_SIZE
ROUND_TO_CASE
VARCHAR2(1)Y = PO quantities must be multiples of SUPP_PACK_SIZE
04bITEM_SUPP_COUNTRY
FOB cost by origin

One row per item-supplier-origin_country combination. Stores the FOB (Free on Board) cost at the point of origin. The same supplier may manufacture the same item in multiple countries at different costs. The composite PK is ITEM + SUPPLIER + ORIGIN_COUNTRY_ID.

ColumnTypeDescription
ITEMPKFK
VARCHAR2(25)FK → ITEM_MASTER.ITEM
SUPPLIERPKFK
NUMBER(10)FK → SUPS.SUPPLIER
ORIGIN_COUNTRY_IDPK
VARCHAR2(3)ISO 3166-1 alpha-3 country code — e.g. 'IND', 'CHN', 'BGD'
UNIT_COST
NUMBER(20,4)FOB cost at origin in supplier currency. Used as base for landed cost calculation.
SUPP_PACK_SIZE
NUMBER(12,4)Pack size from this country's factory — may differ from ITEM_SUPPLIER
PRIMARY_SUPP_IND
VARCHAR2(1)Y = this is the default sourcing country for this item-supplier pair
DUTY_PCT
NUMBER(12,4)Import duty percentage applicable from this country of origin
Step 5

Step 5 — UDA Assignment (Optional)

User Defined Attributes (UDAs) allow retailers to capture item attributes that are not covered by the standard RMS data model — things like season, brand tier, material composition, or fit type. UDAs are department-specific: a department may have mandatory UDAs that must be set before an item in that department can be activated.

There are three types of UDAs, each stored in its own table:

ColumnTypeDescription
Date
UDA_ITEM_DATE

Stores a date value for the UDA. Example: launch date, end-of-life date.

List of Values (LOV)
UDA_ITEM_LOV

Stores a code value from a predefined list. Example: Season = 'SS26', Brand Tier = 'PREMIUM'.

Free Form (FF)
UDA_ITEM_FF

Stores a free-text value. Example: marketing tagline, special handling instructions.

💡
Check for mandatory UDAs before activation

Some departments require mandatory UDA values before an item can be activated. The UDA_TYPE table has a REQUIRED_IND column that flags mandatory UDAs. Any item activation script should check that all required UDAs for the item's department are populated before attempting to promote status from 'C' to 'A'.

Step 6

Step 6 — Status Activation (Candidate → Active)

Until an item's status is 'A' (Active), it cannot appear on purchase orders, transfers, or any stock movement document. The status promotion from 'C' (Candidate) to 'A' is the approval gate that confirms the item's core setup is complete.

The activation validates — at minimum — that:

  • The item has at least one ITEM_SUPPLIER row with PRIMARY_SUPP_IND = 'Y'
  • At least one ITEM_DESC row exists in the base language
  • All mandatory UDAs for the department are set
  • For child items (Level 2/3): the parent item is also Active

The promotion itself is a simple UPDATE:

SQL
-- Promote item from Candidate to Active
-- Always validate prerequisites before running this
UPDATE item_master
SET    status = 'A'
WHERE  item   = :v_item
AND  status = 'C';
⚠️
Never activate in bulk without validation

Bulk-activating items by updating STATUS without checking prerequisites leaves broken items in Active state. An Active item without a primary supplier will fail when any replenishment batch tries to raise a purchase order against it. Always run the prerequisite validation query (see Practical SQL section) before any bulk activation.

Step 7

Step 7 — Ranging to Locations (ITEM_LOC)

Ranging is the act of making an item available at a specific location. Until an ITEM_LOC row exists for an item at a store or warehouse, that item does not exist at that location from RMS's perspective — it cannot be ordered to that location, cannot receive stock there, and cannot be sold there.

Each ITEM_LOC row represents one item at one location. Creating this row also triggers the creation of a corresponding ITEM_LOC_SOH row with zero stock on hand.

07ITEM_LOC
Ranging record

The composite primary key is ITEM + LOC + LOC_TYPE. The LOC_TYPE is 'S' for stores and 'W' for warehouses. Every column in this row has a business meaning — it is not just a link table.

ColumnTypeDescription
ITEMPKFK
VARCHAR2(25)FK → ITEM_MASTER.ITEM
LOCPK
NUMBER(10)Location number. STORE.STORE or WH.WH depending on LOC_TYPE.
LOC_TYPEPK
VARCHAR2(1)'S' = Store · 'W' = Warehouse. Always filter by both LOC and LOC_TYPE.
STATUS
VARCHAR2(1)A = Active (normal). I = Inactive (no new orders but can hold stock).
UNIT_RETAIL
NUMBER(20,4)Current selling price at this location. Can differ by location if price zones are used.
SELLING_UNIT_RETAIL
NUMBER(20,4)Retail price per selling unit (differs from UNIT_RETAIL for variable-weight items).
PRIMARY_SUPPFK
NUMBER(10)FK → SUPS.SUPPLIER. The primary supplier for replenishment at this specific location.
PRIMARY_CNTRY
VARCHAR2(3)Primary country of origin for ordering at this location.
STORE_ORD_MULT
NUMBER(12,4)Order multiple for store replenishment. Must be a multiple of INNER_PACK_SIZE.
MEAS_OF_EACH
NUMBER(12,4)Measure per each (for catch-weight items). NULL for standard unit items.
TI
NUMBER(12,4)Tier quantity (units per layer in a pallet). Used in warehouse space planning.
HI
NUMBER(12,4)High quantity (layers per pallet). Used with TI for full pallet ordering.

When a ranging record is created, RMS also creates the companion ITEM_LOC_SOH row initialised with zero stock:

SQL
-- After ITEM_LOC insert, verify ITEM_LOC_SOH was created with zero SOH
SELECT ils.item,
ils.loc,
ils.loc_type,
ils.stock_on_hand,
ils.av_cost,
ils.unit_retail
FROM   item_loc_soh ils
WHERE  ils.item     = :v_item
AND  ils.loc      = :v_loc
AND  ils.loc_type = :v_loc_type;
RC:OMS · Multi-Channel Order Management
Taking your items live across Amazon, Flipkart, Shopify and your own store?

The same item-to-location thinking that Oracle RMS applies to store ranging is what RC:OMS applies to channel management — every item ranged to every channel with real-time inventory sync. Double-entry ledger accuracy. No overselling. Built for Indian multi-channel sellers.

Launch RC:OMS Demo
Integration Path

Integration-Based Item Creation

When creating items in bulk through an external integration — from an ERP, a PLM system, or a migration — the direct table-insert approach is replaced by a staging-table pipeline. This is the standard Oracle Retail integration architecture: data lands in staging, is validated, and is then promoted into the live tables by a batch process.

The relevant staging tables for item creation are:

S1ITEM_IMPORT
Item Master staging

The primary staging table for ITEM_MASTER data. External systems write item records here with a STATUS of 'W' (waiting). The RMS batch processes reads these rows, validates them, and on success writes to ITEM_MASTER and updates staging status to 'P' (processed). Failures are recorded with status 'E' (error) and a message in the error column.

ColumnTypeDescription
ITEM
VARCHAR2(25)Item number. May be pre-assigned or populated by the batch if auto-generated.
STATUS
VARCHAR2(1)W = Waiting · P = Processed · E = Error. Poll this column to track progress.
ERROR_MSG
VARCHAR2(2000)Error description populated when STATUS = 'E'. This is your first debugging stop.
The integration validation pattern

Always validate staging data against the live foundation tables before submitting to the RMS batch. The three checks that catch 90% of integration failures: (1) DEPT + CLASS + SUBCLASS exists in SUBCLASS, (2) SUPPLIER exists in SUPS with SUP_STATUS = 'A', (3) item number is unique — no existing row in ITEM_MASTER with the same value. Run these checks before the batch, not after.

Quick Reference

Key Tables — Quick Reference

Item Creation Workflow — Tables Touched
ITEM_MASTER
Step 2 — Core record
ITEM_DESC
Step 3 — Descriptions
ITEM_SUPPLIER
Step 4 — Supplier link
ITEM_SUPP_COUNTRY
Step 4 — FOB cost
UDA_ITEM_LOV
Step 5 — UDA values
ITEM_LOC
Step 7 — Ranging
ITEM_LOC_SOH
Step 7 — Auto-created on ranging
ITEM_IMPORT
Integration staging
Practical SQL

Practical SQL Examples

1. Pre-activation validation — check all prerequisites for a Candidate item

SQL

-- Full prerequisite check before activating a Candidate item -- Returns one row per check with PASS/FAIL status SELECT 'Hierarchy exists' check_name, CASE WHEN s.dept IS NOT NULL THEN 'PASS' ELSE 'FAIL' END AS result FROM item_master im LEFT JOIN subclass s ON s.dept = im.dept AND s.class = im.class AND s.subclass = im.subclass WHERE im.item = :v_item

UNION ALL

SELECT 'Primary supplier exists' check_name, CASE WHEN is2.supplier IS NOT NULL THEN 'PASS' ELSE 'FAIL' END FROM item_master im LEFT JOIN item_supplier is2 ON is2.item = im.item AND is2.primary_supp_ind = 'Y' WHERE im.item = :v_item

UNION ALL

SELECT 'Base language description exists' check_name, CASE WHEN id.item IS NOT NULL THEN 'PASS' ELSE 'FAIL' END FROM item_master im LEFT JOIN item_desc id ON id.item = im.item AND id.lang = (SELECT lang FROM comphead) WHERE im.item = :v_item

UNION ALL

SELECT 'Item is in Candidate status' check_name, CASE WHEN im.status = 'C' THEN 'PASS' WHEN im.status = 'A' THEN 'ALREADY ACTIVE' ELSE 'FAIL' END FROM item_master im WHERE im.item = :v_item;

2. Check ranging completeness — which locations has an item been ranged to

SQL
-- Ranging status across all stores and warehouses for an item
SELECT il.loc,
il.loc_type,
CASE il.loc_type
WHEN 'S' THEN s.store_name
WHEN 'W' THEN w.wh_name
END                           loc_name,
il.status                     ranging_status,
il.unit_retail,
il.primary_supp,
ils.stock_on_hand
FROM   item_loc     il
LEFT JOIN store     s   ON s.store = il.loc AND il.loc_type = 'S'
LEFT JOIN wh        w   ON w.wh    = il.loc AND il.loc_type = 'W'
LEFT JOIN item_loc_soh ils ON ils.item     = il.item
AND ils.loc      = il.loc
AND ils.loc_type = il.loc_type
WHERE  il.item = :v_item
ORDER BY il.loc_type, loc_name;

3. Find Candidate items with missing supplier (stuck in pipeline)

SQL
-- Candidate items that cannot be activated — missing primary supplier
SELECT im.item,
id.item_desc,
im.dept,
dp.dept_name,
im.status,
im.create_datetime
FROM   item_master  im
LEFT JOIN item_desc id  ON  id.item = im.item
AND id.lang = (SELECT lang FROM comphead)
LEFT JOIN deps      dp  ON  dp.dept = im.dept
WHERE  im.status = 'C'
AND  NOT EXISTS (
SELECT 1
FROM   item_supplier is2
WHERE  is2.item             = im.item
AND  is2.primary_supp_ind = 'Y'
)
ORDER BY im.create_datetime DESC;

4. Items Active but not ranged to any location

SQL
-- Active items with zero ranging records
-- Common data quality issue after bulk activation without ranging
SELECT im.item,
id.item_desc,
im.dept,
dp.dept_name
FROM   item_master  im
LEFT JOIN item_desc id  ON  id.item = im.item
AND id.lang = (SELECT lang FROM comphead)
LEFT JOIN deps      dp  ON  dp.dept = im.dept
WHERE  im.status     = 'A'
AND  im.item_level = im.tran_level  -- transaction items only
AND  NOT EXISTS (
SELECT 1
FROM   item_loc il
WHERE  il.item = im.item
)
ORDER BY im.dept, im.item;

5. PL/SQL — Full item creation validation procedure

PL/SQL

-- Validate all item creation prerequisites and return an error list -- Designed for integration pipelines — call before submitting to staging batch PROCEDURE validate_item_creation ( p_item IN item_master.item%TYPE, p_dept IN item_master.dept%TYPE, p_class IN item_master.class%TYPE, p_subclass IN item_master.subclass%TYPE, p_supplier IN item_supplier.supplier%TYPE, p_errors OUT VARCHAR2 ) IS l_count PLS_INTEGER; l_errors VARCHAR2(4000) := NULL; BEGIN -- 1. Item number must not already exist SELECT COUNT(1) INTO l_count FROM item_master WHERE item = p_item; IF l_count > 0 THEN l_errors := l_errors || 'ITEM_EXISTS; '; END IF;

-- 2. Dept/Class/Subclass combination must be valid SELECT COUNT(1) INTO l_count FROM subclass WHERE dept = p_dept AND class = p_class AND subclass = p_subclass; IF l_count = 0 THEN l_errors := l_errors || 'INVALID_HIERARCHY; '; END IF;

-- 3. Supplier must exist and be active SELECT COUNT(1) INTO l_count FROM sups WHERE supplier = p_supplier AND sup_status = 'A'; IF l_count = 0 THEN l_errors := l_errors || 'INVALID_SUPPLIER; '; END IF;

p_errors := NVL(RTRIM(l_errors, '; '), 'OK'); END validate_item_creation;

Gotchas

Common Gotchas for Developers

  • !

    Ranging an item before activating it. An item with STATUS = 'C' (Candidate) can technically receive an ITEM_LOC row — the database will not always prevent it. But RMS batches that process ranged items (replenishment, price change, transfer) check item status before processing. A Candidate item at a live location will cause silent skips or errors across multiple batch jobs. Always activate before ranging.

  • !

    Missing ITEM_DESC base language row. The RMS UI looks up item names by joining ITEM_DESC on the base language code from COMPHEAD. If the ITEM_DESC row is missing or has the wrong LANG value, the item appears in the system with a blank description. It looks like a data error, but the item itself is fine — the description simply wasn't written to the right table with the right language key.

  • !

    Ranging to a Virtual Warehouse instead of a Physical one. Virtual warehouses (WH_TYPE = 'VA') are logical partitions within a Physical warehouse. In most RMS configurations, replenishment orders are raised to Physical warehouses, not Virtual ones. Ranging an item to a Virtual WH and then trying to raise a PO to that WH will fail at the PO validation stage with a warehouse type mismatch error.

  • !

    Duplicate PRIMARY_SUPP_IND = 'Y' rows in ITEM_SUPPLIER. If an integration INSERT creates two rows with PRIMARY_SUPP_IND = 'Y' for the same item, replenishment batches that select the primary supplier will return two rows and fail with a TOO_MANY_ROWS exception. RMS enforces this constraint at the application layer in the UI, but not always at the database level via a constraint — raw SQL inserts bypass the check silently.

  • !

    Setting TRAN_LEVEL incorrectly for a style parent. For a Level 1 style item whose children are the transaction units, the correct values are ITEM_LEVEL = 1 and TRAN_LEVEL = 2. Setting TRAN_LEVEL = 1 on a style tells RMS this item is itself the transaction unit — you can then technically place it on a PO. This creates order lines against an item that has no stock and no SKU children, producing receiving and inventory calculation failures.

  • !

    Not setting STORE_ORD_MULT correctly on ITEM_LOC. The STORE_ORD_MULT column on ITEM_LOC defines the minimum order multiple for store replenishment at that location. If it is set to zero or left NULL, automated replenishment batches will calculate a zero-quantity order and skip the item entirely. Set it to ITEM_SUPPLIER.INNER_PACK_SIZE at minimum.

  • !

    ITEM_LOC_SOH not being queried after ranging, only ITEM_LOC.

    When ranging occurs, RMS creates both the ITEM_LOC row and the companion ITEM_LOC_SOH row. Integration scripts that check ranging status by querying only ITEM_LOC are looking at the ranging configuration. To confirm the item is fully operational and carries a stock position (even a zero one), always verify the ITEM_LOC_SOH row also exists.

Key Takeaways

Key Takeaways
  • Item creation in Oracle RMS is a seven-step pipeline across multiple tables — not a single INSERT. Each step unlocks a specific capability: description, ordering, costing, UDAs, transactions, and stock.
  • Items start life as Candidates (STATUS = 'C'). They must be validated and activated (STATUS = 'A') before any purchase order, transfer, or replenishment can reference them.
  • ITEM_DESC requires at least one row in the base language (from COMPHEAD.LANG). Always use the comphead language code — never hardcode it.
  • Exactly one ITEM_SUPPLIER row must have PRIMARY_SUPP_IND = 'Y' per item before activation. Missing this row is the most common cause of items stuck in Candidate status.
  • Ranging creates both ITEM_LOC (configuration) and ITEM_LOC_SOH (stock position, initially zero). An un-ranged Active item cannot be ordered, received, or sold at any location.
  • In integrations, always validate DEPT+CLASS+SUBCLASS, SUPPLIER status, and item number uniqueness before submitting to the staging batch — not after. 90% of integration failures are caught by these three checks.
  • STORE_ORD_MULT on ITEM_LOC must be set correctly (≥ INNER_PACK_SIZE). A zero or NULL value causes replenishment batches to silently skip the item.
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 →