Phase 2 · Foundation Data · Oracle RMS Series

Oracle RMS Suppliers & Partners

Every item in RMS was sourced from somewhere. Suppliers and Partners define the commercial relationships that make purchasing possible — from the top-level supplier master down to the item-level cost, lead time, and pack size that drives replenishment.

15 min read📅April 20, 2026✍️Priyanshu Pandey📚Oracle RMS Series

Suppliers vs Partners — What's the Difference?

Oracle RMS draws a clear distinction between two related but separate concepts: Suppliers and Partners.

A Supplier (stored in the SUPS table) is an entity from whom the retailer purchases merchandise. This is the company that raises invoices, receives purchase orders, and ships goods. Every item in RMS that is bought from an external source must have at least one supplier attached to it.

A Partner (stored in the PARTNER table) is a broader category. All suppliers are partners, but not all partners are suppliers. A Partner can be an agent, a broker, a consolidator, a factory, or a freight forwarder — any entity that plays a role in the supply chain without necessarily being the direct seller of goods. The PARTNER_TYPE column on the PARTNER table distinguishes which kind of relationship each partner record represents.

🔗
The relationship between SUPS and PARTNER

Every supplier in RMS is also a partner. When you create a supplier via the RMS front-end, the system creates both a SUPS record and a corresponding PARTNER record. The SUPPLIER column on SUPS and the PARTNER column on PARTNER share the same number space for supplier-type partners.

From a developer's perspective, the tables you will interact with most frequently are SUPS, ADDR (for supplier sites), ITEM_SUPPLIER (the item-supplier link table), and ITEM_SUPP_COUNTRY (sourcing country and origin cost). Understanding how these four tables connect is the foundation of all purchasing logic in RMS.

Supplier Master

The SUPS Table — Supplier Master Deep Dive

The SUPS table is the root of all supplier data in Oracle RMS. Every supplier that can appear on a purchase order, every supplier that can be linked to an item, every cost that is tracked back to a source — all of it starts with a row in SUPS.

01SUPS
Supplier Master

The supplier number (SUPPLIER) is a system-generated sequence and is the primary key. The SUPP_NAME is the trading name of the supplier. CURRENCY_CODE is the default transaction currency — all costs raised against this supplier will default to this currency unless overridden at the item level.

ColumnTypeDescription
SUPPLIERPK
NUMBER(10)System-generated supplier number. Primary key.
SUPP_NAME
VARCHAR2(240)Trading name of the supplier
SUP_STATUS
VARCHAR2(1)A = Active, I = Inactive. Inactive suppliers cannot receive new POs.
CURRENCY_CODE
VARCHAR2(3)Default transaction currency (ISO 4217). Costs default to this currency.
PAYMENT_TERMS
VARCHAR2(6)FK → TERMS table. Governs invoice payment schedule.
LEAD_TIME
NUMBER(4)Default lead time in days. Can be overridden at ITEM_SUPPLIER level.
REPLENISHMENT_CYCLE
NUMBER(4)Frequency of replenishment in days
BACKORDER_IND
VARCHAR2(1)Y = supplier accepts backorders. Used in replenishment decisions.
QC_IND
VARCHAR2(1)Y = items from this supplier require quality check on receipt
AUTO_APPR_INVC_IND
VARCHAR2(1)Y = invoices auto-approved without manual matching
💡
SUP_STATUS vs item-level status

Setting a supplier to SUP_STATUS = 'I' (Inactive) does not automatically deactivate all item-supplier records. Existing POs that reference the supplier may still process. Always audit ITEM_SUPPLIER rows before deactivating a supplier to understand the downstream impact.

Supplier Sites

Supplier Sites & Addresses (ADDR)

One of the most common sources of confusion for developers new to Oracle RMS is that the SUPS table contains no address columns. All address information — billing address, order address, remittance address — is stored in the shared ADDR table, linked to the supplier via a module-key pattern.

02ADDR
Supplier Sites / Addresses

The ADDR table is a generic multi-purpose address store used by suppliers, partners, stores, and more. The link to a specific entity is made through two discriminator columns: MODULE (set to 'SUPP' for supplier addresses) and KEY_VALUE (set to the supplier number). The ADDR_TYPE column then distinguishes which type of address the row represents.

