Introdução
O Cloud HCM fornece um recurso para extrair dados do HCM usando a plataforma BOSS/Spectra de nova geração subjacente.
Objetivos
Ao concluir este tutorial, você entenderá como:
- Consultar views de extração do Worker e sua hierarquia de objetos
- Submeta e rastreie de forma assíncrona solicitações de job de extração para recuperação dos dados da hierarquia do Colaborador selecionado
- Fazer download de arquivos de saída de extração
Pré-requisitos
Antes de começar:
- Entre em contato com a Oracle CoE para se certificar de que a plataforma Spectra, incluindo replicação de dados RODS, esteja provisionada no seu pod
- Executar a configuração de segurança necessária, incluindo:
- Configuração de segurança de dados
- Configuração do aplicativo cliente OAuth
Casos de Uso
Essa funcionalidade permite abordar os seguintes casos de uso.
Extração Completa de Dados
A extração completa de dados do Colaborador pode ser uma atividade única ou periódica.
Você pode recuperar toda a hierarquia de objetos ou apenas um subconjunto dela.
A extração completa de dados recuperará todos os registros que correspondem aos critérios de filtragem e os arquivos de saída podem ser muito grandes.
Os objetos de data efetiva serão recuperados a partir da data efetiva solicitada, em que a data de extração atual é o padrão.
Extração Incremental de Dados
A extração incremental de dados do Colaborador geralmente é uma atividade periódica e programada.
Você pode recuperar toda a hierarquia de objetos ou apenas um subconjunto dela.
Neste caso de uso, você deseja recuperar somente objetos que foram alterados desde a execução de extração anterior, em que a primeira execução de extração é a linha de base. Para isso, os filtros de atributos timeUpdated
precisam ser aplicados em qualquer nível que esteja sujeito à detecção de alterações.
A consulta de extração de dados incrementais pode aplicar critérios de filtragem adicionais. Os arquivos de saída normalmente serão menores em comparação com a extração completa, pois conterão apenas delta.
Somente os valores atuais dos atributos serão recuperados.
Os objetos de data efetiva serão recuperados a partir da data efetiva solicitada, em que a data de extração atual é o padrão.
Atenção:
Os registros excluídos fisicamente não serão retornados usando a filtragem portimeUpdated
.
Tarefa 1: Escolhendo uma View de Extração
Escolha qual view de extração usar, dependendo dos objetos e atributos necessários. As exibições disponíveis são listadas abaixo, juntamente com os objetos e atributos que podem ser extraídos.
Extrações de Atribuição do Colaborador
Use workerAssignmentExtracts para extrair dados de atribuição de emprego dos colaboradores.
Exibir Caminho | workerAssignmentExtracts |
---|
Objeto | Atributos | Tipo de Relacionamento |
---|---|---|
workerAssignmentExtract |
|
n/a (não aplicável) |
workerAssignmentExtract.department |
|
de um para um |
workerAssignmentExtract.legalEmployer |
|
de um para um |
workerAssignmentExtract.legislation |
|
de um para um |
workerAssignmentExtract.position |
|
de um para um |
workerAssignmentExtract.grade |
|
de um para um |
workerAssignmentExtract.location |
|
de um para um |
workerAssignmentExtract.location.mainAddress |
|
de um para um |
workerAssignmentExtract.location.mainAddress.country |
|
de um para um |
workerAssignmentExtract.job |
|
de um para um |
workerAssignmentExtract.job.jobFamily |
|
de um para um |
workerAssignmentExtract.collectiveAgreement |
|
de um para um |
workerAssignmentExtract.personType |
|
de um para um |
workerAssignmentExtract.workerUnion |
|
de um para um |
workerAssignmentExtract.assignmentUserStatus |
|
de um para um |
workerAssignmentExtract.businessUnit |
|
de um para um |
workerAssignmentExtract.account |
|
de um para um |
workerAssignmentExtract.ledger |
|
de um para um |
workerAssignmentExtract.workRelationship |
|
de um para um |
workerAssignmentExtract.localName |
|
de um para um |
workerAssignmentExtract.globalName |
|
de um para um |
workerAssignmentExtract.personDetail |
|
de um para um |
Extração de Informações Legais do Colaborador
Use workerLegislativeInfoExtract para extrair dados de informações legais dos colaboradores.
Exibir Caminho | trabalhadores/$views/workerLegislativeInfoExtract |
---|
Objeto | Atributos | Tipo de Relacionamento |
---|---|---|
worker |
|
n/a (não aplicável) |
worker.personDetail |
|
de um para um |
worker.legislativeInformation |
|
de um para um |
worker.legislativeInformation.legislation |
|
de um para um |
Extração de Nomes de Colaboradores
Use workerNamesExtract para extrair dados de nomes de colaboradores.
Exibir Caminho | trabalhadores/$views/workerNamesExtract |
---|
Objeto | Atributos | Tipo de Relacionamento |
---|---|---|
worker |
|
n/a (não aplicável) |
worker.personDetail |
|
de um para um |
worker.names |
|
um para muitos |
worker.names.legislation |
|
de um para um |
worker.names.language |
|
de um para um |
Extração de Telefones do Colaborador
Use workerPhonesExtract para extrair dados de telefones dos colaboradores.
Exibir Caminho | trabalhadores/$views/workerPhonesExtract |
---|
Objeto | Atributos | Tipo de Relacionamento |
---|---|---|
worker |
|
n/a (não aplicável) |
worker.personDetail |
|
de um para um |
worker.phones |
|
um para muitos |
worker.phones.legislation |
|
de um para um |
Extração de E-mails do Colaborador
Use workerEmailsExtract para extrair dados de e-mails dos colaboradores.
Exibir Caminho | trabalhadores/$views/workerEmailsExtract |
---|
Objeto | Atributos | Tipo de Relacionamento |
---|---|---|
worker |
|
n/a (não aplicável) |
worker.personDetail |
|
de um para um |
worker.emails |
|
Um para muitos |
Diversos Idiomas:
Os atributos traduzíveis só estão disponíveis em inglês neste momento.Tarefa 2: Preparando e Testando uma Consulta de Extração
Cada view de extração tem uma API de consulta que permite criar e testar consultas de extração.
URL | /api/boss/data/objects/ora/hcmHrCore/employment/v1/{{viewPath}}/$query |
---|---|
Método HTTP | POST |
Modelo de solicitação |
{ "collection": { "limit": {{limit}}, "offset": {{offset}}, "sortBy": [ {{sortAttributes}} ], "filter": "{{topLevelFilter}}" }, "fields": [ {{topLevelAttributes}} ], "accessors": { "{{childObject}}": { "collection": { "filter": "{{childLevelFilter}}" }, "fields": [ {{childLevelAttributes}} ], "accessors": { {{nestedChildAccessors}} } }, ... } } |
Modelo de resposta |
200 OK { "items": [ {{items}} ], "hasMore": {{hasMore}} } |
Objetos e Atributos
Defina quais dados extrair, ou seja, quais objetos e atributos devem ser incluídos. A inclusão de objetos filhos requer a adição de acessores, enquanto a inclusão de campos específicos requer a listagem deles no array fields
. Consulte o exemplo completo.
Filtragem
Definir como os dados devem ser filtrados. Você pode usar as expressões a seguir para criar filtros para sua consulta.
Objetivo | Expressão | Exemplo |
---|---|---|
Teste de igualdade | field = value |
ename = 'KING' |
Teste de desigualdade | field != value |
activeFlag != true |
Teste maior que Teste menor que |
field > value |
sal > 1999.99 |
Teste de maior que ou igual a Teste de menor que ou igual |
field >= value |
sal >= 1999.99 |
Correspondência de padrões | field LIKE 'pattern' |
job LIKE 'SALES%' |
Teste de associação | field IN (value1, ..., valueN) |
deptno IN (10, 20, 40) |
Comparação de não diferenciação de maiúsculas e minúsculas | field ~= value |
ename ~= 'king' |
Teste de existência (para relacionamentos um para muitos) | child[expression] |
assignments[startDate = null] |
Conjunção lógica | expression AND expression |
|
Disjunção lógica | expression OR expression |
|
Negação lógica | !(expression) |
Filtragem por objetos filho em um relacionamento um para um:
No caso de relacionamentos um para um, você pode fazer referência a objetos filhos e seus atributos na cláusula de filtro, assim como a atributos de outros objetos pais, por exemplo,legalEmployer.id in (1001, 1002)
.
Filtrando objetos filhos em um relacionamento de um para muitos:
No caso de relacionamentos um-para-muitos, o teste de existência na tabela acima filtrará os pais que têm pelo menos um filho que atende aos critérios. No entanto, isso não significa que os registros filhos, se recuperados, serão filtrados automaticamente. Se quiser garantir que você só obtenha registros filhos que atendam aos critérios, você também precisará repetir o filtro no nível filho.Por exemplo, se você quiser recuperar apenas telefones do tipo W1
, será necessário aplicar os seguintes filtros:
{ "collection": { "filter": "phones[type = 'W1']" }, "accessors": { "phones": { "collection": { "filter": "type = 'W1'" }, ...
Filtrando por data efetiva:
No caso de objetos com data efetiva, você obterá dados efetivos a partir da data atual por padrão. Para recuperar dados efetivos a partir de uma data específica, use o parâmetro de consulta HTTP$effectiveDate
.
Por exemplo, se você quiser recuperar dados efetivos a partir de 2023-01-01
, use o seguinte URL para sua consulta:
/api/boss/data/objects/ora/hcmHrCore/employment/v1/{{viewPath}}/$query?$effectiveDate=2023-01-01
Classificação
Definir como os dados devem ser classificados. A classificação é expressa por um array de atributos de classificação, incluindo a direção de classificação (asc ou desc). Por exemplo:
"sortBy": [ { "totalAmount": "desc" }, { "paidAmount": "asc" } ]
Pager
Definir como os dados devem ser paginados. O cliente pode controlar a paginação fornecendo parâmetros de limite e deslocamento. Por exemplo:
"limit": 200, "offset": 400
O limite padrão é 25
e o limite máximo é 1000
.
O deslocamento padrão é 0
e indica o início dos resultados.
O atributo de nível superior hasMore
na resposta indica se há mais resultados a serem extraídos.
A paginação não deve ser usada como uma forma alternativa de extrair dados. Ao consultar essa API, não há garantia de que os dados não serão alterados entre as solicitações. Use a API assíncrona para extração de dados.
Exemplo
O exemplo de consulta de extração abaixo foi projetado para recuperar informações de atribuições junto com detalhes do empregador legal e do departamento, que:
- São atribuições principais
- São do tipo Funcionário
- Não pertencem a Empregadores Legais com os IDs
10001
e10002
- São efetivos a partir da data de extração
- Foi atualizado (ou criado) desde a execução anterior
Exemplo de Solicitação
Observe a condição do parâmetro limit
e do atributo timeUpdated
com o timestamp da execução de extração anterior.
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" ] } } }
Exemplo de Resposta
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 }
Tarefa 3: Submetendo uma Solicitação de Tarefa de Extração
Depois que a consulta for definida, uma solicitação de job de extração poderá ser enviada usando a API do Programador de Jobs.
URL | /api/saas-batch/jobscheduler/v1/jobRequests |
---|---|
Método HTTP | POST |
Modelo de solicitação |
Para a view { "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}}" } } Para outras visualizações: { "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}}" } }
|
Modelo de resposta |
No envio bem-sucedido, o código de resposta 202 Accepted Location: {{jobRequestUrl}} |
Paginação ao extrair dados:
Embora você possa ter usado controles de paginação, ou seja, parâmetroslimit
e offset
, ao criar e testar a consulta, não deseja que os resultados da extração sejam restringidos por eles. Remova qualquer uso de parâmetros limit
e offset
ao enviar uma consulta.
Passando na consulta:
A consulta informada ao enviar a solicitação de job de extração deve estar no formato de uma string JSON padrão. Execute a consulta preparada e testada usando o ponto final da API$query
e:
- Escape de todas as aspas duplas (" → \")
- Remover qualquer caractere de nova linha (\n)
- Reduzir potencialmente outros espaços em branco (por exemplo, recuos)
No geral, você deseja ir, por exemplo, de:
{ "collection": { "limit": 100, "filter": "totalAmount > 10000" }, "fields": [ "id", "totalAmount" ] }
Para:
{\"collection\": {\"filter\": \"totalAmount > 10000\"},\"fields\": [ \"id\", \"totalAmount\" ]}
Exemplo
Exemplo de Solicitação
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\" ]}}}" } }
Exemplo de Resposta
202 Accepted Location: https://example.com/api/saas-batch/jobscheduler/v1/jobRequests/42075
Tarefa 4: Verificando a Conclusão da Tarefa
A verificação da conclusão envolve o uso da API do Programador de Jobs para sondar periodicamente os detalhes da solicitação de job, até que ela seja concluída com sucesso ou falhe.
URL | /api/saas-batch/jobscheduler/v1/jobRequests/{{jobRequestId}} |
---|---|
Método HTTP | GET |
Conclusão bem-sucedida:
Uma solicitação de job será considerada concluída com sucesso quando as seguintes condições forem atendidas:Atrib. | Valor esperado |
---|---|
jobDetails.jobProgress.completed |
true |
jobDetails.jobProgress.status |
SUCCEEDED |
Falha na conclusão:
Uma solicitação de job será considerada com falha quando a condição a seguir for atendida. Nesse caso, o atributojobDetails.jobProgress.message
conterá a mensagem de erro.
Atrib. | Valor esperado |
---|---|
jobDetails.jobProgress.status |
FAILED |
Exemplo
Exemplo de Solicitação
GET /api/saas-batch/jobscheduler/v1/jobRequests/42075
Exemplos de Resposta
As respostas a seguir mostram diferentes estágios de um job enviado. Consulte os atributos jobProgress.status
e jobProgress.completed
em particular.
Aceito/Enfileirado
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" } } } }
Executando
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" } } } }
Operação Concluída com Sucesso
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" } } } }
Tarefa 5: Extraindo Detalhes da Saída da Extração
Depois que o job for concluído com sucesso, suas informações do arquivo de saída poderão ser extraídas. Envolve o uso da API do Gerenciador de Arquivos de Job para a instância de solicitação de job de extração específica.
A saída é armazenada em partes compactadas.
URL | /api/saas-batch/jobfilemanager/v1/jobRequests/{{jobRequestId}}/outputFiles |
---|---|
Método HTTP | GET |
Tamanho do arquivo:
O tamanho do arquivo é retornado no atributo de respostaitems.fileSize
e expresso em bytes.
Link do gabinete:
O URL para o conteúdo do arquivo real é retornado no atributo de respostaitems.$context.links.enclosure
.
Exemplo
Exemplo de Solicitação
GET /api/saas-batch/jobfilemanager/v1/jobRequests/42075/outputFiles
Exemplo de Resposta
No exemplo abaixo, a saída completa é armazenada em dois arquivos compactados.
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" } } } }
Tarefa 6: Fazendo Download da Saída de Extração
Por fim, é possível fazer download dos arquivos de saída de extração usando a API do Gerenciador de Arquivos de Job para a instância de solicitação de job de extração e o arquivo de saída específicos.
URL | /api/saas-batch/jobfilemanager/v1/jobRequests/{{jobRequestId}}/outputFiles/{{fileName}}/content |
---|---|
Método HTTP | GET |
Dica:
Se necessário, você pode fazer download de arquivos grandes com mais eficiência implementando o download multithread usando o cabeçalho HTTP Range como abaixo.Range: {{startByte}}-{{endByte}}/{{fileSize}}
Exemplo
Exemplo de Solicitação
GET /api/saas-batch/jobfilemanager/v1/jobRequests/42075/outputFiles/result_42075.json/content
Exemplos de Resposta
A resposta real é o conteúdo binário do arquivo compactado. Uma vez descompactado, ele é completo ou parcial (no caso de uso do cabeçalho Range
), payload JSON não formatado, com resultados completos ou parciais (no caso de um bloco de arquivos) da consulta de extração.
Exemplo de resultados descompactados completos
{"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"}}} ]}
Mais Recursos de Aprendizagem
Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal do Oracle Learning YouTube. Além disso, acesse education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.
Para obter a documentação do produto, visite o Oracle Help Center.
Extrair Dados do HCM Usando os Serviços Spectra
G38795-01
Julho de 2025