Partiamo dal seguente riepilogo e poi approfondiamo l'ultima riga:
PLSQL_BLOCK o SQL_SCRIPT - occorre utilizzare il tipo EXECUTABLE.- PASSO 1: Preparazione del file TESTCRT_2_parametri.sql sul filesystem
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;
/
- PASSO 2: Grant necessarie per creazione/esecuzione job (eseguire come SYSDBA se necessario)
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;
- PASSO 3: Creare una CREDENTIAL per l'esecuzione del job appartenent all'utente metadata_gest
- -- username --> Utente OS con cui eseguire il comando
- -- password --> Password Utente SO
BEGINDBMS_SCHEDULER.DROP_CREDENTIAL('OS_CREDENTIAL');END;BEGINDBMS_SCHEDULER.CREATE_CREDENTIAL(credential_name => 'OS_CREDENTIAL',username => 'oracle',password => 'oracle');END;
- PASSO 1: Verifica che la credential esista
SELECT *FROM user_scheduler_credentialsWHERE credential_name = 'OS_CREDENTIAL';
- PASSO 2: Creazione di un job di test minimo
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;
- PASSO 3: Verifica il risultato (dopo 5-10 secondi)
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;
- PASSO 4: Interpreta il risultato della query relativa al passo 3
Se STATUS = 'SUCCEEDED' → Credential correttaSe STATUS = 'FAILED' e ERROR# = 27369 → Password errata o utente non esisteSe STATUS = 'FAILED' e ERROR# = 27486 → Privilegi insufficienti
- PASSO 5: Cleanup
BEGINDBMS_SCHEDULER.DROP_JOB('TEST_CREDENTIAL', force => TRUE);END;/
- PASSO 1: Drop e Creazione del job External che esegue lo script sql
- in input i parametri P1 e P2
- utente proprietario e che esegue il JOB METADATA_GEST
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;
- PASSO 2: Impostazione degli argomenti del job
- Il flag -c indica a bash di eseguire il comando che segue come stringa.
- Spiegazione:
- bash/bin/bash -c "comando da eseguire"
- c = "command" - dice a bash di leggere ed eseguire i comandi dalla stringa che segue. Senza -c, bash si aspetterebbe il nome di un file script da eseguire
- --Nel nostro caso:
- Argomento 1: il programma da eseguire job_action => '/bin/bash'
- Argomento 2: flag che dice "esegui il comando che segue" argument 1 => '-c'
- Argomento 3: il comando vero e proprio
- argument 2 =>
- 'sqlplus -S username/password@TNS @/dire/test/test.sql "P1" "P2"'
- Risultato finale è come avere la seguente stringa da eseguire da filesystem
- /bin/bash -c 'sqlplus -S username/password@TNS @/dire/test/test.sql "P1" "P2"'
BEGIN-- Argomento 1: flag -c per bashDBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(job_name => 'JOB_TEST_CRT_SQL',argument_position => 1,argument_value => '-c');
- Argomento 2: comando completo con sqlplus e parametri
- Modificare i parametri P1 e P2 senza ricreare il job
- Per vedere l'output di sqlplus su filesystem si può aggiungere un logging unix:
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;
/
- Se dopo l'esecuzione dovessimo ricevere un errore SP2-0667 allora occorre settare le variabili di ambiente dell'ORACLE_HOME e quindi modificare quanto indicato sopra in:
BEGIN
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
job_name => 'JOB_TEST_CRT_SQL',
argument_position => 2,
argument_value => 'export ORACLE_HOME=/opt/oracle/product/23ai/dbhomeFree &&
- Se dopo l'esecuzione riceviamo l'errore SP2-0546 allora tocca modificare lo script sql sostituendo &p1 ed &p2 con &1 ed &2 e rinomino il file sql da eseguire in TESTCRT_job.sql
- PASSO : Abilita ed esegue il job
Verifichiamo l'orario di esecuzione cosi da verificarlo anche sulle tabelle di loh
DATA
-----------------
20251118 18:41:58
BEGIN
DBMS_SCHEDULER.ENABLE('JOB_TEST_CRT_SQL');
END;
PL/SQL procedure successfully completed.
- PASSO : Verifica il risultato (dopo 5-10 secondi)
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;
- PASSO : Interpretazione del risultato
- PASSO : Verifica sul DB
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';

Nessun commento:
Posta un commento