ColumnTypeDescription
ADDR_KEYPK
NUMBER(10)System-generated surrogate key. Primary key of the ADDR table.
MODULE
VARCHAR2(6)Discriminator: 'SUPP' for supplier addresses
KEY_VALUE
VARCHAR2(20)The supplier number (as string) linking this address to SUPS
ADDR_TYPE
VARCHAR2(2)S0 = Main supplier · S1 = Order address · S2 = Payment address
ADD_1
VARCHAR2(240)Address line 1
ADD_2
VARCHAR2(240)Address line 2
CITY
VARCHAR2(120)City name
STATE
VARCHAR2(3)State / province code
POST
VARCHAR2(30)Postal / PIN code
COUNTRY_ID
VARCHAR2(3)Country code (ISO 3166-1 alpha-3)
⚠️
Why ADDR_TYPE matters in integrations

When building supplier integration scripts that push data into RMS, you must insert separate ADDR rows for each address type the supplier has. Inserting only an S0 address is fine for basic supplier setup, but order processing will fail if there's no S1 (order address) configured — RMS uses S1 when generating purchase order documents.

Partner Types

Partner Types — All Codes Explained

The PARTNER table stores all supply chain entities beyond the direct supplier relationship. Every partner has a PARTNER_TYPE code that defines their role. These codes appear frequently in purchasing logic, deal structures, and cost component configurations.

03PARTNER
Partner Master

The PARTNER table is the master record for all partner types. For supplier-type partners (where PARTNER_TYPE = 'SU'), there is typically a corresponding row in SUPS with the same ID. For non-supplier partners like agents or factories, only the PARTNER record exists.

ColumnTypeDescription
PARTNERPK
NUMBER(10)Unique partner number
PARTNER_TYPE
VARCHAR2(2)AG / BR / CO / FA / IM / TR — see grid above
PARTNER_NAME
VARCHAR2(240)Partner business name
STATUS
VARCHAR2(1)A = Active, I = Inactive
CURRENCY_CODE
VARCHAR2(3)Default currency for transactions with this partner
COUNTRY_ID
VARCHAR2(3)Country where this partner is registered
LANG
NUMBER(6)Language preference for documents sent to this partner
RC:OMS · Multi-Channel Order Management
Managing supplier relationships across Amazon, Flipkart, and your own store?

RC:OMS handles the supplier-to-channel complexity that Oracle RMS solves for large enterprises — but sized for India's growing D2C and marketplace sellers. Every stock receipt, return, and replenishment is tracked with double-entry accuracy. Native integrations for Amazon, Flipkart, Shopify, and WooCommerce.

Launch RC:OMS Demo
Item–Supplier Link

ITEM_SUPPLIER — Linking Items to Suppliers

The ITEM_SUPPLIER table is the bridge between the product catalog and the supplier master. It stores one row per item-supplier combination, recording the commercial terms agreed with that specific supplier for that specific item: the cost price, the lead time, and the pack structure.

An item in RMS can have multiple suppliers. This models real-world scenarios where a retailer dual-sources a product for supply chain resilience, or where multiple trading arms of the same manufacturer have separate supplier records. One of those suppliers must be flagged as the primary supplier — the default source for replenishment and cost calculation.

04ITEM_SUPPLIER
Item–Supplier Relationship

The pack size columns on ITEM_SUPPLIER are particularly important for developers: SUPP_PACK_SIZE is the outer case quantity — how many units come in a carton from the supplier. INNER_PACK_SIZE is the inner pack quantity within each case.

