Introduzione

Cloud HCM offre la possibilità di estrarre i dati da HCM utilizzando la piattaforma BOSS/Spectra di nuova generazione sottostante.

Obiettivi

Dopo aver completato questo tutorial, capirete come:

  • Esegui query sulle viste di estrazione del worker e sulla relativa gerarchia di oggetti
  • Sottomette e tiene traccia in modo asincrono delle richieste di job di estrazione per il recupero dei dati della gerarchia dei lavoratori selezionati
  • Scarica file di output estrazione

Prerequisiti

Prima di iniziare:

  1. Contattare l'Oracle CoE per assicurarsi che il provisioning della piattaforma Spectra, inclusa la replica dei dati RODS, venga eseguito nel pod
  2. Eseguire la configurazione di sicurezza richiesta, tra cui:
    • Impostazione sicurezza dati
    • Impostazione applicazione client OAuth

Casi d'uso

Questa funzionalità consente di risolvere i seguenti casi d'uso.

Estrazione dati completa

L'estrazione completa dei dati del lavoratore può essere un'attività singola o periodica.

È possibile recuperare l'intera gerarchia di oggetti o solo un subset di essa.

L'estrazione completa dei dati recupererà tutti i record che corrispondono ai criteri di filtro e i file di output potrebbero essere molto grandi.

La data di validità degli oggetti verrà recuperata alla data di validità richiesta, dove la data di estrazione corrente è quella predefinita.

Estrazione dati incrementale

L'estrazione incrementale dei dati del lavoratore è in genere un'attività periodica pianificata.

È possibile recuperare l'intera gerarchia di oggetti o solo un subset di essa.

In questo caso d'uso si desidera recuperare solo gli oggetti modificati dopo l'esecuzione dell'estrazione precedente, dove la prima esecuzione dell'estrazione è la baseline. A tale scopo, i filtri degli attributi timeUpdated devono essere applicati a qualsiasi livello soggetto al rilevamento delle modifiche.

La query di estrazione dati incrementale può applicare criteri di filtro aggiuntivi. I file di output saranno in genere più piccoli rispetto all'estrazione completa poiché conterranno solo delta.

Verranno recuperati solo i valori correnti degli attributi.

La data di validità degli oggetti verrà recuperata alla data di validità richiesta, dove la data di estrazione corrente è quella predefinita.

Attenzione

I record eliminati fisicamente non verranno restituiti mediante l'applicazione di filtri mediante timeUpdated.

Task 1: scelta di una vista di estrazione

Scegliere la vista di estrazione da utilizzare, a seconda degli oggetti e degli attributi richiesti. Le viste disponibili sono elencate di seguito, insieme agli oggetti e agli attributi che è possibile estrarre.

Estrazioni assegnazione lavoratore

Utilizzare workerAssignmentExtracts per estrarre i dati di assegnazione impiego dei lavoratori.

Visualizza percorso workerAssignmentExtracts


Oggetto Attributi Tipo di relazione
workerAssignmentExtract
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • effectiveSequence
  • effectiveLatestChange
  • assignmentType
  • assignmentNumber
  • primaryFlag
  • businessTitle
  • workAtHomeFlag
  • officeBuilding
  • officeFloor
  • officeMailStop
  • officeNumber
  • primaryAssignmentFlag
  • primaryWorkRelationshipFlag
  • timeUpdated
  • updatedBy
  • timeCreated
  • createdBy
  • systemPersonType
  • labourUnionMemberFlag
  • managerFlag
  • probationEndDate
  • probationPeriod
  • probationPeriodUnit
  • normalHours
  • frequenza
  • endTime
  • startTime
  • noticePeriod
  • noticePeriodUOM
  • workerCategory
  • assignmentCategory
  • hourlyPaidOrSalaried
  • projectedEndDate
  • projectedStartDate
  • assignmentStatusType
  • expenseCheckSendToAddress
  • retirementAge
  • retirementDate
  • synchronizeFromPositionFlag
  • fullTimeOrPartTime
  • permanentAssignmentFlag
  • seniorityBasis
  • overtimePeriod
  • adjustedFullTimeEquivalent
  • annualWorkingDuration
  • annualWorkingDurationUnit
  • annualWorkingRatio
  • standardFrequency
  • standardWorkingHours
  • standardAnnualWorkingDuration
  • sequenza
n/d
workerAssignmentExtract.department
  • ID
  • name
  • title
  • effectiveStartDate
  • effectiveEndDate
uno-a-uno
workerAssignmentExtract.legalEmployer
  • ID
  • name
  • effectiveStartDate
  • effectiveEndDate
uno-a-uno
workerAssignmentExtract.legislation
  • territoryCode
  • territoryShortName
uno-a-uno
workerAssignmentExtract.position
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • name
  • codice
uno-a-uno
workerAssignmentExtract.grade
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • name
  • codice
uno-a-uno
workerAssignmentExtract.location
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • name
  • codice
uno-a-uno
workerAssignmentExtract.location.mainAddress
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • contea
  • state
  • provincia
  • townOrCity
  • postalCode
  • countryCode
  • longPostalCode
  • addressLine1
  • addressLine2
  • addressLine3
  • addressLine4
