Oracle Fusion Cloud lets report developers write physical SQL against application tables, but not in the same way as an on-premises Oracle database. In a normal Fusion SaaS tenant, you do not open SQL Developer, point it at the production database listener, and sign in with a database account. The supported reporting path for physical SQL is Oracle Analytics Publisher / BI Publisher, using the application database data sources exposed inside the Fusion environment.
That distinction matters. OTBI uses a semantic model and generates logical SQL; BI Publisher can execute physical SQL against Fusion application objects; BICC is designed for larger outbound extracts; and tools such as FusionLens SQL can provide a developer-friendly SQL editor while still working through Fusion's reporting layer rather than a customer-accessible database listener.
The Supported Ways to Work with Fusion Data
BI Publisher: the physical SQL path
In Fusion Cloud, BI Publisher data models can contain SQL Query data sets. The data source depends on the application pillar. Common Oracle-documented examples include ApplicationDB_HCM for Human Capital Management and ApplicationDB_FSCM for Financials, Supply Chain, Project Management, and Procurement. Sales uses its own application data source.
-- BI Publisher / ApplicationDB_HCM
SELECT p.person_number,
n.display_name,
a.assignment_number
FROM per_all_people_f p
JOIN per_person_names_f n
ON n.person_id = p.person_id
AND n.name_type = 'GLOBAL'
AND TRUNC(:p_as_of_date) BETWEEN n.effective_start_date
AND n.effective_end_date
JOIN per_all_assignments_m a
ON a.person_id = p.person_id
AND a.assignment_type IN ('E','C','N','P')
AND a.effective_latest_change = 'Y'
AND TRUNC(:p_as_of_date) BETWEEN a.effective_start_date
AND a.effective_end_date
WHERE TRUNC(:p_as_of_date) BETWEEN p.effective_start_date
AND p.effective_end_date
The source version incorrectly selected PER_ALL_PEOPLE_F.FULL_NAME. Person display/full names belong to PER_PERSON_NAMES_F (or a related name view), so the corrected starter query joins the name object explicitly.
Oracle blocks DML/DDL-style statements in data-model SQL, including operations such as INSERT, UPDATE, DELETE, MERGE, DROP, ALTER, CREATE, GRANT, REVOKE, and TRUNCATE. Treat BI Publisher as a reporting engine, not a database administration console.
OTBI: useful, but it is not direct database SQL
OTBI analyses are built from subject areas in the BI semantic layer. The Advanced tab shows the logical SQL sent to the BI Server. That SQL references presentation-layer subject-area columns, not physical Fusion table names in the same form used by BI Publisher. BI administrators can inspect session logs to see the physical SQL generated downstream, but the Advanced tab itself is not a physical-SQL discovery tool.
Use OTBI to understand the delivered business semantics, measures, default filters, and security behavior of a subject area. Use Oracle's Tables and Views documentation or a schema browser to determine the physical objects needed for BI Publisher SQL.
SQL Developer: where it does fit
Oracle documents SQL Developer access for databases that customers actually own or are explicitly given credentials for — for example an Autonomous Data Warehouse used by Fusion Data Intelligence. That is different from the source Fusion SaaS transactional database. If your organization extracts or replicates Fusion data into ADW, ATP, an on-premises Oracle database, or another warehouse, SQL Developer can of course query that target normally.
BI Publisher is a reporting tool. Oracle recommends BICC rather than BI Publisher for medium-to-high-volume general data extraction workloads.
Schema Naming Patterns: Useful Hints, Not Universal Rules
Fusion object suffixes are helpful, but they are conventions rather than a substitute for reading the object definition. The safest workflow is: use the suffix as a clue, then confirm the object's columns, primary key, foreign keys, and view definition in Oracle documentation.
| Suffix / pattern | What it usually tells you | What to verify |
|---|---|---|
_F | Date-effective object with effective start/end dates. | Primary key and whether every required dimension needs the same as-of date. |
_M | Often a date-effective object that can preserve multiple physical changes. | Do not assume date filtering alone is sufficient. For PER_ALL_ASSIGNMENTS_M, check EFFECTIVE_LATEST_CHANGE and EFFECTIVE_SEQUENCE. |
_B | Language-independent/base object in many translated models. | Which attributes actually live in the base object and which are translated. |
_TL | Translation rows by language. | Join keys, effective dates if applicable, and session language. |
_VL | Language-aware view, commonly combining base and translation layers. | Read the view definition; many _VL views filter translation rows using the session language. |
_ALL | A historical naming convention used on many application tables. | Do not infer one universal ORG_ID rule. The relevant scope can be ORG_ID, PRC_BU_ID, REQ_BU_ID, BUSINESS_UNIT_ID, ledger, legal entity, inventory organization, or something else. |
_V | Database view. | Inspect its SQL definition before assuming grain or security. |
LANGUAGE='US' by default.
Oracle language-aware views commonly use the current session language, for example USERENV('LANG') or SYS_CONTEXT('USERENV','LANG'). Hardcode a language only when the report requirement explicitly calls for that language.
Effective-Date SQL: Current, As-of, and History Are Different Questions
A date-effective object stores versions across time. The query must decide whether it needs today's state, an as-of snapshot, or every historical period. For multi-change objects such as PER_ALL_ASSIGNMENTS_M, an as-of date can still intersect more than one physical same-day row unless the latest-change logic is included.
Current / as-of snapshot
-- Bind :p_as_of_date as a DATE
WHERE TRUNC(:p_as_of_date) BETWEEN x.effective_start_date
AND x.effective_end_date
PER_ALL_ASSIGNMENTS_M final state for the effective day
WHERE TRUNC(:p_as_of_date) BETWEEN a.effective_start_date
AND a.effective_end_date
AND a.effective_latest_change = 'Y'
History overlapping a report range
WHERE x.effective_start_date <= :p_end_date AND x.effective_end_date >= :p_start_date
It is an end-of-time/open-ended sentinel. A future-dated last row can also end on 31-DEC-4712. Use the effective range to determine the row that is active on a particular date.
Three Safe Starter Queries
The original guide used ALL_TABLES, ALL_TAB_COLUMNS, and ALL_CONSTRAINTS as if database dictionary access were a guaranteed Fusion SaaS feature. That is not a portable assumption for a managed reporting connection. Use Oracle's published Tables and Views metadata — or a schema navigator — for discovery, then test known application objects with small, scoped SQL.
1. HCM: current worker assignments
SELECT p.person_number,
n.display_name,
a.assignment_number,
a.assignment_status_type
FROM per_all_people_f p
JOIN per_person_names_f n
ON n.person_id = p.person_id
AND n.name_type = 'GLOBAL'
AND TRUNC(:p_as_of_date) BETWEEN n.effective_start_date
AND n.effective_end_date
JOIN per_all_assignments_m a
ON a.person_id = p.person_id
AND a.assignment_type IN ('E','C','N','P')
AND a.effective_latest_change = 'Y'
AND TRUNC(:p_as_of_date) BETWEEN a.effective_start_date
AND a.effective_end_date
WHERE TRUNC(:p_as_of_date) BETWEEN p.effective_start_date
AND p.effective_end_date
FETCH FIRST 100 ROWS ONLY
2. Financials: recent AP invoices for one Business Unit
SELECT ai.invoice_id,
ai.invoice_num,
ai.invoice_date,
ai.invoice_currency_code,
ai.invoice_amount,
ai.payment_status_flag
FROM ap_invoices_all ai
WHERE ai.org_id = :p_business_unit_id
AND ai.invoice_date >= TRUNC(:p_from_date)
AND ai.invoice_date < TRUNC(:p_to_date) + 1
AND ai.cancelled_date IS NULL
ORDER BY ai.invoice_date DESC
FETCH FIRST 100 ROWS ONLY
3. Procurement: purchase orders for one Procurement BU
SELECT ph.po_header_id,
ph.segment1 AS po_number,
ph.type_lookup_code,
ph.document_status,
ph.approved_flag,
ph.currency_code
FROM po_headers_all ph
WHERE ph.prc_bu_id = :p_prc_bu_id
AND ph.creation_date >= TRUNC(:p_from_date)
AND ph.creation_date < TRUNC(:p_to_date) + 1
ORDER BY ph.creation_date DESC
FETCH FIRST 100 ROWS ONLY
Notice that each module uses its own real scoping column. AP_INVOICES_ALL uses ORG_ID for the Business Unit; Purchasing uses PRC_BU_ID. This is why "every _ALL table needs ORG_ID" is not a valid Fusion rule.
Physical SQL Security: A Correct Query Can Still Be an Insecure Report
This is one of the most important BI Publisher differences from OTBI. Oracle explicitly documents that a physical SQL data model selecting directly from a base table is not automatically subject to Fusion data-security restrictions. Where Oracle provides secured list views, those views can apply the security profiles assigned to the user running the report.
A filter such as ORG_ID=:P_BU_ID defines report scope. It does not prove that the runtime user is authorized to see that BU. Report permissions, secured views, application roles, and — for some PII objects — database VPD policies are separate controls.
For HCM, Oracle documents secured list views such as PER_PERSON_SECURED_LIST_V, PER_ASSIGNMENT_SECURED_LIST_V, and CMP_SALARY_SECURED_LIST_V. Use the security model appropriate to the report rather than assuming physical table SQL inherits OTBI security.
A Better Workflow for Fusion SQL Development
Define whether one row should represent a person, assignment, invoice, PO schedule, distribution, receipt, or accounting line.
Use Oracle Tables and Views documentation or FusionLens Schema Navigator instead of guessing from OTBI logical SQL.
Apply effective dates to every date-effective object; include ELC/sequence when the object requires it; use language-aware views where appropriate.
Use the object's actual BU, ledger, legal entity, procurement BU, inventory organization, and date columns — not generic suffix rules.
Confirm whether the report uses secured views, VPD-protected PII tables, catalog permissions, or other application controls.
Verify row counts and grain before removing development limits or scheduling the report.
Build and Test Oracle Fusion SQL with FusionLens
Browse Fusion objects and columns without relying on database-dictionary access from a report connection.
Write physical SQL with Oracle Fusion table and column awareness.
Test queries through the Fusion reporting layer before moving finalized SQL into BI Publisher.
Final Thoughts
The key to running SQL successfully on Oracle Fusion Cloud is understanding the boundary between the SaaS application and its reporting interfaces. BI Publisher is the practical physical-SQL engine; OTBI is a secured semantic-query layer; BICC is the better fit for larger extracts; and a separately replicated warehouse is where traditional SQL Developer-style database access belongs.
Once the access model is clear, the remaining work is classic Fusion data-model discipline: verify the physical object, preserve the intended grain, apply effective dating correctly, use the right language layer, scope each module with its actual business keys, and treat data security as a first-class design requirement.
Related
Continue with the Effective Date Handling guide, the Table Relationships guide, and the complete Oracle Fusion SQL Guide.