ColumnTypeDescription
ITEMPKFK
VARCHAR2(25)FK → ITEM_MASTER.ITEM
SUPPLIERPKFK
NUMBER(10)FK → SUPS.SUPPLIER
UNIT_COST
NUMBER(20,4)Unit cost from this supplier (in supplier's currency)
LEAD_TIME
NUMBER(4)Lead time in days for this item from this supplier
SUPP_PACK_SIZE
NUMBER(12,4)Outer case pack size — units per carton
INNER_PACK_SIZE
NUMBER(12,4)Inner pack size — units per inner within a case
SUPP_DISCONTINUE_DATE
DATEDate after which supplier will no longer supply this item
PRIMARY_SUPP_IND
VARCHAR2(1)Y = primary supplier for this item. Only one Y allowed per item.
PRIMARY_COUNTRY_ID
VARCHAR2(3)Default country of origin for this item-supplier combination
PACKING_METHOD
VARCHAR2(6)FLAT or HANGING — how items are packed by this supplier
ROUND_TO_INNER_PKG
VARCHAR2(1)Y = order quantities must round to inner pack boundaries
ROUND_TO_CASE
VARCHAR2(1)Y = order quantities must round to full case quantities
Sourcing Country

ITEM_SUPP_COUNTRY — Sourcing by Country of Origin

The ITEM_SUPP_COUNTRY table extends the item-supplier relationship one level deeper by adding the country of origin dimension. The same supplier may source the same item from factories in multiple countries — India, Bangladesh, China — each at a different FOB cost and with potentially different pack sizes.

This table is particularly significant for retailers doing cross-border sourcing, import cost tracking, or any work with Oracle Retail's Trade Management module. The landed cost calculation chain starts here — UNIT_COST in ITEM_SUPP_COUNTRY is the FOB cost at origin, before freight, duty, and other cost components are added.

05ITEM_SUPP_COUNTRY
Sourcing Country & Origin Cost

The composite primary key is ITEM + SUPPLIER + ORIGIN_COUNTRY_ID. A retailer sourcing the same SKU from the same supplier but from two different factories in two different countries will have two rows in this table.

ColumnTypeDescription
ITEMPK
VARCHAR2(25)FK → ITEM_MASTER.ITEM
SUPPLIERPK
NUMBER(10)FK → SUPS.SUPPLIER
ORIGIN_COUNTRY_IDPK
VARCHAR2(3)Country of manufacture (ISO 3166-1 alpha-3)
UNIT_COST
NUMBER(20,4)FOB cost at origin in supplier currency
SUPP_PACK_SIZE
NUMBER(12,4)Pack size from this country's factory (may differ from ITEM_SUPPLIER)
INNER_PACK_SIZE
NUMBER(12,4)Inner pack from this country's factory
PRIMARY_SUPP_IND
VARCHAR2(1)Y = this is the primary sourcing country for this item-supplier
DUTY_PCT
NUMBER(12,4)Import duty percentage applicable from this country
EARLIEST_SHIP_DATE
DATEEarliest date supplier can ship from this origin
LATEST_SHIP_DATE
DATELatest date supplier can ship from this origin
Primary Supplier

The Primary Supplier Pattern

Throughout Oracle RMS, whenever an item needs to be linked to a single definitive supplier — for replenishment, for cost lookup, for purchase order defaulting — the system uses the primary supplier pattern. This pattern appears in three related tables, each with a PRIMARY_SUPP_IND column.

⚠️
Never insert to ITEM_SUPPLIER without managing primary supplier

If you insert a row to ITEM_SUPPLIER with PRIMARY_SUPP_IND = 'Y' when one already exists for that item, you will have two primary suppliers — which will cause replenishment batch failures and incorrect cost calculations. Always check for an existing primary before inserting, or use the RMS API layer which handles this automatically.

Quick Reference

Key Tables — Quick Reference

Supplier & Partner Tables — Oracle RMS
SUPS
Supplier Master
ADDR
Supplier Sites
PARTNER
Partner Master
ITEM_SUPPLIER
Item–Supplier Link
ITEM_SUPP_COUNTRY
Sourcing by Country
ORDHEAD
Purchase Order Header
Practical SQL

Practical SQL Examples

1. Full supplier profile — master, address, and item count

SQL
-- Supplier profile with main address and active item count
SELECT s.supplier,
s.supp_name,
s.sup_status,
s.currency_code,
s.payment_terms,
s.lead_time             default_lead_days,
a.add_1                 address,
a.city,
a.country_id,
COUNT(DISTINCT is2.item) active_item_count
FROM   sups          s
LEFT JOIN addr       a   ON  a.module    = 'SUPP'
AND a.key_value = s.supplier
AND a.addr_type = 'S0'
LEFT JOIN item_supplier is2 ON is2.supplier = s.supplier
WHERE  s.sup_status = 'A'
GROUP BY s.supplier, s.supp_name, s.sup_status,
s.currency_code, s.payment_terms, s.lead_time,
a.add_1, a.city, a.country_id
ORDER BY s.supp_name;

2. All suppliers for an item with cost comparison

SQL
-- Compare all supplier costs for a given item
SELECT im.item,
im.item_desc,
s.supplier,
s.supp_name,
is2.unit_cost,
s.currency_code,
is2.lead_time,
is2.supp_pack_size,
is2.primary_supp_ind,
is2.primary_country_id
FROM   item_master   im
JOIN   item_supplier is2 ON is2.item     = im.item
JOIN   sups          s   ON s.supplier   = is2.supplier
WHERE  im.item       = :v_item
AND  s.sup_status  = 'A'
ORDER BY is2.primary_supp_ind DESC,
is2.unit_cost ASC;

3. Items sourced from a specific country via a specific supplier

SQL
-- All items sourced from India via a given supplier
SELECT im.item,
im.item_desc,
im.dept,
dp.dept_name,
isc.origin_country_id,
isc.unit_cost,
isc.duty_pct,
isc.supp_pack_size
FROM   item_supp_country  isc
JOIN   item_master        im  ON im.item     = isc.item
JOIN   deps               dp  ON dp.dept     = im.dept
WHERE  isc.supplier          = :v_supplier
AND  isc.origin_country_id = 'IND'
ORDER BY dp.dept_name, im.item_desc;

4. PL/SQL — Check and set primary supplier safely

PL/SQL

-- Safely update primary supplier for an item. -- Clears existing primary before setting new one. PROCEDURE set_primary_supplier ( p_item IN item_supplier.item%TYPE, p_supplier IN item_supplier.supplier%TYPE ) IS BEGIN -- Step 1: Clear any existing primary flag for this item UPDATE item_supplier SET primary_supp_ind = 'N' WHERE item = p_item AND primary_supp_ind = 'Y';

-- Step 2: Set the new primary supplier UPDATE item_supplier SET primary_supp_ind = 'Y' WHERE item = p_item AND supplier = p_supplier;

IF SQL%ROWCOUNT = 0 THEN RAISE_APPLICATION_ERROR(-20001, 'Supplier ' || p_supplier || ' not linked to item ' || p_item); END IF;

COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE; END set_primary_supplier;

5. Active suppliers with zero active items (cleanup candidates)

SQL

-- Active suppliers with zero active item-supplier records -- Useful for data quality audits before go-live SELECT s.supplier, s.supp_name, s.currency_code, s.lead_time FROM sups s WHERE s.sup_status = 'A' AND NOT EXISTS ( SELECT 1 FROM item_supplier is2 JOIN item_master im ON im.item = is2.item WHERE is2.supplier = s.supplier AND im.status = 'A' ) ORDER BY s.supp_name;

Gotchas

Common Gotchas for Developers

  • !

    Querying supplier address from SUPS directly. There are no address columns on the SUPS table itself. Address data is in the ADDR table with MODULE = 'SUPP'. Developers new to RMS regularly write joins expecting columns like SUPS.ADDRESS — they don't exist.

  • !

    Inserting an item-supplier row without verifying the primary supplier constraint. Oracle RMS enforces "exactly one primary supplier per item" primarily at the application layer, not always at the database constraint level. Raw SQL inserts can create two PRIMARY_SUPP_IND = 'Y' rows for the same item, which will silently corrupt replenishment and cost logic.

  • !

    Confusing ITEM_SUPPLIER.UNIT_COST with ITEM_SUPP_COUNTRY.UNIT_COST. Both tables have a UNIT_COST column. The one in ITEM_SUPPLIER is the agreed cost with that supplier. The one in ITEM_SUPP_COUNTRY is the FOB cost from that specific country of origin. For import calculations, always use ITEM_SUPP_COUNTRY.

  • !

    Forgetting that ITEM_SUPPLIER.ITEM is VARCHAR2, not NUMBER. The item number in Oracle RMS is stored as VARCHAR2(25) in ITEM_MASTER and all related tables. Passing a numeric value without quotes in a bind variable can cause implicit conversion and index suppression — the query will full-scan instead of using the index.

  • !

    Treating PARTNER and SUPS as completely separate number spaces. For supplier-type partners, the PARTNER number and the SUPPLIER number are the same value. Integrations that generate separate sequences for PARTNER and SUPS IDs will break this assumption.

  • !

    Not checking SUPP_DISCONTINUE_DATE in replenishment logic. If a supplier has a SUPP_DISCONTINUE_DATE in the past on an ITEM_SUPPLIER row, that supplier-item combination is no longer valid for new orders. Custom batch scripts that ignore this column will attempt to raise POs against discontinued supplier-item pairs.

Key Takeaways

Key Takeaways
  • Supplier master data lives in SUPS. Addresses live separately in ADDR with MODULE = 'SUPP' and ADDR_TYPE of S0 (main), S1 (order), S2 (payment).
  • Partners (PARTNER table) are a superset of suppliers — they include agents, brokers, factories, consolidators, and freight forwarders. All suppliers are partners, but not all partners are suppliers.
  • ITEM_SUPPLIER (composite PK: ITEM + SUPPLIER) holds the agreed cost, lead time, and pack sizes per item per supplier. One must be flagged PRIMARY_SUPP_IND = 'Y'.
  • ITEM_SUPP_COUNTRY (composite PK: ITEM + SUPPLIER + ORIGIN_COUNTRY_ID) captures FOB costs and duty rates by country of origin — critical for import cost calculations.
  • Exactly one PRIMARY_SUPP_IND = 'Y' must exist per item in ITEM_SUPPLIER. Violating this breaks replenishment and cost logic.
  • ITEM_SUPPLIER.ITEM is VARCHAR2(25) — always treat item numbers as strings, never as numbers, in SQL and PL/SQL.
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 →