uno-a-uno
workerAssignmentExtract.location.mainAddress.country
  • territoryCode
  • territoryShortName
uno-a-uno
workerAssignmentExtract.job
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • name
  • codice
  • jobFunctionCode
  • managerLevel
uno-a-uno
workerAssignmentExtract.job.jobFamily
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • name
  • codice
uno-a-uno
workerAssignmentExtract.collectiveAgreement
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • name
uno-a-uno
workerAssignmentExtract.personType
  • ID
  • userPersonType
uno-a-uno
workerAssignmentExtract.workerUnion
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • name
uno-a-uno
workerAssignmentExtract.assignmentUserStatus
  • ID
  • userStatus
uno-a-uno
workerAssignmentExtract.businessUnit
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • name
uno-a-uno
workerAssignmentExtract.account
  • codeCombinationId
  • concatenatedSegments
  • chartOfAccountsId
uno-a-uno
workerAssignmentExtract.ledger
  • ledgerId
  • name
uno-a-uno
workerAssignmentExtract.workRelationship
  • ID
  • startDate
  • workerType
  • timeCreated
  • timeUpdated
uno-a-uno
workerAssignmentExtract.localName
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • lastName
  • firstName
  • displayName
  • listName
  • timeCreated
  • timeUpdated
uno-a-uno
workerAssignmentExtract.globalName
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • lastName
  • firstName
  • displayName
  • listName
  • timeCreated
  • timeUpdated
uno-a-uno
workerAssignmentExtract.personDetail
  • ID
  • personNumber
  • effectiveStartDate
  • effectiveEndDate
  • timeCreated
  • timeUpdated
uno-a-uno

Estrazione informazioni legislative lavoratore

Utilizzare workerLegislativeInfoExtract per estrarre i dati delle informazioni legislative dei lavoratori.

Visualizza percorso worker/$views/workerLegislativeInfoExtract


Oggetto Attributi Tipo di relazione
processo operativo
  • ID
n/d
worker.personDetail
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • personNumber
uno-a-uno
worker.legislativeInformation
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • sesso
  • maritalStatus
  • maritalStatusChangeDate
  • highestEducationLevel
  • timeUpdated
  • updatedBy
  • timeCreated
  • createdBy
uno-a-uno
worker.legislativeInformation.legislation
  • territoryCode
  • territoryShortName
uno-a-uno

Estrazione nomi lavoratore

Utilizzare workerNamesExtract per estrarre i dati dei nomi dei lavoratori.

Visualizza percorso worker/$views/workerNamesExtract


Oggetto Attributi Tipo di relazione
processo operativo
  • ID
n/d
worker.personDetail
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • personNumber
uno-a-uno
worker.names
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • lastName
  • firstName
  • middleNames
  • title
  • prefix
  • suffisso
  • knownAs
  • previousLastName
  • onorificenze
  • militaryRank
  • displayName
  • fullName
  • listName
  • orderName
  • nameLanguage
  • type
  • timeUpdated
  • updatedBy
  • timeCreated
  • createdBy
alcuni-a-molti
worker.names.legislation
  • territoryCode
  • territoryShortName
uno-a-uno
worker.names.language
  • languageCode
uno-a-uno

Estrazione telefoni lavoratore

Utilizzare workerPhonesExtract per estrarre i dati dei telefoni dei lavoratori.

Visualizza percorso worker/$views/workerPhonesExtract


Oggetto Attributi Tipo di relazione
processo operativo
  • ID
n/d
worker.personDetail
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • personNumber
uno-a-uno
worker.phones
  • ID
  • type
  • primaryFlag
  • phoneNumber
  • areaCode
  • countryCodeNumber
  • extension
  • validità
  • timeUpdated
  • updatedBy
  • timeCreated
  • createdBy
alcuni-a-molti
worker.phones.legislation
  • territoryCode
  • territoryShortName
uno-a-uno

Estrazione e-mail lavoratore

Utilizzare workerEmailsExtract per estrarre i dati delle e-mail dei lavoratori.

Visualizza percorso worker/$views/workerEmailsExtract


Oggetto Attributi Tipo di relazione
processo operativo
  • ID
n/d
worker.personDetail
  • ID
  • effectiveStartDate
  • effectiveEndDate
  • personNumber
uno-a-uno
worker.emails
  • ID
  • type
  • primaryFlag
  • emailAddress
  • timeUpdated
  • updatedBy
  • timeCreated
  • createdBy
alcuni-a-molti

Multilingua:

A questo punto, gli attributi traducibili sono disponibili solo in inglese.

Task 2: Preparazione e test di una query di estrazione

Ogni vista di estrazione dispone di un'API di query che consente di creare e testare query di estrazione.

