Oggi parliamo di una tipologia di tabelle particolari:
- Cosa sono le table function
Oggi parliamo di una tipologia di tabelle particolari:
Partiamo dal seguente riepilogo e poi approfondiamo l'ultima riga:
PLSQL_BLOCK o SQL_SCRIPT - occorre utilizzare il tipo EXECUTABLE.DECLARE
BEGIN
EXECUTE IMMEDIATE 'create table appo_wrapper_&p1 as select * from cat ';
EXECUTE IMMEDIATE 'create table appo_wrapper_&p2 as select * from cat ';
END;
/
Prima di creare il job per l'esecuzione del file dobbiamo settare l'ambiente (DB) affinchè esegua il job senza problemi.
- Come SYSDBA, verificare le grant che mancano
SELECT 'GRANT ' || privilege || ' TO metadata_gest;' AS comando_grantFROM (SELECT 'CREATE JOB' AS privilege FROM dualUNION ALLSELECT 'CREATE EXTERNAL JOB' FROM dualUNION ALLSELECT 'CREATE CREDENTIAL' FROM dual) requiredWHERE privilege NOT IN (SELECT privilegeFROM dba_sys_privsWHERE grantee = 'METADATA_GEST');
eseguire come SYSDBA se necessario
GRANT CREATE EXTERNAL JOB TO METADATA_GEST;
GRANT EXECUTE, DEBUG on "SYS"."DBMS_SCHEDULER" to "METADATA_GEST" ;
GRANT EXECUTE, DEBUG on "SYS"."DBMS_ISCHED" to "METADATA_GEST" ;
GRANT CREATE JOB TO metadata_gest;
GRANT CREATE CREDENTIAL TO metadata_gest;
BEGINDBMS_SCHEDULER.DROP_CREDENTIAL('OS_CREDENTIAL');END;BEGINDBMS_SCHEDULER.CREATE_CREDENTIAL(credential_name => 'OS_CREDENTIAL',username => 'oracle',password => 'oracle');END;
SELECT *FROM user_scheduler_credentialsWHERE credential_name = 'OS_CREDENTIAL';
SELECT TO_CHAR(SYSDATE,'YYYYMMDDHH24:MI:SS') FROM DUAL;-- occorre per determinare l'orario di inizio test--BEGINDBMS_SCHEDULER.CREATE_JOB (job_name => 'TEST_CREDENTIAL',job_type => 'EXECUTABLE',job_action => '/bin/echo',number_of_arguments => 1,credential_name => 'OS_CREDENTIAL',enabled => FALSE);DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(job_name => 'TEST_CREDENTIAL',argument_position => 1,argument_value => 'Test credential OK');DBMS_SCHEDULER.ENABLE('TEST_CREDENTIAL');-- Esegue il job appena creato come utente METADATA_GESTDBMS_SCHEDULER.RUN_JOB('TEST_CREDENTIAL', FALSE);END;
SELECTowner,job_name,status,log_date,additional_info, error#FROM user_scheduler_job_run_detailsWHERE job_name = 'TEST_CREDENTIAL'ORDER BY log_date DESCFETCH FIRST 1 ROWS ONLY;
Se STATUS = 'SUCCEEDED' → Credential correttaSe STATUS = 'FAILED' e ERROR# = 27369 → Password errata o utente non esisteSe STATUS = 'FAILED' e ERROR# = 27486 → Privilegi insufficienti
BEGINDBMS_SCHEDULER.DROP_JOB('TEST_CREDENTIAL', force => TRUE);END;/
BEGINDBMS_SCHEDULER.DROP_JOB(job_name =>
'"METADATA_GEST"."JOB_TEST_CRT_SQL"',defer => false,force => true);END;
BEGINDBMS_SCHEDULER.CREATE_JOB (job_name => 'JOB_TEST_CRT_SQL',job_type => 'EXECUTABLE',job_action => '/bin/bash',number_of_arguments => 2,credential_name => 'OS_CREDENTIAL',enabled => FALSE,auto_drop => FALSE,comments => 'Esegue test.sql con parametri P1 e P2');END;
BEGIN-- Argomento 1: flag -c per bashDBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(job_name => 'JOB_TEST_CRT_SQL',argument_position => 1,argument_value => '-c');
job_name => 'JOB_TEST_CRT_SQL',DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(argument_value => '/opt/oracle/product/23ai/dbhomeFree/bin/sqlplus -s A00/oracle@FREEPDB1argument_position => 2,
@/opt/sched_cdd/wrapper_0.0/sql/TESTCRT_2_parametri.sql "VALORE_P1" "VALORE_P2"'
);
END;
/
Verifichiamo l'orario di esecuzione cosi da verificarlo anche sulle tabelle di loh
PL/SQL procedure successfully completed.
SELECT owner,job_name,status,log_date,additional_info, output,error#FROM user_scheduler_job_run_detailsWHERE job_name = 'JOB_TEST_CRT_SQL'ORDER BY log_date DESCFETCH FIRST 1 ROWS ONLY;
SELECT * FROM CAT where table_name like 'APPO%'TABLE_NAME TABLE_TYPE------------------------- -----------APPO_WRAPPER_VALORE_P1 TABLEAPPO_WRAPPER_VALORE_P2 TABLE
-- Per eseguire immediatamente il job (test manuale)BEGINDBMS_SCHEDULER.RUN_JOB(job_name => 'JOB_TEST_CRT_SQL',use_current_session => FALSE);END;/-- Disabilitare il jobBEGINDBMS_SCHEDULER.DISABLE('JOB_TEST_CRT_SQL');END;/-- Eliminare il jobBEGINDBMS_SCHEDULER.DROP_JOB(job_name => 'JOB_TEST_CRT_SQL',force => TRUE);END;/-- Eliminare la credentialBEGINDBMS_SCHEDULER.DROP_CREDENTIAL('OS_CREDENTIAL');END;/
-- Verificare lo stato del jobSELECT job_name, state, enabled, last_start_date, next_run_date, failure_countFROM user_scheduler_jobsWHERE job_name = 'JOB_TEST_CRT_SQL';-- Vedere il log delle esecuzioniSELECT log_date, status, error#, additional_infoFROM user_scheduler_job_run_detailsWHERE job_name = 'JOB_TEST_CRT_SQL'ORDER BY log_date DESC;-- Vedere i dettagli dell'output del jobSELECT log_date, owner,operation,status,credential_name,additional_infoFROM user_scheduler_job_logWHERE job_name = 'JOB_TEST_CRT_SQL'ORDER BY log_date DESC;
-- 1. Stato corrente del jobSELECTjob_name,state, -- SCHEDULED, RUNNING, COMPLETED, etc.enabled,last_start_date,last_run_duration,next_run_date,run_count,failure_countFROM user_scheduler_jobsWHERE job_name = 'JOB_TEST_CRT_SQL';-- 2. Storico delle esecuzioni (dettagliato)SELECTlog_id,log_date,job_name,status, -- SUCCEEDED, FAILED, STOPPED, etc.error#,additional_infoFROM user_scheduler_job_run_detailsWHERE job_name = 'JOB_TEST_CRT_SQL'ORDER BY log_date DESCFETCH FIRST 10 ROWS ONLY;-- 3. Log completo con outputSELECTlog_date,status,req_start_date,actual_start_date,run_duration,cpu_usedFROM user_scheduler_job_logWHERE job_name = 'JOB_TEST_CRT_SQL'ORDER BY log_date DESC;-- 4. Se il job è FALLITO, vedi i dettagli dell'erroreSELECTlog_date,status,error#,additional_infoFROM user_scheduler_job_run_detailsWHERE job_name = 'JOB_TEST_CRT_SQL'AND status = 'FAILED'ORDER BY log_date DESC;-- 5. Verifica se il job è in esecuzione in questo momentoSELECTjob_name,session_id,running_instance,elapsed_time,cpu_usedFROM user_scheduler_running_jobsWHERE job_name = 'JOB_TEST_CRT_SQL';-- 6. Output dettagliato del job (se configurato)SELECT*FROM user_scheduler_job_logWHERE job_name = 'METADATA_GEST.JOB_TEST_CRT_SQL'ORDER BY log_date DESC;--Interpretazione dei risultati:--STATUS = 'SUCCEEDED' → Esecuzione completata con successo--STATUS = 'FAILED' → Esecuzione fallita (guarda error# e additional_info)--STATUS = 'STOPPED' → Job interrotto manualmente--STATE = 'RUNNING' → Job in esecuzione ora--STATE = 'SCHEDULED' → Job in attesa della prossima esecuzione-- 1. Verifica il dettaglio completo dell'erroreSELECTlog_date,status,error#,additional_info,actual_start_dateFROM user_scheduler_job_run_detailsWHERE job_name = 'JOB_TEST_CRT_SQL'ORDER BY log_date DESCFETCH FIRST 1 ROWS ONLY;"EXTERNAL_LOG_ID="job_96755_80368",ORA-27369: job of type EXECUTABLE failed with exit code: 127 /bin/bash: sqlplus: command not foundSTANDARD_ERROR="/bin/bash: sqlplus: command not found""-- 2. Verifica se la CREDENTIAL è validaSELECTcredential_name, username, commentsFROM user_scheduler_credentialsWHERE credential_name = 'OS_CREDENTIAL';
Per aumentare il livello di logging di un agent ODI occorre modificare alcuni parametri presenti nei file di configurazione.
I seguenti componenti di ODI possono essere tracciati:
Alcune esecuzioni richiedono che il file eseguibile (come Oracle Database sqlldr) si trovi nel percorso di comando per poter essere eseguito da Oracle Data Integrator (ODI) sull'agente Marketplace.
Per impostazione predefinita, l'agente autonomo distribuito sull'istanza ODI su Marketplace non imposta alcuna informazione sul percorso. Ciò comporta errori del tipo "file non trovato" o simili quando si tenta di utilizzare strumenti esterni.
Per configurare all'interno di un agent il richiamo del tool sqlldr o un qualsiasi altro External Tools di ODI occorre far riferimento alla seguente NOTA:
Di seguito un esempio di come integrare la funzione di oracle Listagg in ODI.
Supponiamo di dover fare una aggregazione ed inserire in una tabella il risultato, consideriamo una tabella dello schema HR di oracle ed ineriamo in una tabella copia,
Questo sarà il mapping:
Occorre inserire la funzione di Listagg all'interno di un componente AGGREGATE.
A questo punto quando verrà generato in simulazione la query avremo la select corretta.
Per verificare che la funzione Listagg sia vista come una funzione di aggregazione possiamo verificare sulla topologia che sia presente nel linguaggio come funzione di Aggregazione.
Nota: in alcune versioni di ODI MarketPlace 14c su Cloud ci potrebbe essere un bug.