URL /api/boss/data/objects/ora/hcmHrCore/employment/v1/{{viewPath}}/$query
Metodo HTTP POST
Modello di richiesta
{
    "collection": {
        "limit": {{limit}},
        "offset": {{offset}},
        "sortBy": [ {{sortAttributes}} ],
        "filter": "{{topLevelFilter}}"
    },
    "fields": [ {{topLevelAttributes}} ],
    "accessors": {
        "{{childObject}}": {
            "collection": {
                "filter": "{{childLevelFilter}}"
            },
            "fields": [ {{childLevelAttributes}} ],
            "accessors": {
                {{nestedChildAccessors}}               
            }
        },
        ...
    }
}
Modello di risposta
200 OK

{
	"items": [
		{{items}}
	],
	"hasMore": {{hasMore}}
}

Oggetti e attributi

Definire i dati da estrarre, ovvero gli oggetti e gli attributi da includere. L'inclusione di oggetti figlio richiede l'aggiunta di accessori, mentre l'inclusione di campi specifici richiede l'inserimento di un elenco nell'array fields. Vedere l'esempio completo.

Applicazione del filtro

Definire la modalità di filtraggio dei dati. È possibile utilizzare le espressioni riportate di seguito per creare filtri per la query.

Scopo Espressione Esempio
Test di uguaglianza field = value ename = 'KING'
Test disuguaglianza field != value activeFlag != true
Test di livello superiore
meno di
field > value
field < value
sal > 1999.99
hireDate < '2000-01-01'
timeUpdated> '1900-01-01T13:51:54Z'
Test maggiore di o uguale a
test minore di o uguale a
field >= value
field <= value< code>
sal >= 1999.99
hireDate <= '2000-01-01'
timeUpdated >= '1900-01-01T13:51:54Z'
Corrispondenza pattern field LIKE 'pattern' job LIKE 'SALES%'
Test appartenenza field IN (value1, ..., valueN) deptno IN (10, 20, 40)
Confronto casi-insensibilità field ~= value
field ~!= value
field ~> value
field ~< value
field ~>= value
field ~<= value
field ~LIKE 'pattern'
field ~IN (value1, ..., valueN)
ename ~= 'king'
Test di esistenza (per relazioni uno-a-molti) child[expression] assignments[startDate = null]
Congiunzione logica expression AND expression  
Disgiunzione logica expression OR expression  
Negazione logica !(expression)  

Applicazione di filtri in base agli oggetti figlio nella relazione uno-a-uno:

In caso di relazioni uno a uno, è possibile fare riferimento agli oggetti figlio e ai relativi attributi nella clausola di filtro, così come agli attributi di altri oggetti padre, ad esempio legalEmployer.id in (1001, 1002).

Applicazione di filtri agli oggetti figlio nella relazione uno-a-molti:

In caso di relazioni uno-a-molti, il test dell'esistenza nella tabella precedente filtrerà i genitori che hanno almeno un figlio che soddisfa i criteri. Tuttavia, ciò non significa che i record figlio, se recuperati, verranno filtrati automaticamente. Se si desidera assicurarsi di ottenere solo record figlio che soddisfano i criteri, è necessario ripetere il filtro anche a livello figlio.

Ad esempio, se si desidera recuperare solo i telefoni di tipo W1, è necessario applicare i filtri seguenti:


{
    "collection": {
        "filter": "phones[type = 'W1']"
    },
    "accessors": {
        "phones": {
            "collection": {
                "filter": "type = 'W1'"
            },
...
                

Filtro in base alla data di validità:

In caso di oggetti con data di validità, per impostazione predefinita i dati saranno validi a partire dalla data corrente. Per recuperare i dati validi a partire da una data specifica, utilizzare il parametro di query HTTP $effectiveDate.

Ad esempio, se si desidera recuperare i dati validi a partire da 2023-01-01, utilizzare il seguente URL per la query:

/api/boss/data/objects/ora/hcmHrCore/employment/v1/{{viewPath}}/$query?$effectiveDate=2023-01-01

Ordinamento

Definire la modalità di ordinamento dei dati. L'ordinamento è espresso da un array di attributi di ordinamento, inclusa la direzione di ordinamento (asc o desc). Ad esempio:

"sortBy": [
    {
        "totalAmount": "desc"
    },
    {
        "paidAmount": "asc"
    }
]

Paging

Definire la modalità di impaginazione dei dati. Il client può controllare il paging fornendo parametri di limite e offset. Ad esempio:

"limit": 200,
"offset": 400

Il limite predefinito è 25 e il limite massimo è 1000.

L'offset predefinito è 0 e indica l'inizio dei risultati.

L'attributo hasMore di livello superiore nella risposta indica se sono presenti altri risultati da recuperare.

Paginare non dovrebbe essere usato come un modo alternativo per estrarre i dati. Quando si esegue una query su questa API, non vi è alcuna garanzia che i dati non cambieranno tra le richieste. Utilizza l'API asincrona per l'estrazione dei dati.

Esempio

La query di estrazione di esempio riportata di seguito è progettata per recuperare le informazioni sulle assegnazioni insieme ai dettagli relativi a datore di lavoro legale e reparto.

  • Sono assegnazioni principali
  • Sono di tipo Dipendente
  • Non appartenere a datori di lavoro legali con ID 10001 e 10002
  • Validità alla data di estrazione
  • Aggiornato (o creato) dall'esecuzione precedente

Esempio di richiesta

Osservare il parametro limit e la condizione dell'attributo timeUpdated con l'indicatore orario dell'esecuzione dell'estrazione precedente.

POST /api/boss/data/objects/ora/hcmHrCore/employment/v1/workerAssignmentExtracts/$query
 
{
    "collection": {
        "limit": 10,
        "filter": "primaryFlag = true and timeUpdated > '2025-05-01T00:00:00Z' and assignmentType = 'E' and !(legalEmployer.id in (10001, 10002))"
    },
    "fields": [ "id", "assignmentType", "assignmentStatusType", "effectiveStartDate", "effectiveEndDate", "businessTitle", "workAtHomeFlag", "assignmentNumber", "timeUpdated" ],
    "accessors": {
        "personDetail": {
            "fields": [ "personNumber" ]
        },
        "globalName": {
            "fields": [ "firstName", "lastName" ]
        },
        "department": {
            "fields": [ "id", "name", "title" ]
        },
        "legalEmployer": {
            "fields": [ "id", "name" ]
        },
        "workRelationship": {
            "fields": [ "id" ]
        }
    }
}
				

Esempio di risposta

200 OK
 
{
    "items": [
        {
            "id": "300000795682243",
            "assignmentType": "E",
            "assignmentStatusType": "ACTIVE",
            "effectiveStartDate": "2018-06-14",
            "effectiveEndDate": "4712-12-31",
            "businessTitle": "Aeronautical Engineer Level-9352",
            "workAtHomeFlag": false,
            "assignmentNumber": "EHDLWorker_190903_1637",
            "timeUpdated": "2025-05-06T11:42:17.821Z",
            "$id": "300000795682243",
            "$context": {
                "etag": "89"
            },
            "personDetail": {
                "personNumber": "HDLWorker_190903_1637",
                "$id": "100000329366771",
                "$context": {
                    "etag": ""
                }
            },
            "globalName": {
                "firstName": "Raymond-Olivier",
                "lastName": "Beer-Tröst",
                "$id": "300000795668871",
                "$context": {
                    "etag": ""
                }
            },
            "department": {
                "id": "300000044556980",
                "name": "South - Venaria DC-GROUP/SFIELESOIT74155",
                "title": null,
                "$id": "300000044556980",
                "$context": {
                    "etag": "13",
                    "links": {
                        "$self": {
                            "href": "https://example.com/api/boss/data/objects/ora/hcmHrCore/workStructures/v1/departments/300000044556980?$effectiveDate=2025-05-13"
                        }
                    }
                }
            },
            "legalEmployer": {
                "id": "300000046740247",
                "name": "PSR_US_LE_1",
                "$id": "300000046740247",
                "$context": {
                    "etag": "15",
                    "links": {
                        "$self": {
                            "href": "https://example.com/api/boss/data/objects/ora/hcmHrCore/workStructures/v1/legalEmployers/300000046740247?$effectiveDate=2025-05-13"
                        }
                    }
                }
            },
            "workRelationship": {
                "id": "100000329414679",
                "$id": "100000329414679",
                "$context": {
                    "etag": "1"
                }
            }
        },
        {
            "id": "300000795670049",
            "assignmentType": "E",
            "assignmentStatusType": "ACTIVE",
            "effectiveStartDate": "2018-05-28",
            "effectiveEndDate": "4712-12-31",
            "businessTitle": "Civil Engineer-6864",
            "workAtHomeFlag": false,
            "assignmentNumber": "EHDLWorker_190903_11128",
            "timeUpdated": "2025-05-06T11:42:25.787Z",
            "$id": "300000795670049",
            "$context": {
                "etag": "89"
            },
            "personDetail": {
                "personNumber": "HDLWorker_190903_11128",
                "$id": "100000329383875",
                "$context": {
                    "etag": ""
                }
            },
            "globalName": {
                "firstName": "Charlotte-Pénélope",
                "lastName": "Beer-Tröst",
                "$id": "300000795669677",
                "$context": {
                    "etag": ""
                }
            },
            "department": {
                "id": "300000044582197",
                "name": "Human Resources-GROUP/AT081000101",
                "title": null,
                "$id": "300000044582197",
                "$context": {
                    "etag": "13",
                    "links": {
                        "$self": {
                            "href": "https://example.com/api/boss/data/objects/ora/hcmHrCore/workStructures/v1/departments/300000044582197?$effectiveDate=2025-05-13"
                        }
                    }
                }
            },
            "legalEmployer": {
                "id": "300000046740247",
                "name": "PSR_US_LE_1",
                "$id": "300000046740247",
                "$context": {
                    "etag": "15",
                    "links": {
                        "$self": {
                            "href": "https://example.com/api/boss/data/objects/ora/hcmHrCore/workStructures/v1/legalEmployers/300000046740247?$effectiveDate=2025-05-13"
                        }
                    }
                }
            },
            "workRelationship": {
                "id": "100000329453488",
                "$id": "100000329453488",
                "$context": {
                    "etag": "1"
                }
            }
        },
        ...
    ],
    "hasMore": true
}

Task 3: Sottomissione di una richiesta di job di estrazione

Una volta definita la query, è possibile sottomettere una richiesta di job di estrazione utilizzando l'API Scheduler job.

URL /api/saas-batch/jobscheduler/v1/jobRequests
Metodo HTTP POST
Modello di richiesta

Per la vista workerAssignmentExtracts:

{
    "jobDefinitionName": "AsyncDataExtraction",
    "serviceName": "boss",
    "requestParameters": {
        "boss.module": "oraHcmHrCoreEmployment",
        "boss.resource.name": "workerAssignmentExtracts",
        "boss.resource.version": "v1",
        "boss.outputFormat": "json",
        "boss.request.system.param.effectiveDate": "{{effectiveDate}}",
        "boss.advancedQuery": "{{query}}"
    }
}

Per altre viste:

{
    "jobDefinitionName": "AsyncDataExtraction",
    "serviceName": "boss",
    "requestParameters": {
        "boss.module": "oraHcmHrCoreEmployment",
        "boss.resource.name": "workers",
        "boss.resource.version": "v1",
        "boss.businessView": "{{viewName}}",
        "boss.outputFormat": "json",
        "boss.request.system.param.effectiveDate": "{{effectiveDate}}",
        "boss.advancedQuery": "{{query}}"
    }
}

boss.request.system.param.effectiveDate è un parametro facoltativo che deve essere fornito solo se si desidera recuperare dati con data di validità diversa dalla data corrente.

Modello di risposta

Una volta completata la sottomissione, verrà restituito il codice di risposta 202, insieme all'intestazione Location con l'URL che punta all'istanza specifica della richiesta di job.

202 Accepted
 
Location: {{jobRequestUrl}}

Paging durante l'estrazione dei dati:

Sebbene siano stati utilizzati controlli di impaginazione, ad esempio parametri limit e offset, durante la creazione e il test della query non si desidera che i risultati dell'estrazione siano vincolati da tali controlli. Rimuovere qualsiasi utilizzo dei parametri limit e offset durante la sottomissione di una query.

Passaggio della query:

La query passata quando si sottomette la richiesta del job di estrazione deve avere il formato di una stringa JSON standard. Eseguire la query preparata e testata utilizzando l'endpoint API $query e:
  • Fuga tutte le virgolette doppie (" → \")
  • Rimuovere i caratteri di nuova riga (\n)
  • Ridurre potenzialmente altri spazi bianchi (ad es. rientranze)

Nel complesso si desidera procedere, ad esempio:

{
    "collection": {
        "limit": 100,
        "filter": "totalAmount > 10000"
    },
    "fields": [ "id", "totalAmount" ]
}

Azione da eseguire

{\"collection\": {\"filter\": \"totalAmount > 10000\"},\"fields\": [ \"id\", \"totalAmount\" ]}

Esempio

Esempio di richiesta

POST /api/saas-batch/jobscheduler/v1/jobRequests
 
{
    "jobDefinitionName": "AsyncDataExtraction",
    "serviceName": "boss",
    "requestParameters": {
        "boss.module": "oraHcmHrCoreEmployment",
        "boss.resource.name": "workerAssignmentExtracts",
        "boss.resource.version": "v1",
        "boss.outputFormat": "json",
        "boss.advancedQuery": "{\"collection\": {\"filter\": \"primaryFlag = true and timeUpdated > '2025-05-01T00:00:00Z' and assignmentType = 'E' and !(legalEmployer.id in (10001, 10002))\"},\"fields\": [ \"id\", \"assignmentType\", \"assignmentStatusType\", \"effectiveStartDate\", \"effectiveEndDate\", \"businessTitle\", \"workAtHomeFlag\", \"assignmentNumber\", \"timeUpdated\" ],\"accessors\": {\"personDetail\": {\"fields\": [ \"personNumber\" ]},\"globalName\": {\"fields\": [ \"firstName\", \"lastName\" ]},\"department\": {\"fields\": [ \"id\", \"name\", \"title\" ]},\"legalEmployer\": {\"fields\": [ \"id\", \"name\" ]},\"workRelationship\": {\"fields\": [ \"id\" ]}}}"
    }
}

Esempio di risposta

202 Accepted
 
Location: https://example.com/api/saas-batch/jobscheduler/v1/jobRequests/42075

Task 4: Controllo completamento OdL

Il controllo per il completamento implica l'utilizzo dell'API dello scheduler di job per eseguire periodicamente il polling dei dettagli della richiesta di job, fino al completamento o al completamento dell'operazione.

URL /api/saas-batch/jobscheduler/v1/jobRequests/{{jobRequestId}}
Metodo HTTP GET

Operazione completata correttamente:

Una richiesta di job viene considerata completata correttamente quando vengono soddisfatte le seguenti condizioni:
Attribuzione Valore previsto
jobDetails.jobProgress.completed true
jobDetails.jobProgress.status SUCCEEDED

Completamento non riuscito:

Una richiesta di job viene considerata non riuscita quando viene soddisfatta la condizione seguente. In tal caso, l'attributo jobDetails.jobProgress.message conterrà il messaggio di errore.
Attribuzione Valore previsto
jobDetails.jobProgress.status FAILED

Esempio

Esempio di richiesta

GET /api/saas-batch/jobscheduler/v1/jobRequests/42075

Esempi di risposta

Le risposte riportate di seguito mostrano le diverse fasi di un job sottomesso. Vedere in particolare gli attributi jobProgress.status e jobProgress.completed.

Accettata/accodata
200 OK
 
{
    "jobDetails": {
        "jobRequestId": 42075,
        "jobRequest": {
            "jobDefinitionName": "AsyncDataExtraction",
            "serviceName": "boss",
            "systemDerivedVersion": "90",
            "jobSubmitter": "TM-MFITZIMMONS",
            "requestParameters": {
                "boss.module": "oraHcmHrCoreEmployment",
                "boss.resource.name": "workerAssignmentExtracts",
                "boss.resource.version": "v1",
                "boss.outputFormat": "json",
                "boss.advancedQuery": "{\"collection\": {\"filter\": \"primaryFlag = true and timeUpdated > '2025-05-01T00:00:00Z' and assignmentType = 'E' and !(legalEmployer.id in (10001, 10002))\"},\"fields\": [ \"id\", \"assignmentType\", \"assignmentStatusType\", \"effectiveStartDate\", \"effectiveEndDate\", \"businessTitle\", \"workAtHomeFlag\", \"assignmentNumber\", \"timeUpdated\" ],\"accessors\": {\"personDetail\": {\"fields\": [ \"personNumber\" ]},\"globalName\": {\"fields\": [ \"firstName\", \"lastName\" ]},\"department\": {\"fields\": [ \"id\", \"name\", \"title\" ]},\"legalEmployer\": {\"fields\": [ \"id\", \"name\" ]},\"workRelationship\": {\"fields\": [ \"id\" ]}}}"
            },
            "jobRetryNumber": 0,
            "timeoutThreshold": 14400
        },
        "jobStatus": "ENQUEUED",
        "jobProgress": {
            "status": "ACCEPTED",
            "message": "Job is submitted",
            "startTime": "2025-05-25T13:39:01Z",
            "endTime": "2025-05-25T13:39:15Z",
            "completedPercentage": "0",
            "completed": false
        }
    },
    "$context": {
        "links": {
            "$self": {
                "href": "https://example.com/api/saas-batch/jobscheduler/v1/jobRequests/42075"
            }
        }
    }
}
In esecuzione
200 OK
 
{
    "jobDetails": {
        "jobRequestId": 42075,
        "jobRequest": {
            "jobDefinitionName": "AsyncDataExtraction",
            "serviceName": "boss",
            "systemDerivedVersion": "90",
            "jobSubmitter": "TM-MFITZIMMONS",
            "requestParameters": {
                "boss.module": "oraHcmHrCoreEmployment",
                "boss.resource.name": "workerAssignmentExtracts",
                "boss.resource.version": "v1",
                "boss.outputFormat": "json",
                "boss.advancedQuery": "{\"collection\": {\"filter\": \"primaryFlag = true and timeUpdated > '2025-05-01T00:00:00Z' and assignmentType = 'E' and !(legalEmployer.id in (10001, 10002))\"},\"fields\": [ \"id\", \"assignmentType\", \"assignmentStatusType\", \"effectiveStartDate\", \"effectiveEndDate\", \"businessTitle\", \"workAtHomeFlag\", \"assignmentNumber\", \"timeUpdated\" ],\"accessors\": {\"personDetail\": {\"fields\": [ \"personNumber\" ]},\"globalName\": {\"fields\": [ \"firstName\", \"lastName\" ]},\"department\": {\"fields\": [ \"id\", \"name\", \"title\" ]},\"legalEmployer\": {\"fields\": [ \"id\", \"name\" ]},\"workRelationship\": {\"fields\": [ \"id\" ]}}}"
            },
            "jobRetryNumber": 0,
            "timeoutThreshold": 14400
        },
        "jobStatus": "RUNNING",
        "jobProgress": {
            "jobRequestId": 42075,
            "status": "RUNNING",
            "message": "Job status is changed to RUNNING",
            "startTime": "2025-05-25T13:39:27Z",
            "endTime": "2025-05-25T13:40:25Z",
            "completedPercentage": "50",
            "completed": false
        }
    },
    "$context": {
        "links": {
            "$self": {
                "href": "https://example.com/api/saas-batch/jobscheduler/v1/jobRequests/42075"
            }
        }
    }
}
200 OK
 
{
    "jobDetails": {
        "jobRequestId": 42075,
        "jobRequest": {
            "jobDefinitionName": "AsyncDataExtraction",
            "serviceName": "boss",
            "systemDerivedVersion": "90",
            "jobSubmitter": "TM-MFITZIMMONS",
            "requestParameters": {
                "boss.module": "oraHcmHrCoreEmployment",
                "boss.resource.name": "workerAssignmentExtracts",
                "boss.resource.version": "v1",
                "boss.outputFormat": "json",
                "boss.advancedQuery": "{\"collection\": {\"filter\": \"primaryFlag = true and timeUpdated > '2025-05-01T00:00:00Z' and assignmentType = 'E' and !(legalEmployer.id in (10001, 10002))\"},\"fields\": [ \"id\", \"assignmentType\", \"assignmentStatusType\", \"effectiveStartDate\", \"effectiveEndDate\", \"businessTitle\", \"workAtHomeFlag\", \"assignmentNumber\", \"timeUpdated\" ],\"accessors\": {\"personDetail\": {\"fields\": [ \"personNumber\" ]},\"globalName\": {\"fields\": [ \"firstName\", \"lastName\" ]},\"department\": {\"fields\": [ \"id\", \"name\", \"title\" ]},\"legalEmployer\": {\"fields\": [ \"id\", \"name\" ]},\"workRelationship\": {\"fields\": [ \"id\" ]}}}"
            },
            "jobRetryNumber": 0,
            "timeoutThreshold": 14400
        },
        "jobStatus": "RUNNING",
        "jobProgress": {
            "jobRequestId": 42075,
            "status": "RUNNING",
            "message": "Publishing BOSS job progress: JobProgress(jobRequestId=42075, resourcePath=oraHcmHrCoreEmployment/v1/workers, dataDocName=null, deploymentId=null, jobStatus=RUNNING, startTime=2025-05-25T13:40:18Z, endTime=2025-05-25T13:40:38Z, completedPercentage=30, completed=false, error=null)",
            "startTime": "2025-05-25T13:40:40Z",
            "endTime": "2025-05-25T13:40:40Z",
            "completedPercentage": "30",
            "completed": false
        }
    },
    "$context": {
        "links": {
            "$self": {
                "href": "https://example.com/api/saas-batch/jobscheduler/v1/jobRequests/42075"
            }
        }
    }
}
Completamento riuscito
200 OK
 
{
    "jobDetails": {
        "jobRequestId": 42075,
        "jobRequest": {
            "jobDefinitionName": "AsyncDataExtraction",
            "serviceName": "boss",
            "systemDerivedVersion": "90",
            "jobSubmitter": "TM-MFITZIMMONS",
            "requestParameters": {
                "boss.module": "oraHcmHrCoreEmployment",
                "boss.resource.name": "workerAssignmentExtracts",
                "boss.resource.version": "v1",
                "boss.outputFormat": "json",
                "boss.advancedQuery": "{\"collection\": {\"filter\": \"primaryFlag = true and timeUpdated > '2025-05-01T00:00:00Z' and assignmentType = 'E' and !(legalEmployer.id in (10001, 10002))\"},\"fields\": [ \"id\", \"assignmentType\", \"assignmentStatusType\", \"effectiveStartDate\", \"effectiveEndDate\", \"businessTitle\", \"workAtHomeFlag\", \"assignmentNumber\", \"timeUpdated\" ],\"accessors\": {\"personDetail\": {\"fields\": [ \"personNumber\" ]},\"globalName\": {\"fields\": [ \"firstName\", \"lastName\" ]},\"department\": {\"fields\": [ \"id\", \"name\", \"title\" ]},\"legalEmployer\": {\"fields\": [ \"id\", \"name\" ]},\"workRelationship\": {\"fields\": [ \"id\" ]}}}"
            },
            "jobRetryNumber": 0,
            "timeoutThreshold": 14400
        },
        "jobStatus": "SUCCEEDED",
        "jobProgress": {
            "jobRequestId": 42075,
            "status": "SUCCEEDED",
            "message": "Job status is changed to SUCCEEDED",
            "startTime": "2025-05-25T13:39:27Z",
            "endTime": "2025-05-25T13:41:26Z",
            "completedPercentage": "100",
            "completed": true
        }
    },
    "$context": {
        "links": {
            "$self": {
                "href": "https://example.com/api/saas-batch/jobscheduler/v1/jobRequests/42075"
            }
        }
    }
}

Task 5: Recupero dettagli output estrazione

Una volta completato correttamente il job, è possibile recuperare le informazioni sul file di output. Implica l'utilizzo dell'API File Manager job per la specifica istanza di richiesta del job di estrazione.

L'output viene memorizzato in blocchi compressi.

URL /api/saas-batch/jobfilemanager/v1/jobRequests/{{jobRequestId}}/outputFiles
Metodo HTTP GET

Dimensione del file:

La dimensione del file viene restituita nell'attributo di risposta items.fileSize ed espressa in byte.

Collegamento allegato:

L'URL del contenuto effettivo del file viene restituito nell'attributo di risposta items.$context.links.enclosure.

Esempio

Esempio di richiesta

GET /api/saas-batch/jobfilemanager/v1/jobRequests/42075/outputFiles

Esempio di risposta

Nell'esempio seguente, l'output completo viene memorizzato in due file compressi.

200 OK
 
{
    "items": [
        {
            "fileName": "result_1_json.zip",
            "fileSize": 9390419,
            "timeCreated": "2025-04-22T22:04:22.667Z",
            "$context": {
                "links": {
                    "enclosure": {
                        "href": "https://example.com/api/saas-batch/jobfilemanager/v1/jobRequests/40071/outputFiles/result_1_json.zip/content"
                    },
                    "$self": {
                        "href": "https://example.com/api/saas-batch/jobfilemanager/v1/jobRequests/40071/outputFiles/result_1_json.zip"
                    }
                }
            }
        },
        {
            "fileName": "result_2_json.zip",
            "fileSize": 4462724,
            "timeCreated": "2025-04-22T22:04:36.565Z",
            "$context": {
                "links": {
                    "enclosure": {
                        "href": "https://example.com/api/saas-batch/jobfilemanager/v1/jobRequests/40071/outputFiles/result_2_json.zip/content"
                    },
                    "$self": {
                        "href": "https://example.com/api/saas-batch/jobfilemanager/v1/jobRequests/40071/outputFiles/result_2_json.zip"
                    }
                }
            }
        }
    ],
    "totalItems": 2,
    "$context": {
        "links": {
            "$self": {
                "href": "https://example.com/api/saas-batch/jobfilemanager/v1/jobRequests/40071/outputFiles"
            }
        }
    }
}

Task 6: Download dell'output di estrazione

Infine, è possibile scaricare i file di output di estrazione utilizzando l'API Job File Manager per l'istanza di richiesta del job di estrazione e il file di output specifici.

URL /api/saas-batch/jobfilemanager/v1/jobRequests/{{jobRequestId}}/outputFiles/{{fileName}}/content
Metodo HTTP GET

Suggerimento

Se necessario, è possibile scaricare file di grandi dimensioni in modo più efficiente implementando il download multithread utilizzando l'intestazione HTTP Range come di seguito.

Range: {{startByte}}-{{endByte}}/{{fileSize}}

Esempio

Esempio di richiesta

GET /api/saas-batch/jobfilemanager/v1/jobRequests/42075/outputFiles/result_42075.json/content

Esempi di risposta

La risposta effettiva è il contenuto del file compresso binario. Una volta non compresso, è pieno o parziale (nel caso dell'uso dell'intestazione Range), payload JSON non formattato, con risultati completi o parziali (nel caso di un file-chunk) della query di estrazione.

Esempio completo di risultati non compressi
{"items": [
    {"id":"300008335145001","assignmentType":"E","assignmentStatusType":"ACTIVE","effectiveStartDate":"2025-05-02","effectiveEndDate":"4712-12-31","businessTitle":"E7356262523","workAtHomeFlag":false,"assignmentNumber":"E7356262523","timeUpdated":"2025-05-01T07:53:15.722Z","$id":"300008335145001","$context":{"etag":"1"},"personDetail":{"personNumber":"7356262523","$id":"300008335144985","$context":{"etag":""}},"globalName":{"firstName":null,"lastName":"oracle","$id":"300008335144986","$context":{"etag":""}},"department":null,"legalEmployer":{"id":"300001939234024","name":"AORT Oracle United States","$id":"300001939234024","$context":{"etag":"6","links":{"$self":{"href":"/ora/hcmHrCore/workStructures/v1/$en-US/legalEmployers/300001939234024?$effectiveDate=2025-05-13"}}}},"workRelationship":{"id":"300008335144995","$id":"300008335144995","$context":{"etag":"1"}}},
    {"id":"300000310085281","assignmentType":"E","assignmentStatusType":"ACTIVE","effectiveStartDate":"2018-03-04","effectiveEndDate":"4712-12-31","businessTitle":"Medical Technologist Corporate Level-35321","workAtHomeFlag":false,"assignmentNumber":"EHDLWorker_190409_467490","timeUpdated":"2025-05-07T15:29:46.59Z","$id":"300000310085281","$context":{"etag":"90"},"personDetail":{"personNumber":"HDLWorker_190409_467490","$id":"100000127293313","$context":{"etag":""}},"globalName":{"firstName":"Martin-David","lastName":"Oestrovsky-Krein","$id":"300000310075057","$context":{"etag":""}},"department":{"id":"300000041568062","name":"GFIN Global Controlling-GROUP/GFINGC74155","title":null,"$id":"300000041568062","$context":{"etag":"13","links":{"$self":{"href":"/ora/hcmHrCore/workStructures/v1/$en-US/departments/300000041568062?$effectiveDate=2025-05-13"}}}},"legalEmployer":{"id":"300000046740247","name":"PSR_US_LE_1","$id":"300000046740247","$context":{"etag":"15","links":{"$self":{"href":"/ora/hcmHrCore/workStructures/v1/$en-US/legalEmployers/300000046740247?$effectiveDate=2025-05-13"}}}},"workRelationship":{"id":"100000127362395","$id":"100000127362395","$context":{"etag":"1"}}}
]}

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti di formazione gratuiti sul canale YouTube di Oracle Learning. Inoltre, visitare education.oracle.com/learning-explorer per diventare Oracle Learning Explorer.

Per la documentazione del prodotto, visitare Oracle Help Center.