<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oracle &#8211; Furushima</title>
	<atom:link href="https://furushima.com.br/blog/category/banco-de-dados/oracle/feed/" rel="self" type="application/rss+xml" />
	<link>https://furushima.com.br</link>
	<description>- Consultoria de Banco de Dados &#124; Furushima</description>
	<lastBuildDate>Sat, 27 Sep 2025 17:08:14 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://furushima.com.br/wp-content/uploads/2024/02/cropped-favicon-32x32.png</url>
	<title>Oracle &#8211; Furushima</title>
	<link>https://furushima.com.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Oracle Data Block Recover</title>
		<link>https://furushima.com.br/blog/oracle-data-block-recover/</link>
		
		<dc:creator><![CDATA[Acacio Lima Rocha]]></dc:creator>
		<pubDate>Sat, 27 Sep 2025 17:08:14 +0000</pubDate>
				<category><![CDATA[CDB]]></category>
		<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">https://furushima.com.br/?p=2912</guid>

					<description><![CDATA[A recuperação de blocos de dados corrompidos no Oracle Database é uma técnica essencial para garantir a integridade dos dados sem a necessidade de restaurar todo o banco de dados. O Oracle fornece uma funcionalidade topzera para corrigir blocos corrompidos individualmente usando o RMAN, e é possível analisar o conteúdo desses blocos através de dumps [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>A recuperação de blocos de dados corrompidos no Oracle Database é uma técnica essencial para garantir a integridade dos dados sem a necessidade de restaurar todo o banco de dados. O Oracle fornece uma funcionalidade topzera para corrigir blocos corrompidos individualmente usando o <strong>RMAN</strong>, e é possível analisar o conteúdo desses blocos através de dumps para examinar registros específicos.</p>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-6d5b5a8f143d711856e2bac48efce38c"><strong>⚠️ CONTÉM TEXTO MELHORADO POR AI  &#8211; E TA TUDO BEM (SE SOUBER USAR 🤭)⚠️ </strong></p>



<p>Agora um pouco sobre a arquitetura do data bloco e rowid no Oracle:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img alt="" decoding="async" src="https://acaciolrdba.wordpress.com/wp-content/uploads/2024/10/image.png?w=561" alt="" class="wp-image-944"/><figcaption class="wp-element-caption">Oracle Data Block</figcaption></figure></div>


<h3 class="wp-block-heading">Descrição da Estrutura:</h3>



<ol class="wp-block-list">
<li><strong>Database Block</strong>: O <strong>bloco de dados</strong> é a menor unidade de armazenamento no Oracle. Dentro dele, são armazenados vários pedaços de linha (row pieces), além de informações de controle e metadados que ajudam a gerenciar o armazenamento.</li>



<li><strong>Row Piece</strong>: Um <strong>pedaço de linha</strong> (row piece) é uma parte de uma linha de dados que pode estar completa em um único bloco ou distribuída em vários blocos (chaining ou migration). Ele contém todas as informações relacionadas aos dados da linha.</li>



<li><strong>Row Header</strong>: O <strong>cabeçalho da linha</strong> inclui informações de controle sobre a linha armazenada, como:
<ul class="wp-block-list">
<li><strong>Row Overhead</strong>: Espaço reservado para informações de controle, como status da transação associada à linha e flags de bloqueio.</li>



<li><strong>Number of Columns</strong>: O número de colunas armazenadas na linha.</li>
</ul>
</li>



<li><strong>Column Data</strong>:
<ul class="wp-block-list">
<li><strong>Cluster Key ID (se for clustered)</strong>: Identificação da chave de cluster (caso a tabela faça parte de um cluster).</li>



<li><strong>ROWID of Chained Row Pieces (se houver)</strong>: Se a linha estiver fragmentada em vários blocos, o ROWID (localização da linha) dos outros pedaços de linha será armazenado aqui.</li>



<li><strong>Column Length</strong>: Indica o tamanho de cada coluna.</li>



<li><strong>Column Value</strong>: O valor real da coluna é armazenado nessa parte, onde cada coluna tem seu comprimento e valor específicos.</li>
</ul>
</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img alt="" decoding="async" src="https://acaciolrdba.wordpress.com/wp-content/uploads/2024/10/dallc2b7e-2024-10-18-15.17.04-a-clean-and-detailed-diagram-of-a-data-structure-representing-an-oracle-rowid-similar-to-the-original-image-provided.-the-image-should-contain-a-line.webp?w=1024" alt="" class="wp-image-948" style="width:696px;height:auto"/><figcaption class="wp-element-caption">Estrutura do ROWID (Representação tosca por AI)</figcaption></figure></div>


<ol class="wp-block-list">
<li><strong>Object ID (OOOOOOO)</strong> &#8211; Representado em vermelho, com 4 bytes de tamanho. Esta parte identifica o objeto no banco de dados (como uma tabela ou índice).</li>



<li><strong>Datafile Number (OBBOFLEBF)</strong> &#8211; Representado em azul, com 1,5 bytes de tamanho. Refere-se ao número do arquivo de dados onde o bloco específico reside.</li>



<li><strong>Block Number (BBBBBB)</strong> &#8211; Representado em verde, com 2,5 bytes de tamanho. Indica o número do bloco dentro do arquivo de dados onde a linha está armazenada.</li>



<li><strong>Row Number (<strong>BBBBBB</strong>R)</strong> &#8211; Representado em preto, com 2 bytes de tamanho. Identifica a linha específica dentro do bloco de dados.</li>
</ol>



<h3 class="wp-block-heading">1. <strong>Identificação de Blocos Corrompidos</strong></h3>



<p>Primeiramente, é necessário identificar os blocos corrompidos no banco de dados. O Oracle mantém uma tabela de sistema chamada <strong>V$DATABASE_BLOCK_CORRUPTION</strong> que lista todos os blocos identificados como corrompidos:</p>



<p>Você pode se atentar ao erro do Oracle:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
ORA-01578: ORACLE data block corrupted (file # X, block # Y)
</pre></div>


<p>Nessa mensagem de erro podemos notar que existe ali o identificador do datafile e do bloco em questão.</p>



<p>Para checar o datafile use a query:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
SELECT file_name
FROM dba_data_files
WHERE file_id = &lt;file#&gt;;
</pre></div>


<p>Para checar o bloco corrompido, pode usar:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
RMAN&gt; BLOCKRECOVER CORRUPION LIST;
SQL&gt; 
COLUMN owner FORMAT A20
COLUMN segment_name FORMAT A30

SELECT DISTINCT owner, segment_name
FROM   v$database_block_corruption dbc
       JOIN dba_extents e ON dbc.file# = e.file_id AND dbc.block# BETWEEN e.block_id and e.block_id+e.blocks-1
ORDER BY 1,2;
</pre></div>


<p>Essa tabela é populada automaticamente após verificações de integridade realizadas por comandos como <code>DBV</code> (Data Block Verifier) ou após erros de leitura durante operações no banco de dados.</p>



<h4 class="wp-block-heading">Outra forma de verificar corrupção de blocos é através de:</h4>



<ul class="wp-block-list">
<li><strong>Alert Log</strong>: mensagens de erro indicando falha de leitura de blocos.</li>



<li><strong>DBVERIFY</strong>: uma ferramenta externa que faz varreduras em datafiles.</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
dbv file=/path/to/datafile.dbf blocksize=8192
</pre></div>


<h3 class="wp-block-heading">2. <strong>Recuperação de Blocos Corrompidos com RMAN</strong></h3>



<p>Após identificar o(s) bloco(s) corrompido(s), podemos usar o RMAN para a recuperação. O processo pode ser feito enquanto o banco de dados está aberto, reduzindo o tempo de inatividade.</p>



<h4 class="wp-block-heading">Etapas para recuperação:</h4>



<ol class="wp-block-list">
<li><strong>Conectar ao RMAN</strong>:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
 rman target /
</pre></div>


<ol start="2" class="wp-block-list">
<li><strong>Executar o comando de recuperação de bloco</strong>: Você pode especificar o arquivo de dados e o número de bloco diretamente:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
RMAN&gt; BLOCKRECOVER DATAFILE 4 BLOCK 12345;
</pre></div>


<p>Para recuperar vários blocos de uma vez:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
RMAN&gt; BLOCKRECOVER DATAFILE 4 BLOCK 12345, 12346, 12347;
</pre></div>


<ol start="3" class="wp-block-list">
<li><strong>Verificar se os blocos foram recuperados</strong>: Após a execução do comando <code>BLOCKRECOVER</code>, você pode verificar novamente a visão <strong>V$DATABASE_BLOCK_CORRUPTION</strong> para garantir que os blocos não estão mais corrompidos:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
SQL&gt; SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;
</pre></div>


<h3 class="wp-block-heading">3. <strong>Examinando o Conteúdo de Blocos de Dados</strong></h3>



<p>Para entender o conteúdo de um bloco de dados específico, o Oracle oferece um método de &#8220;dumper&#8221; de blocos. Esse procedimento pode ser útil para verificar o que está gravado no bloco, como registros de tabelas.</p>



<h4 class="wp-block-heading">Passos para realizar o dump de um bloco:</h4>



<ol class="wp-block-list">
<li><strong>Identifique o número do bloco, número do arquivo de dados</strong> <strong>e objeto</strong> onde o registro está armazenado. Você pode usar a query abaixo para localizar o arquivo e o número do bloco de uma linha específica:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
SQL&gt; SELECT tablespace_name, segment_type, owner, segment_name
        FROM dba_extents
       WHERE file_id = &lt;file#&gt;
         AND &lt;block#&gt; BETWEEN block_id AND block_id + blocks - 1;

SQL&gt; 
COLUMN ROWID FORMAT A18
COLUMN OB_ID FORMAT 99999
COLUMN FILE_ID FORMAT 9
COLUMN BL_NUM FORMAT 99999
COLUMN ROW_NUM FORMAT 99
COLUMN OWNER FORMAT A2
COLUMN OBJECT_NAME FORMAT A9
COLUMN FILE_NAME FORMAT A71
COLUMN FILE_NAME FORMAT A71
COLUMN TABLESPACE_NAME FORMAT A15
SELECT tr.rowid,
       dbms_rowid.rowid_object(tr.rowid) AS OB_ID,
       dbms_rowid.rowid_relative_fno(tr.rowid) AS FILE_ID,
       dbms_rowid.rowid_block_number(tr.rowid) AS BL_NUM,
       dbms_rowid.rowid_row_number(tr.rowid) AS ROW_NUM,
       ob.owner,
       ob.object_name,
       df.file_name,
       df.tablespace_name
  FROM sys.dba_brabo_tb tr
 INNER JOIN dba_objects ob
    ON ob.object_id = dbms_rowid.rowid_object(tr.rowid)
 INNER JOIN dba_data_files df
    ON df.file_id = dbms_rowid.rowid_relative_fno(tr.rowid)
 WHERE tr.dba_brabo_alunos = 666;
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
COLUMN file_id          FORMAT 99999                                                       -- Número do arquivo relativo
COLUMN block_id         FORMAT 9999999                                                     -- Número do bloco no arquivo
COLUMN row_number       FORMAT 99999                                                       -- Número da linha no bloco
COLUMN rows_per_block   FORMAT 99999                                                       -- Total de linhas no bloco
COLUMN rowid            FORMAT A18                                                         -- ROWID do registro
COLUMN file_name        FORMAT A50                                                         -- Nome do arquivo de dados
COLUMN block_size_kb    FORMAT 999999                                                      -- Tamanho do bloco em KB
COLUMN total_blocks     FORMAT 999999                                                      -- Total de blocos
COLUMN segment_name     FORMAT A30                                                         -- Nome do segmento
COLUMN total_rows       FORMAT 99999999                                                    -- Total de linhas estimadas
COLUMN avg_row_length   FORMAT 9999                                                        -- Tamanho médio de uma linha

SELECT 
    A.ROWID AS row_id,                                                                     -- ROWID do registro
    DBMS_ROWID.ROWID_RELATIVE_FNO(A.ROWID) AS file_id,                                     -- Número relativo do arquivo
    DBMS_ROWID.ROWID_BLOCK_NUMBER(A.ROWID) AS block_id,                                    -- Número do bloco no arquivo
    DBMS_ROWID.ROWID_ROW_NUMBER(A.ROWID) AS row_number,                                    -- Número da linha dentro do bloco
    COUNT(*) OVER (PARTITION BY DBMS_ROWID.ROWID_BLOCK_NUMBER(A.ROWID)) AS rows_per_block, -- Total de linhas no bloco
    T.FILE_NAME AS file_name,                                                              -- Nome do arquivo de dados correspondente
    T.BYTES/1024 AS block_size_kb,                                                         -- Tamanho do bloco em KB
    T.BLOCKS AS total_blocks,                                                              -- Total de blocos alocados
    B.SEGMENT_NAME AS segment_name,                                                        -- Nome do segmento associado
    S.NUM_ROWS AS total_rows,                                                              -- Total de linhas estimadas na tabela
    S.AVG_ROW_LEN AS avg_row_length                                                        -- Tamanho médio de uma linha na tabela
FROM 
    DBA_BRABO_TB A
LEFT JOIN 
    DBA_DATA_FILES T
ON 
    T.RELATIVE_FNO = DBMS_ROWID.ROWID_RELATIVE_FNO(A.ROWID)                                -- Relaciona arquivo relativo com DBA_DATA_FILES
LEFT JOIN 
    DBA_SEGMENTS B
ON 
    B.SEGMENT_NAME = 'DBA_BRABO_TB' AND B.OWNER = 'SEU_OWNER'                         -- Ajuste o OWNER conforme necessário
LEFT JOIN 
    DBA_TABLES S
ON 
    S.TABLE_NAME = 'DBA_BRABO_TB' AND S.OWNER = 'SEU_OWNER'                           -- Ajuste o OWNER conforme necessário
WHERE 
    ROWNUM &lt;= 1000
ORDER BY 
    file_id, block_id, row_number;
</pre></div>


<ol start="2" class="wp-block-list">
<li><strong>Usar o comando <code>ALTER SYSTEM DUMP</code> para fazer o dump do bloco</strong>: Para fazer o dump do bloco, utilize o seguinte comando:</li>
</ol>



<p>O comando <code>ALTER SYSTEM DUMP DATAFILE</code> é uma instrução no Oracle que permite extrair informações detalhadas sobre um bloco específico dentro de um arquivo de dados. Essa instrução é usada para diagnosticar problemas de corrupção de bloco, entender a estrutura do bloco, ou obter detalhes sobre os dados contidos em um bloco específico no banco de dados.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
 SQL&gt; ALTER SYSTEM DUMP DATAFILE 4 BLOCK 12345;
</pre></div>


<p>Isso irá gerar um arquivo de dump no diretório de logs do Oracle, geralmente localizado em <code>$ORACLE_HOME/diag</code>.</p>



<ol start="3" class="wp-block-list">
<li><strong>Analisar o arquivo de dump</strong>: O dump contém informações hexadecimais e registros detalhados sobre o conteúdo do bloco. O dump vai incluir cabeçalhos, transações ativas ou inativas, e os dados efetivos gravados nesse bloco.</li>



<li>Isso é coisa antiga, lá pra Oracle 7 e 8, mas ainda funfa. </li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
Dump file /u01/app/oracle/diag/rdbms/dbabrabo/trace/orcl_ora_12345.trc
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1
System name:    Linux
Node name:      dbabrabo01
Release:        4.18.0-80.el8.x86_64
Version:        #1 SMP Wed Apr 24 11:50:52 EDT 2019
Machine:        x86_64
Instance name: dbabrabo01
Redo thread mounted by this instance: 1
Oracle process number: 45
Unix process pid: 12345, image: oracle@dbabrabo01

*** 2024-10-21 14:35:10.123456 +00:00
*** SESSION ID:(12345.6789) 2024-10-21 14:35:10.123456
*** CLIENT ID:() 2024-10-21 14:35:10.123456
*** SERVICE NAME:(SYS$USERS) 2024-10-21 14:35:10.123456
*** MODULE NAME:(sqlplus@dbabrabo01 (TNS V1-V3)) 2024-10-21 14:35:10.123456
*** ACTION NAME:() 2024-10-21 14:35:10.123456

Start dump data blocks tsn: 4 file#: 4 minblk 12345 maxblk 12345
Block dump from cache:
Dump of buffer cache at level 4 for tsn=4 rdba=16777221

buffer tsn: 4 rdba: 0x01003039 (4/12345)
scn: 0x0000.01234567 seq: 0x01 flg: 0x06 tail: 0x567890ab
frmt: 0x02 chkval: 0xa1d7 type: 0x06=trans data

Block header dump:  0x01003039
 Object id on Block? Y
 seg/obj: 0x456789  csc: 0x00.12345678  itc: 3  flg: O-
  brn: 0  bdba: 0x01003038 ver: 0x01 opc: 0
  inc: 0  exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0009.001.00001234 0x01800012.3456789f C---    0 scn 0x0000.01234567
0x02 0x0012.002.00004567 0x01800012.345679ab --U-    2 scn 0x0000.01234568
0x03 0x0034.001.00007890 0x01800012.34567abc ----    3 scn 0x0000.01234569

Data Block:
-----------------------------------------------------------------------------
tsiz: 0x1fa0
flag: 0x2
nrid:  0x01003039
col  0: &#x5B; 3]  c1 02 03
col  1: &#x5B; 2]  c1 04
col  2: &#x5B; 4]  c1 05 c1 06
col  3: &#x5B; 8]  c2 01 00 00 00 07 08 09
row#0&#x5B;8018] flag: C
lock: 2
col  0: &#x5B; 2] 80 80
col  1: &#x5B; 6] 80 80 81 81 82 82
col  2: &#x5B; 1] 80
col  3: &#x5B; 3] 00 00 00
</pre></div>


<p>Neste exemplo, o dump mostra o cabeçalho do bloco, identificadores de objetos, o estado de transações e registros de mudanças. Isso pode ser útil em casos onde é necessário analisar a causa da corrupção ou o estado de uma transação em andamento.</p>



<ul class="wp-block-list">
<li><strong><code>Block header dump: 0x010032a8</code></strong>: O cabeçalho do bloco que está sendo &#8220;despejado&#8221;. O valor <code>0x010032a8</code> é o endereço hexadecimal do bloco.</li>



<li><strong><code>Object id on Block? Y</code></strong>: Indica que existe um ID de objeto associado ao bloco (neste caso, &#8220;Y&#8221; para &#8220;Yes&#8221;).</li>



<li><strong><code>seg/obj: 0x19b8</code></strong>: Este é o identificador de segmento ou objeto (ID de objeto 0x19b8).</li>



<li><strong><code>csc: 0x00.2f4c43</code></strong>: Este é o SCN (System Change Number) correspondente ao bloco.</li>



<li><strong><code>itl: 2</code></strong>: Indica o número de <em>interested transaction list</em> (ITL) slots no bloco. Isso significa que até 2 transações podem ser controladas dentro do bloco.</li>



<li><strong><code>Itl Xid Uba Flag Lck Scn/Fsc</code></strong>: Esses são os detalhes das transações ativas no bloco:</li>



<li><strong>Xid</strong>: Transaction ID (ID da transação).</li>



<li><strong>Uba</strong>: Undo Block Address.</li>



<li><strong>Flag</strong>: Flags indicando o status da transação (<code>C</code> indica commit).</li>



<li><strong>Lck</strong>: Lock.</li>



<li><strong>Scn/Fsc</strong>: System Change Number ou Free Space Checkpoint.</li>



<li><strong><code>data_block_dump,data header at 0x7f5f332e900</code></strong>: Início do dump dos dados no bloco. O endereço do cabeçalho de dados começa em <code>0x7f5f332e900</code>.</li>



<li><strong><code>tsiz: 0x1f78</code></strong>: O tamanho do bloco de dados.</li>



<li><strong><code>checksum: 0x39cb</code></strong>: O checksum do bloco, utilizado para garantir a integridade dos dados.</li>
</ul>



<h3 class="wp-block-heading">4. <strong>Recuperação usando Backup Incremental (Opcional)</strong></h3>



<p>Se você não tiver backup de bloco específico ou se o RMAN não conseguir recuperar os blocos por qualquer motivo, você pode usar um backup incremental para recuperar blocos corrompidos:</p>



<ol class="wp-block-list">
<li>Faça um backup incremental do banco de dados:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
   RMAN&gt; BACKUP INCREMENTAL LEVEL 1 DATABASE;
</pre></div>


<ol start="2" class="wp-block-list">
<li>Execute a recuperação baseada no backup incremental:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
   RMAN&gt; RECOVER BLOCK DATAFILE 4 BLOCK 12345;
</pre></div>


<p>Essa abordagem aplica blocos saudáveis a partir do backup incremental, corrigindo os blocos corrompidos no banco de dados de produção.</p>



<h3 class="wp-block-heading">5. <strong>Verificando a Correção do Bloco</strong></h3>



<p>Após a recuperação, o Oracle realiza automaticamente uma validação para garantir que o bloco foi restaurado corretamente. No entanto, você pode validar manualmente usando o comando:</p>



<p>Versão comum (sem ASM):</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
dbv file=/path/to/datafile.dbf blocksize=8192
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
DBVERIFY: Release 19.0.0.0.0 - Production on Mon Oct 21 14:42:33 2024

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

DBVERIFY - Verification starting : FILE = /path/to/datafile.dbf
DBVERIFY - Verification complete

Total Pages Examined         : 64000
Total Pages Processed (Data) : 32000
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 16000
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 16000
Total Pages Processed (Seg)  : 0
Total Pages Empty            : 0
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Highest block SCN            : 1123456789 (0.1123456789)

</pre></div>


<p>Versão do ASM:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
dbv USERID=SYS/***** file=+DATAC1/datafiles/users01.dbf logfile=/tmp/dbv_dbabrabo.log
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
DBVERIFY: Release 19.0.0.0.0 - Production on Mon Oct 21 15:35:12 2024

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

DBVERIFY - Verification starting : FILE = +DATAC1/datafiles/users01.dbf
DBVERIFY - Verification complete

Total Pages Examined         : 32000
Total Pages Processed (Data) : 16000
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 8000
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 8000
Total Pages Empty            : 0
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Highest block SCN            : 123456789 (0.123456789)

</pre></div>


<p>Isso garantirá que o bloco foi corrigido sem outros erros.</p>



<h3 class="wp-block-heading">6. <strong><strong>Recuperação de Blocos Corrompidos com <a href="https://docs.oracle.com/en/database/oracle/oracle-database/21/arpls/DBMS_REPAIR.html#GUID-B8EC4AB3-4D6A-46C9-857F-4ED53CD9C948" target="_blank" rel="noreferrer noopener">DBMS_REPAIR</a></strong></strong></h3>



<p><strong>Exemplo oriundos do mestre <a href="https://oracle-base.com/articles/misc/detect-and-correct-corruption" target="_blank" rel="noreferrer noopener">Tim Hall</a></strong></p>



<p>O pacote <strong>DBMS_REPAIR</strong> do Oracle permite identificar e tratar blocos corrompidos no banco de dados. Diferentemente de outros métodos, ele não apenas detecta, mas também permite &#8220;marcar&#8221; blocos danificados para serem ignorados por operações de DML.</p>



<h3 class="wp-block-heading">Criação das Tabelas Administrativas</h3>



<p>Para gerenciar os blocos corrompidos, duas tabelas administrativas devem ser criadas:: uma para armazenar informações dos blocos corrompidos e outra para guardar chaves órfãs de índices.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
BEGIN
  DBMS_REPAIR.admin_tables (
    table_name =&gt; 'TBL_CORRUPCAO',
    table_type =&gt; DBMS_REPAIR.repair_table,
    action     =&gt; DBMS_REPAIR.create_action,
    tablespace =&gt; 'USERS');

  DBMS_REPAIR.admin_tables (
    table_name =&gt; 'CHAVES_ORFAS',
    table_type =&gt; DBMS_REPAIR.orphan_table,
    action     =&gt; DBMS_REPAIR.create_action,
    tablespace =&gt; 'USERS');
END;
/
</pre></div>


<h3 class="wp-block-heading">Verificação de Corrupção na Tabela</h3>



<p>Após a criação das tabelas administrativas, a rotina <strong>CHECK_OBJECT</strong> pode ser usada para verificar a existência de blocos corrompidos em uma tabela específica.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
SET SERVEROUTPUT ON
DECLARE
  v_blocos_corrompidos INT;
BEGIN
  v_blocos_corrompidos := 0;
  DBMS_REPAIR.check_object (
    schema_name       =&gt; 'DBABRABO',
    object_name       =&gt; 'CLIENTES',
    repair_table_name =&gt; 'TBL_CORRUPCAO',
    corrupt_count     =&gt; v_blocos_corrompidos);
  DBMS_OUTPUT.put_line('Blocos corrompidos detectados: ' || TO_CHAR(v_blocos_corrompidos));
END;
/
</pre></div>


<h3 class="wp-block-heading">Marcação de Blocos Corrompidos</h3>



<p>Se houver blocos corrompidos, eles podem ser &#8220;marcados&#8221; para serem ignorados durante as operações de DML.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
SET SERVEROUTPUT ON
DECLARE
  v_blocos_corrigidos INT;
BEGIN
  v_blocos_corrigidos := 0;
  DBMS_REPAIR.fix_corrupt_blocks (
    schema_name       =&gt; 'DBABRABO',
    object_name       =&gt; 'CLIENTES',
    object_type       =&gt; DBMS_REPAIR.table_object,
    repair_table_name =&gt; 'TBL_CORRUPCAO',
    fix_count         =&gt; v_blocos_corrigidos);
  DBMS_OUTPUT.put_line('Blocos marcados como corrompidos: ' || TO_CHAR(v_blocos_corrigidos));
END;
/
</pre></div>


<h3 class="wp-block-heading">Identificação de Chaves Órfãs em Índices</h3>



<p>Após marcar os blocos corrompidos, os índices associados devem ser verificados para identificar chaves órfãs.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
SET SERVEROUTPUT ON
DECLARE
  v_chaves_orfas INT;
BEGIN
  v_chaves_orfas := 0;
  DBMS_REPAIR.dump_orphan_keys (
    schema_name       =&gt; 'DBABRABO',
    object_name       =&gt; 'IDX_CLIENTES',
    object_type       =&gt; DBMS_REPAIR.index_object,
    repair_table_name =&gt; 'TBL_CORRUPCAO',
    orphan_table_name =&gt; 'CHAVES_ORFAS',
    key_count         =&gt; v_chaves_orfas);
  DBMS_OUTPUT.put_line('Chaves órfãs detectadas: ' || TO_CHAR(v_chaves_orfas));
END;
/
</pre></div>


<p>Caso existam chaves órfãs, o índice deve ser reconstruído para corrigir o problema.</p>



<h3 class="wp-block-heading">Reconstrução das Freelists</h3>



<p>Os blocos marcados como corrompidos são removidos automaticamente das freelists. Contudo, isso pode causar problemas de acesso aos blocos seguintes, sendo necessário reconstruir as freelists.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
BEGIN
  DBMS_REPAIR.rebuild_freelists (
    schema_name =&gt; 'DBABRABO',
    object_name =&gt; 'CLIENTES',
    object_type =&gt; DBMS_REPAIR.table_object);
END;
/
</pre></div>


<h3 class="wp-block-heading">Ignorar Blocos Corrompidos</h3>



<p>Para garantir que os blocos corrompidos sejam ignorados durante operações de DML, utilize a rotina <strong>SKIP_CORRUPT_BLOCKS</strong>.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
BEGIN
  DBMS_REPAIR.skip_corrupt_blocks (
    schema_name =&gt; 'DBABRABO',
    object_name =&gt; 'CLIENTES',
    object_type =&gt; DBMS_REPAIR.table_object,
    flags       =&gt; DBMS_REPAIR.skip_flag);
END;
/
</pre></div>


<h3 class="wp-block-heading">BONUS- <strong>BBED</strong> (Para você brincar no seu LAB[APENAS])</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
                             ______
                          .-&quot;      &quot;-.
                         /            \
             _          |              |          _
            ( \         |,  .-.  .-.  ,|         / )
             &gt; &quot;=._     | )(__/  \__)( |     _.=&quot; &lt;
            (_/&quot;=._&quot;=._ |/     /\     \| _.=&quot;_.=&quot;\_)
                   &quot;=._ (_     ^^     _)&quot;_.=&quot;
                       &quot;=\__|IIIIII|__/=&quot;
                      _.=&quot;| \IIIIII/ |&quot;=._
            _     _.=&quot;_.=&quot;\          /&quot;=._&quot;=._     _
           ( \_.=&quot;_.=&quot;     `--------`     &quot;=._&quot;=._/ )
            &gt; _.=&quot;                            &quot;=._ &lt;
           (_/                                    \_)
</pre></div>


<p>O utilitário <strong>BBED</strong> (Block Browser and Editor) é uma ferramenta interna do Oracle que permite visualizar e modificar blocos de dados em nível físico. No entanto, a Oracle não suporta oficialmente o BBED para uso em produção, pois ele pode ser muito perigoso se utilizado incorretamente, uma vez que permite a modificação de blocos no nível mais baixo, o que pode corromper dados se usado de maneira imprudente.</p>



<p>Dito isso, aqui está uma visão geral e exemplos de como você pode usar o <strong>BBED</strong> para <strong>recuperação de blocos corrompidos</strong> em Oracle. O BBED não é distribuído por padrão, mas pode ser construído a partir do Oracle Binary. Vou incluir os passos para configurá-lo e alguns exemplos de uso.</p>



<h3 class="wp-block-heading">1. Preparando o BBED:</h3>



<ol class="wp-block-list">
<li><strong>Verifique se o BBED está disponível no seu ambiente Oracle</strong>. Muitas vezes ele é desabilitado, mas você pode ativá-lo se encontrar o binário.</li>
</ol>



<ul class="wp-block-list">
<li>O executável BBED geralmente pode ser encontrado em <code>$ORACLE_HOME/rdbms/admin/bbed.par</code> e <code>$ORACLE_HOME/rdbms/admin/bbedus.msb</code>.</li>
</ul>



<ol class="wp-block-list">
<li><strong>Copiar e compilar o BBED:</strong></li>
</ol>



<ul class="wp-block-list">
<li>Copie o arquivo <code>bbed</code> para algum diretório de trabalho.</li>



<li>Garanta que os arquivos <code>bbed.par</code> e <code>bbedus.msb</code> estejam no mesmo diretório do binário <code>bbed</code>.</li>



<li>Conceda permissões de execução ao binário: <code>chmod +x bbed</code></li>
</ul>



<ol class="wp-block-list">
<li><strong>Crie um arquivo de parâmetros (<code>bbed.par</code>):</strong><br>O arquivo de parâmetros é necessário para fornecer informações sobre o tamanho do bloco, arquivo de dados, e outros detalhes. Exemplo do conteúdo do <code>bbed.par</code>:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   blocksize=8192
   listfile=/tmp/datafiles.lst
   mode=edit
</pre></div>


<ol start="4" class="wp-block-list">
<li><strong>Arquivo de lista (<code>datafiles.lst</code>)</strong>:<br>Crie um arquivo de lista de datafiles que deseja abrir com o BBED.</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   /path/to/datafile1.dbf
   /path/to/datafile2.dbf
</pre></div>


<p>Agora o <strong>BBED</strong> está configurado e pronto para ser usado.</p>



<h3 class="wp-block-heading">2. Comandos básicos de BBED:</h3>



<p>Vamos a alguns exemplos de comandos básicos para recuperação de blocos.</p>



<h4 class="wp-block-heading">2.1. Carregar o BBED e acessar um bloco:</h4>



<ol class="wp-block-list">
<li><strong>Iniciar o BBED:</strong></li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   $ bbed parfile=/path/to/bbed.par
</pre></div>


<p>Isso carrega o BBED e o arquivo de parâmetros especificado.</p>



<ol start="2" class="wp-block-list">
<li><strong>Abrir um bloco específico:</strong> Para navegar e visualizar um bloco específico no datafile, você precisa acessar o datafile e o número do bloco que deseja inspecionar.</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   BBED&gt; set dba 4,12345
</pre></div>


<p>Onde <code>4</code> é o número do datafile, e <code>12345</code> é o número do bloco.</p>



<ol start="3" class="wp-block-list">
<li><strong>Listar os dados do bloco:</strong> Após definir o DBA, você pode visualizar o conteúdo do bloco:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   BBED&gt; map
</pre></div>


<p>Esse comando mostra um mapeamento geral do bloco, como o cabeçalho do bloco, as transações em andamento, e outros metadados.</p>



<ol start="4" class="wp-block-list">
<li><strong>Listar o conteúdo do bloco:</strong> Para exibir o conteúdo do bloco em formato hexadecimal, você pode usar o comando <code>dump</code>.</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   BBED&gt; dump
</pre></div>


<p>Esse comando exibe o conteúdo do bloco como uma lista de dados hexadecimais e ASCII. Você pode usar isso para analisar os dados corrompidos ou entender o estado atual do bloco.</p>



<h4 class="wp-block-heading">2.2. Exemplo de recuperação de bloco corrompido:</h4>



<p>Vamos supor que você tenha identificado que o bloco está corrompido e precise alterá-lo para recuperá-lo.</p>



<ol class="wp-block-list">
<li><strong>Identificar a corrupção:</strong><br>Ao visualizar o bloco, você pode verificar se há campos corrompidos ou inválidos. Suponhamos que o cabeçalho do bloco esteja corrompido.</li>



<li><strong>Editar o cabeçalho do bloco:</strong> O campo do cabeçalho do bloco pode ser editado diretamente. Suponha que você precise ajustar o campo <code>kcbh.seq</code> (sequência do cabeçalho de bloco). Você pode ajustar isso manualmente. Primeiro, localize o deslocamento (<code>offset</code>) do campo <code>kcbh.seq</code>.</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   BBED&gt; p kcbh.seq
</pre></div>


<p>Isso imprime o valor atual do campo <code>kcbh.seq</code>. Agora, se ele estiver incorreto, você pode corrigir o valor:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   BBED&gt; modify /x 0004 at kcbh.seq
</pre></div>


<p>Isso altera o valor do campo para <code>0004</code>.</p>



<ol start="3" class="wp-block-list">
<li><strong>Salvar as alterações:</strong> Uma vez que você fez a modificação, você pode gravar o bloco de volta no datafile.</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   BBED&gt; sum
   BBED&gt; write
</pre></div>


<p>O comando <code>sum</code> calcula o checksum do bloco modificado, e <code>write</code> grava o bloco de volta no arquivo de dados.</p>



<h3 class="wp-block-heading">3. Se liga aqui Zé Ruela:</h3>



<ul class="wp-block-list">
<li><strong>BBED é extremamente perigoso</strong>: Uma única modificação incorreta pode corromper permanentemente os dados do seu banco de dados. Sempre faça um backup completo antes de usar esta ferramenta.</li>



<li><strong>A ferramenta não é documentada oficialmente</strong>: A Oracle não oferece suporte ao BBED, e ele deve ser usado apenas em casos extremos ou em ambientes de teste.</li>
</ul>



<p>Embora o <strong>BBED</strong> possa ser uma ferramenta útil para análise em profundidade e modificação de blocos físicos de dados, ele deve ser usado com extremo cuidado e preferencialmente em ambientes de teste. Em produção, a Oracle oferece alternativas mais seguras e suportadas, como o RMAN e o DBMS_REPAIR, para recuperação de blocos corrompidos.</p>



<h2 class="wp-block-heading">Considerações Finais</h2>



<p>A recuperação de blocos de dados do Oracle é uma funcionalidade extremamente útil que evita downtime prolongado e a necessidade de restauração completa. Além disso, a capacidade de fazer dumps de blocos pode ser usada para análise forense, ajudando na resolução de problemas críticos de integridade de dados.</p>



<h3 class="wp-block-heading">Dicas Importantes:</h3>



<ul class="wp-block-list">
<li>Sempre mantenha backups atualizados.</li>



<li>Verifique periodicamente se há corrupção de blocos, utilizando ferramentas como <strong>DBVERIFY e RMAN</strong>.</li>



<li>Sempre utilize procedimentos e padrões com base na documentação, consulte o suporte.</li>



<li>Teste e pratique cenários extremos para saber como contornar crises. </li>



<li>Automatize a verificação e recuperação de blocos corrompidos com RMAN para minimizar o tempo de inatividade.</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Oracle DBMS_SCHEDULER vs DBMS_JOB: pacote único para gerenciar, pausar e monitorar jobs</title>
		<link>https://furushima.com.br/blog/oracle-dbms_scheduler-vs-dbms_job-pacote-unico-para-gerenciar-pausar-e-monitorar-jobs/</link>
		
		<dc:creator><![CDATA[Carlos Furushima]]></dc:creator>
		<pubDate>Wed, 10 Sep 2025 22:11:24 +0000</pubDate>
				<category><![CDATA[Banco De Dados]]></category>
		<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">https://furushima.com.br/?p=2855</guid>

					<description><![CDATA[Introdução Em muitos ambientes Oracle, convivem dois mecanismos de agendamento: o DBMS_SCHEDULER (moderno) e o DBMS_JOB (legado). Cada um possui comandos, dicionários e semânticas próprios — &#8220;enabled" de um lado, &#8220;broken&#8221; do outro; DBA_SCHEDULER_* aqui, DBA_JOBS* ali; STOP_JOB vs. &#8220;matar sessão&#8221; etc.O resultado, no dia a dia, é fricção operacional: consultas diferentes para a mesma [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="has-x-large-font-size"><strong>Introdução</strong></p>



<p></p>



<p class="has-text-align-left">Em muitos ambientes Oracle, convivem dois mecanismos de agendamento: o <strong>DBMS_SCHEDULER</strong> (moderno) e o <strong>DBMS_JOB</strong> (legado). Cada um possui comandos, dicionários e semânticas próprios — &#8220;<code>enabled"</code> de um lado, &#8220;<code>broken</code>&#8221; do outro; <code>DBA_SCHEDULER_*</code> aqui, <code>DBA_JOBS*</code> ali; <code>STOP_JOB</code> vs. &#8220;matar sessão&#8221; etc.<br>O resultado, no dia a dia, é <strong>fricção operacional</strong>: consultas diferentes para a mesma pergunta, scripts paralelos para operações equivalentes, e uma curva de aprendizado desnecessária para tarefas simples como <strong>ver quem está rodando</strong>, <strong>habilitar/desabilitar</strong> e <strong>pausar um lote de jobs</strong> para uma janela de manutenção.</p>



<p class="has-text-align-left">Esta solução nasce exatamente desse cenário. O objetivo é oferecer um <strong>ponto único e transparente</strong> para <strong>inventariar, monitorar e operar</strong> ambos os mecanismos <strong>sem complexidade</strong>.<br>Você passa a consultar <strong>uma visão consolidada</strong> (inventário e execução), e a executar <strong>um pacote único</strong> para ações comuns — seja um job Scheduler com nome, seja um DBMS_JOB numérico.</p>



<p></p>



<p><br></p>



<h1 class="wp-block-heading">2) O que são DBMS_SCHEDULER e DBMS_JOB</h1>



<h2 class="wp-block-heading">DBMS_SCHEDULER (o mecanismo moderno)</h2>



<p>Introduzido para substituir o DBMS_JOB, o <strong>DBMS_SCHEDULER</strong> oferece uma arquitetura rica e modular:</p>



<ul class="wp-block-list">
<li><strong>Jobs, Programs e Schedules</strong> separados, possibilitando reuso e governança.</li>



<li><strong>Chains</strong> (fluxos com dependências), <strong>Windows</strong> e <strong>Job Classes</strong>.</li>



<li>Calendário expressivo por <code>repeat_interval</code> (calendar expressions).</li>



<li><strong>Parada controlada</strong> (<code>STOP_JOB</code>), logging detalhado, priorização e integração com Resource Manager.</li>



<li>Dicionário amplo (<code>DBA_SCHEDULER_JOBS</code>, <code>DBA_SCHEDULER_RUNNING_JOBS</code>, etc.).</li>
</ul>



<p>Em suma: mais recursos, rastreabilidade e controle fino. É o padrão recomendado para novas rotinas.</p>



<p><br></p>



<h2 class="wp-block-heading">DBMS_JOB (o mecanismo legado)</h2>



<p>O <strong>DBMS_JOB</strong> é mais simples e direto:</p>



<ul class="wp-block-list">
<li>Cada job tem um <strong>número</strong> (ex.: 128), um comando <strong>WHAT</strong> (PL/SQL a executar), um <strong>NEXT_DATE</strong> e um <strong>INTERVAL</strong> (string).</li>



<li>A disponibilidade é representada por <code>BROKEN = 'Y'|'N'</code> em vez de <code>ENABLED</code>.</li>



<li><strong>Não</strong> possui um comando nativo para parar execução em curso; na prática, usa-se o encerramento da <strong>sessão</strong> que executa o job.</li>



<li>Dicionário compacto (<code>DBA_JOBS</code>, <code>DBA_JOBS_RUNNING</code>).</li>
</ul>



<p>Embora menos flexível, é comum que ambientes antigos ainda mantenham rotinas estáveis sob DBMS_JOB.</p>



<p><br></p>



<h1 class="wp-block-heading">Vantagens de utilizar esta solução</h1>



<p><strong>1. Interface única e coerente</strong></p>



<ul class="wp-block-list">
<li><strong>Views consolidadas</strong> para inventário (<code>JOB_ADMIN_ALL_JOBS[_V]</code>) e execução (<code>JOB_ADMIN_RUNNING[_V]</code>) que mesclam Scheduler e DBMS_JOB.</li>



<li><strong>Colunas homogêneas</strong>: <code>enabled</code> sempre como TRUE/FALSE, datas e intervalos <strong>formatados</strong> nas versões “_V”.</li>
</ul>



<p><strong>2. Produtividade imediata</strong></p>



<ul class="wp-block-list">
<li>Uma consulta responde “o que tenho?”, “quando roda?”, “quem está rodando e há quanto tempo?”.</li>



<li>O operador <strong>não precisa lembrar</strong> se o job é Scheduler ou DBMS_JOB para consultar status ou executar ações.</li>
</ul>



<p><strong>3. Operação simples e segura</strong></p>



<ul class="wp-block-list">
<li><strong>Habilitar/Desabilitar</strong> por um único procedimento (<code>enable_job</code>/<code>disable_job</code>), passando <strong>nome</strong> (Scheduler) ou <strong>número</strong> (DBMS_JOB).</li>



<li><strong>Parada elegante</strong>: para Scheduler usa <code>STOP_JOB(force =&gt; TRUE)</code>; para DBMS_JOB, encerra a <strong>sessão</strong> de execução antes de mudar o estado (RAC-aware).</li>



<li><strong>Lote inteligente</strong> (<code>set_jobs_by_pattern</code>): aplique uma ação a um conjunto por <code>LIKE</code>, escolhendo tipo (Scheduler/DBMS_JOB/ANY) e se deve parar os ativos.</li>
</ul>



<p><strong>4. Observabilidade e padronização</strong></p>



<ul class="wp-block-list">
<li>Saídas de <code>list_jobs</code> e <code>list_running_jobs</code> são <strong>limpas e didáticas</strong>, integrando as duas tecnologias com o mesmo layout.</li>



<li>Facilita auditorias, health-checks e relatórios operacionais com <strong>menos scripts</strong>.</li>
</ul>



<p><strong>5. Governança simplificada</strong></p>



<ul class="wp-block-list">
<li><strong>Role única</strong> (<code>JOBDBMSSCHEDULERALL</code>) e <strong>sinônimos públicos</strong>: padroniza o consumo entre times e ferramentas.</li>



<li><code>AUTHID DEFINER</code>: quem usa não precisa de privilégio de DBA — basta receber a role.</li>
</ul>



<p><strong>6. Idempotência e baixa fricção de implantação</strong></p>



<ul class="wp-block-list">
<li><code>CREATE OR REPLACE</code> em todos os objetos e checagens defensivas: <strong>reexecutar reinstala</strong>.</li>



<li><strong>Compatível com RAC</strong> e com execução em <strong>PDB</strong> (quando aplicável).</li>
</ul>



<p><strong>7. Menor risco operacional</strong></p>



<ul class="wp-block-list">
<li>Mensagens claras e validações garantem que “job não encontrado” ou “nome ambíguo entre owners” sejam tratados com <strong>erros explicativos</strong>.</li>



<li>Em manutenção, <code>p_stop_running =&gt; TRUE</code> reduz inconsistências ao pausar um lote inteiro de forma controlada.</li>
</ul>



<p><strong>8. Porta de entrada para modernização</strong></p>



<ul class="wp-block-list">
<li>Ao dar visibilidade e controle unificado, a solução <strong>facilita migrações graduais</strong> de DBMS_JOB para DBMS_SCHEDULER, sem interrupção do dia a dia.</li>
</ul>



<p><br></p>



<p><em>Faça o download do instalador pkg_job_admin no link abaixo e habilite a gestão unificada de jobs Oracle.</em><br><br><br></p>



<div class="wp-block-file aligncenter"><a id="wp-block-file--media-5691fc75-8483-4dd2-a032-4fcb5a7fb647" href="https://furushima.com.br/wp-content/uploads/2025/09/job_admin_setup_completo.zip">Download &#8211; script pkg_job_admin &#8211; ORACLE</a><a href="https://furushima.com.br/wp-content/uploads/2025/09/job_admin_setup_completo.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-5691fc75-8483-4dd2-a032-4fcb5a7fb647">Baixar</a></div>



<p><br><br><br></p>



<p class="has-large-font-size"><strong>Administração de jobs Oracle em um só lugar: Instalação e uso do pkg_job_admin</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="[ORCL.oracle@furushimait_labs ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Sep 10 14:52:51 2025
Version 19.20.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
Version 19.20.0.0.0

SQL&gt; @job_admin_setup_completo.sql

═════════════════════════════════════════════════════════════════════════════════════════════
Iniciando job_admin_setup_completo.sql
═════════════════════════════════════════════════════════════════════════════════════════════
Owner atual: SYS

PL/SQL procedure successfully completed.


── 1) Criando/Atualizando Views Consolidadas …

View created.


View created.


View created.


View created.

✓ Views criadas/atualizadas com sucesso.

── 2) Criando/Atualizando Pacote (SPEC) …

Package created.

No errors.

── 3) Criando/Atualizando Pacote (BODY) …

Package body created.

No errors.
✓ Pacote criado/atualizado com sucesso.

── 4) Segurança: ROLE, Grants e Sinônimos Públicos …
Role JOBDBMSSCHEDULERALL já existente.

PL/SQL procedure successfully completed.


Grant succeeded.


Grant succeeded.


Grant succeeded.


Grant succeeded.


Grant succeeded.

Sinônimos públicos criados/atualizados.

PL/SQL procedure successfully completed.

✓ Segurança configurada (ROLE + grants + sinônimos públicos).

── 5) Auto-Validação (não intrusiva) …
Pacote PKG_JOB_ADMIN sem erros de compilação.

PL/SQL procedure successfully completed.

Views acessíveis: JOB_ADMIN_ALL_JOBS e JOB_ADMIN_RUNNING OK.

PL/SQL procedure successfully completed.


── 6) Exemplos de Uso para referência  …

-- Inventário:
BEGIN
pkg_job_admin.list_jobs;                          -- todos os jobs
pkg_job_admin.list_jobs('DEMOAPP');               -- por owner
pkg_job_admin.list_jobs(p_like =&gt; 'JOB_%');       -- por padrão (LIKE)
END
/
-- Em execução agora:
BEGIN
pkg_job_admin.list_running_jobs;                       -- tudo
pkg_job_admin.list_running_jobs('DEMOAPP');            -- por owner
pkg_job_admin.list_running_jobs(p_like =&gt; 'SYNC_%');   -- por padrão (LIKE)
END
/
-- Operações pontuais:
-- SCHEDULER (por nome; owner opcional se único no banco)
-- BEGIN
--   pkg_job_admin.disable_job('DEMOAPP.JOB_ATUALIZA_INDICES', p_stop_running =&gt; TRUE)
--   pkg_job_admin.enable_job ('DEMOAPP.JOB_ATUALIZA_INDICES')
-- END
-- /
-- DBMS_JOB (por número; owner apenas para validar pertinência quando desejar)
-- BEGIN
--   pkg_job_admin.disable_job('128', p_owner =&gt; 'SYS', p_stop_running =&gt; TRUE)
--   pkg_job_admin.enable_job ('128', p_owner =&gt; 'SYS')
-- END
-- /
-- Lote por padrão (por tipo):
-- BEGIN
--   pkg_job_admin.set_jobs_by_pattern(
--     p_name_like    =&gt; 'JOB_SYNC_%',
--     p_enable       =&gt; FALSE,
--     p_owner        =&gt; 'DEMOAPP',
--     p_type         =&gt; pkg_job_admin.c_type_scheduler, -- SCHEDULER | DBMS_JOB | ANY
--     p_stop_running =&gt; TRUE
--   )
-- END
-- /
-- Visões consolidadas:
-- SELECT * FROM job_admin_all_jobs_v ORDER BY owner, job_type, job_name
-- SELECT * FROM job_admin_running_v  ORDER BY running_instance, job_type, job_name

═════════════════════════════════════════════════════════════════════════════════════════════
Conclusão: job_admin_setup_completo.sql executado.
Para conceder a ROLE a um usuário final, utilize:
GRANT JOBDBMSSCHEDULERALL TO nome_do_usuario
═════════════════════════════════════════════════════════════════════════════════════════════
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">[ORCL.oracle@furushimait_labs ~]$ sqlplus / </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> sysdba</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">SQL</span><span style="color: #D4D4D4">*Plus: Release </span><span style="color: #B5CEA8">19</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> - Production </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> Wed Sep </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">14</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">52</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">51</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">2025</span></span>
<span class="line"><span style="color: #569CD6">Version</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">19</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">20</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">Copyright (c) </span><span style="color: #B5CEA8">1982</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2022</span><span style="color: #D4D4D4">, Oracle.  All rights reserved.</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">Connected </span><span style="color: #569CD6">to</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">Oracle </span><span style="color: #569CD6">Database</span><span style="color: #D4D4D4"> 19c EE Extreme Perf Release </span><span style="color: #B5CEA8">19</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> - Production</span></span>
<span class="line"><span style="color: #569CD6">Version</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">19</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">20</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">SQL</span><span style="color: #D4D4D4">&gt; @job_admin_setup_completo.</span><span style="color: #569CD6">sql</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">═════════════════════════════════════════════════════════════════════════════════════════════</span></span>
<span class="line"><span style="color: #D4D4D4">Iniciando job_admin_setup_completo.sql</span></span>
<span class="line"><span style="color: #D4D4D4">═════════════════════════════════════════════════════════════════════════════════════════════</span></span>
<span class="line"><span style="color: #569CD6">Owner</span><span style="color: #D4D4D4"> atual: SYS</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PL/</span><span style="color: #569CD6">SQL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">procedure</span><span style="color: #D4D4D4"> successfully completed.</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">── </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">) Criando/Atualizando Views Consolidadas …</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">View created.</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">View created.</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">View created.</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">View created.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">✓ Views criadas/atualizadas com sucesso.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">── </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">) Criando/Atualizando Pacote (SPEC) …</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">Package created.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">No</span><span style="color: #D4D4D4"> errors.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">── </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">) Criando/Atualizando Pacote (BODY) …</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">Package body created.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">No</span><span style="color: #D4D4D4"> errors.</span></span>
<span class="line"><span style="color: #D4D4D4">✓ Pacote criado/atualizado com sucesso.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">── </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">) Segurança: </span><span style="color: #569CD6">ROLE</span><span style="color: #D4D4D4">, Grants e Sinônimos Públicos …</span></span>
<span class="line"><span style="color: #569CD6">Role</span><span style="color: #D4D4D4"> JOBDBMSSCHEDULERALL já existente.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PL/</span><span style="color: #569CD6">SQL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">procedure</span><span style="color: #D4D4D4"> successfully completed.</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">Grant</span><span style="color: #D4D4D4"> succeeded.</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">Grant</span><span style="color: #D4D4D4"> succeeded.</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">Grant</span><span style="color: #D4D4D4"> succeeded.</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">Grant</span><span style="color: #D4D4D4"> succeeded.</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">Grant</span><span style="color: #D4D4D4"> succeeded.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">Sinônimos públicos criados/atualizados.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PL/</span><span style="color: #569CD6">SQL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">procedure</span><span style="color: #D4D4D4"> successfully completed.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">✓ Segurança configurada (</span><span style="color: #569CD6">ROLE</span><span style="color: #D4D4D4"> + grants + sinônimos públicos).</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">── </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">Auto</span><span style="color: #D4D4D4">-Validação (não intrusiva) …</span></span>
<span class="line"><span style="color: #D4D4D4">Pacote PKG_JOB_ADMIN sem erros de compilação.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PL/</span><span style="color: #569CD6">SQL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">procedure</span><span style="color: #D4D4D4"> successfully completed.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">Views acessíveis: JOB_ADMIN_ALL_JOBS e JOB_ADMIN_RUNNING OK.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PL/</span><span style="color: #569CD6">SQL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">procedure</span><span style="color: #D4D4D4"> successfully completed.</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">── </span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4">) Exemplos de Uso para referência  …</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- Inventário:</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">pkg_job_admin.list_jobs;                          </span><span style="color: #6A9955">-- todos os jobs</span></span>
<span class="line"><span style="color: #D4D4D4">pkg_job_admin.list_jobs(</span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span><span style="color: #D4D4D4">);               </span><span style="color: #6A9955">-- por owner</span></span>
<span class="line"><span style="color: #D4D4D4">pkg_job_admin.list_jobs(p_like =&gt; </span><span style="color: #CE9178">&#39;JOB_%&#39;</span><span style="color: #D4D4D4">);       </span><span style="color: #6A9955">-- por padrão (LIKE)</span></span>
<span class="line"><span style="color: #569CD6">END</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"><span style="color: #6A9955">-- Em execução agora:</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">pkg_job_admin.list_running_jobs;                       </span><span style="color: #6A9955">-- tudo</span></span>
<span class="line"><span style="color: #D4D4D4">pkg_job_admin.list_running_jobs(</span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span><span style="color: #D4D4D4">);            </span><span style="color: #6A9955">-- por owner</span></span>
<span class="line"><span style="color: #D4D4D4">pkg_job_admin.list_running_jobs(p_like =&gt; </span><span style="color: #CE9178">&#39;SYNC_%&#39;</span><span style="color: #D4D4D4">);   </span><span style="color: #6A9955">-- por padrão (LIKE)</span></span>
<span class="line"><span style="color: #569CD6">END</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"><span style="color: #6A9955">-- Operações pontuais:</span></span>
<span class="line"><span style="color: #6A9955">-- SCHEDULER (por nome; owner opcional se único no banco)</span></span>
<span class="line"><span style="color: #6A9955">-- BEGIN</span></span>
<span class="line"><span style="color: #6A9955">--   pkg_job_admin.disable_job(&#39;DEMOAPP.JOB_ATUALIZA_INDICES&#39;, p_stop_running =&gt; TRUE)</span></span>
<span class="line"><span style="color: #6A9955">--   pkg_job_admin.enable_job (&#39;DEMOAPP.JOB_ATUALIZA_INDICES&#39;)</span></span>
<span class="line"><span style="color: #6A9955">-- END</span></span>
<span class="line"><span style="color: #6A9955">-- /</span></span>
<span class="line"><span style="color: #6A9955">-- DBMS_JOB (por número; owner apenas para validar pertinência quando desejar)</span></span>
<span class="line"><span style="color: #6A9955">-- BEGIN</span></span>
<span class="line"><span style="color: #6A9955">--   pkg_job_admin.disable_job(&#39;128&#39;, p_owner =&gt; &#39;SYS&#39;, p_stop_running =&gt; TRUE)</span></span>
<span class="line"><span style="color: #6A9955">--   pkg_job_admin.enable_job (&#39;128&#39;, p_owner =&gt; &#39;SYS&#39;)</span></span>
<span class="line"><span style="color: #6A9955">-- END</span></span>
<span class="line"><span style="color: #6A9955">-- /</span></span>
<span class="line"><span style="color: #6A9955">-- Lote por padrão (por tipo):</span></span>
<span class="line"><span style="color: #6A9955">-- BEGIN</span></span>
<span class="line"><span style="color: #6A9955">--   pkg_job_admin.set_jobs_by_pattern(</span></span>
<span class="line"><span style="color: #6A9955">--     p_name_like    =&gt; &#39;JOB_SYNC_%&#39;,</span></span>
<span class="line"><span style="color: #6A9955">--     p_enable       =&gt; FALSE,</span></span>
<span class="line"><span style="color: #6A9955">--     p_owner        =&gt; &#39;DEMOAPP&#39;,</span></span>
<span class="line"><span style="color: #6A9955">--     p_type         =&gt; pkg_job_admin.c_type_scheduler, -- SCHEDULER | DBMS_JOB | ANY</span></span>
<span class="line"><span style="color: #6A9955">--     p_stop_running =&gt; TRUE</span></span>
<span class="line"><span style="color: #6A9955">--   )</span></span>
<span class="line"><span style="color: #6A9955">-- END</span></span>
<span class="line"><span style="color: #6A9955">-- /</span></span>
<span class="line"><span style="color: #6A9955">-- Visões consolidadas:</span></span>
<span class="line"><span style="color: #6A9955">-- SELECT * FROM job_admin_all_jobs_v ORDER BY owner, job_type, job_name</span></span>
<span class="line"><span style="color: #6A9955">-- SELECT * FROM job_admin_running_v  ORDER BY running_instance, job_type, job_name</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">═════════════════════════════════════════════════════════════════════════════════════════════</span></span>
<span class="line"><span style="color: #D4D4D4">Conclusão: job_admin_setup_completo.sql executado.</span></span>
<span class="line"><span style="color: #D4D4D4">Para conceder a </span><span style="color: #569CD6">ROLE</span><span style="color: #D4D4D4"> a um usuário final, utilize:</span></span>
<span class="line"><span style="color: #569CD6">GRANT</span><span style="color: #D4D4D4"> JOBDBMSSCHEDULERALL </span><span style="color: #569CD6">TO</span><span style="color: #D4D4D4"> nome_do_usuario</span></span>
<span class="line"><span style="color: #D4D4D4">═════════════════════════════════════════════════════════════════════════════════════════════</span></span>
<span class="line"></span></code></pre></div>



<p><br><br><br></p>



<h2 class="wp-block-heading">O que o script cria</h2>



<h3 class="wp-block-heading"></h3>



<h3 class="wp-block-heading">Objetos de dados (Views)</h3>



<ul class="wp-block-list">
<li><code>JOB_ADMIN_ALL_JOBS</code> — Inventário <strong>unificado</strong> (SCHEDULER + DBMS_JOB).</li>



<li><code>JOB_ADMIN_RUNNING</code> — Execução <strong>unificada</strong> no momento (SCHEDULER + DBMS_JOB).</li>



<li><code>JOB_ADMIN_ALL_JOBS_V</code> — Versão &#8220;amigável&#8221; do inventário (datas e intervalos formatados).</li>



<li><code>JOB_ADMIN_RUNNING_V</code> — Versão &#8220;amigável&#8221; da execução (intervalos formatados).</li>
</ul>



<h3 class="wp-block-heading">API (Package)</h3>



<ul class="wp-block-list">
<li><code>PKG_JOB_ADMIN</code> — Procedimentos para listar, habilitar/desabilitar e controlar lotes.
<ul class="wp-block-list">
<li><code>list_jobs(p_owner, p_like)</code></li>



<li><code>list_running_jobs(p_owner, p_like)</code></li>



<li><code>set_job_enabled(p_job_identifier, p_enable, p_owner, p_stop_running)</code></li>



<li><code>enable_job(...)</code> / <code>disable_job(...)</code></li>



<li><code>set_jobs_by_pattern(p_name_like, p_enable, p_owner, p_type, p_stop_running)</code></li>



<li>Constantes: <code>c_type_scheduler</code>, <code>c_type_dbms_job</code>, <code>c_type_any</code></li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"></h3>



<p><br><br><br></p>



<p class="has-medium-font-size"><strong>Inventário consolidado, pronto para relatório</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="SELECT 
  owner, 
  job_type, 
  job_name, 
  enabled, 
  state, 
  next_run_date 
FROM 
  job_admin_all_jobs_v 
ORDER BY 
  owner, 
  job_type, 
  job_name;
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">  job_type, </span></span>
<span class="line"><span style="color: #D4D4D4">  job_name, </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">state</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">  next_run_date </span></span>
<span class="line"><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">  job_admin_all_jobs_v </span></span>
<span class="line"><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">  job_type, </span></span>
<span class="line"><span style="color: #D4D4D4">  job_name;</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<p></p>



<h2 class="wp-block-heading"></h2>



<p></p>



<p class="has-medium-font-size"><strong>Execução no momento (quem está rodando agora)</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="SELECT 
  owner, 
  job_type, 
  job_name, 
  running_instance, 
  elapsed_time 
FROM 
  job_admin_running_v 
ORDER BY 
  running_instance, 
  job_type, 
  job_name;
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">  job_type, </span></span>
<span class="line"><span style="color: #D4D4D4">  job_name, </span></span>
<span class="line"><span style="color: #D4D4D4">  running_instance, </span></span>
<span class="line"><span style="color: #D4D4D4">  elapsed_time </span></span>
<span class="line"><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">  job_admin_running_v </span></span>
<span class="line"><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">  running_instance, </span></span>
<span class="line"><span style="color: #D4D4D4">  job_type, </span></span>
<span class="line"><span style="color: #D4D4D4">  job_name;</span></span>
<span class="line"></span></code></pre></div>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<h2 class="wp-block-heading"></h2>



<h2 class="wp-block-heading"></h2>



<p></p>
</blockquote>



<p></p>



<h2 class="wp-block-heading"></h2>



<p><br><br><br><br></p>



<p class="has-medium-font-size"><strong>Habilitar/Desabilitar individualmente</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="-- DBMS_SCHEDULER por nome (com owner)
BEGIN
  pkg_job_admin.disable_job('DEMOAPP.JOB_XPTO_ETL_DIARIO', p_stop_running =&gt; TRUE);
  pkg_job_admin.enable_job ('DEMOAPP.JOB_XPTO_ETL_DIARIO');
END;
/


-- DBMS_JOB por número (com validação de owner opcional)
BEGIN
  pkg_job_admin.disable_job('128', p_owner =&gt; 'SYS', p_stop_running =&gt; TRUE);
  pkg_job_admin.enable_job ('128', p_owner =&gt; 'SYS');
END;
/" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">-- DBMS_SCHEDULER por nome (com owner)</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.disable_job(</span><span style="color: #CE9178">&#39;DEMOAPP.JOB_XPTO_ETL_DIARIO&#39;</span><span style="color: #D4D4D4">, p_stop_running =&gt; TRUE);</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.enable_job (</span><span style="color: #CE9178">&#39;DEMOAPP.JOB_XPTO_ETL_DIARIO&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- DBMS_JOB por número (com validação de owner opcional)</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.disable_job(</span><span style="color: #CE9178">&#39;128&#39;</span><span style="color: #D4D4D4">, p_owner =&gt; </span><span style="color: #CE9178">&#39;SYS&#39;</span><span style="color: #D4D4D4">, p_stop_running =&gt; TRUE);</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.enable_job (</span><span style="color: #CE9178">&#39;128&#39;</span><span style="color: #D4D4D4">, p_owner =&gt; </span><span style="color: #CE9178">&#39;SYS&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p><br></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><br></p>
</blockquote>



<p></p>



<p></p>



<p><br><br></p>



<h2 class="wp-block-heading"></h2>



<p></p>



<p class="has-medium-font-size"><strong>Habilitar/Desabilitar JOBS em lote </strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="BEGIN
  pkg_job_admin.set_jobs_by_pattern(
    p_name_like    =&gt; 'JOB_XPTO_%',
    p_enable       =&gt; FALSE,                            -- desativar todos que casem com o padrão
    p_owner        =&gt; 'DEMOAPP',                        -- opcional
    p_type         =&gt; pkg_job_admin.c_type_scheduler,   -- QUALQUER TIPO : SCHEDULER | DBMS_JOB | ANY
    p_stop_running =&gt; TRUE
  );
END;
/" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.set_jobs_by_pattern(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_name_like    =&gt; </span><span style="color: #CE9178">&#39;JOB_XPTO_%&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_enable       =&gt; FALSE,                            </span><span style="color: #6A9955">-- desativar todos que casem com o padrão</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner        =&gt; </span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span><span style="color: #D4D4D4">,                        </span><span style="color: #6A9955">-- opcional</span></span>
<span class="line"><span style="color: #D4D4D4">    p_type         =&gt; pkg_job_admin.c_type_scheduler,   </span><span style="color: #6A9955">-- QUALQUER TIPO : SCHEDULER | DBMS_JOB | ANY</span></span>
<span class="line"><span style="color: #D4D4D4">    p_stop_running =&gt; TRUE</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p><br><br><br></p>



<p></p>



<p><br></p>



<p class="has-medium-font-size"><strong>Quais jobs existem e quando rodarão?</strong></p>



<p></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="SELECT owner, job_type, job_name, enabled, state, next_run_date 
FROM   job_admin_all_jobs_v
ORDER  BY owner, job_type, job_name;


--  O que observar
--    • job_type: distingue SCHEDULER vs DBMS_JOB.
--    • enabled: “TRUE/FALSE” consolidado para ambos.
--    • state: útil para SCHEDULER (ex.: SCHEDULED, DISABLED)." style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_type, job_name, </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">state</span><span style="color: #D4D4D4">, next_run_date </span></span>
<span class="line"><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4">   job_admin_all_jobs_v</span></span>
<span class="line"><span style="color: #569CD6">ORDER  BY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_type, job_name;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">--  O que observar</span></span>
<span class="line"><span style="color: #6A9955">--    • job_type: distingue SCHEDULER vs DBMS_JOB.</span></span>
<span class="line"><span style="color: #6A9955">--    • enabled: “TRUE/FALSE” consolidado para ambos.</span></span>
<span class="line"><span style="color: #6A9955">--    • state: útil para SCHEDULER (ex.: SCHEDULED, DISABLED).</span></span></code></pre></div>



<p><br><br><br></p>



<p></p>



<p><br></p>



<p class="has-medium-font-size"><strong>Quais jobs contêm a palavra &#8216;XPTO&#8217; no nome ou no comando?</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="SELECT owner, job_type, job_name, enabled, job_action
FROM   job_admin_all_jobs
WHERE  UPPER(job_name)   LIKE '%XPTO%'
   OR  UPPER(job_action) LIKE '%XPTO%'
ORDER  BY owner, job_name;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_type, job_name, </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4">, job_action</span></span>
<span class="line"><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4">   job_admin_all_jobs</span></span>
<span class="line"><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(job_name)   </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;%XPTO%&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(job_action) </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;%XPTO%&#39;</span></span>
<span class="line"><span style="color: #569CD6">ORDER  BY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_name;</span></span></code></pre></div>



<p><br></p>



<p><br><br><br><br><br></p>



<p><br></p>



<p class="has-medium-font-size"><strong>Qual o próximo agendamento dos jobs do meu schema de aplicação?</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="SELECT job_name, enabled, state, next_run_date
FROM   job_admin_all_jobs_v
WHERE  owner = 'DEMOAPP'
ORDER  BY job_name;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> job_name, </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">state</span><span style="color: #D4D4D4">, next_run_date</span></span>
<span class="line"><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4">   job_admin_all_jobs_v</span></span>
<span class="line"><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span></span>
<span class="line"><span style="color: #569CD6">ORDER  BY</span><span style="color: #D4D4D4"> job_name;</span></span></code></pre></div>



<p><br></p>



<p><br><br><br><br></p>



<p></p>



<p class="has-medium-font-size"><strong>Quem está rodando agora e há quanto tempo?</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="SELECT owner, job_type, job_name, running_instance, elapsed_time
FROM   job_admin_running_v
ORDER  BY running_instance, job_type, job_name;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_type, job_name, running_instance, elapsed_time</span></span>
<span class="line"><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4">   job_admin_running_v</span></span>
<span class="line"><span style="color: #569CD6">ORDER  BY</span><span style="color: #D4D4D4"> running_instance, job_type, job_name;</span></span></code></pre></div>



<p><br></p>



<p><br><br><br></p>



<p></p>



<p class="has-medium-font-size"><strong>Agora vamos ver se o job JOB_XPTO_ETL_DIARIO está rodando e há quanto tempo</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="SELECT owner, job_type, job_name, elapsed_time
FROM   job_admin_running_v
WHERE  job_name = 'JOB_XPTO_ETL_DIARIO';

-- • Se vier linha, o job está ativo; elapsed_time mostra a duração no formato DD HH:MI:SS." style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_type, job_name, elapsed_time</span></span>
<span class="line"><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4">   job_admin_running_v</span></span>
<span class="line"><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4">  job_name = </span><span style="color: #CE9178">&#39;JOB_XPTO_ETL_DIARIO&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- • Se vier linha, o job está ativo; elapsed_time mostra a duração no formato DD HH:MI:SS.</span></span></code></pre></div>



<p><br></p>



<p><br><br><br></p>



<p></p>



<p class="has-medium-font-size"><strong>Quais jobs estão desabilitados, para uma revisão rápida?</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="SELECT owner, job_type, job_name, enabled
FROM   job_admin_all_jobs_v
WHERE  enabled = 'FALSE'
ORDER  BY owner, job_type, job_name;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_type, job_name, </span><span style="color: #569CD6">enabled</span></span>
<span class="line"><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4">   job_admin_all_jobs_v</span></span>
<span class="line"><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;FALSE&#39;</span></span>
<span class="line"><span style="color: #569CD6">ORDER  BY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_type, job_name;</span></span></code></pre></div>



<p><br></p>



<p><br><br><br></p>



<p></p>



<p class="has-large-font-size"><strong>Como usar o Pacote (exemplos passo a passo)</strong></p>



<p>Todos os exemplos assumem que você possui a role JOBDBMSSCHEDULERALL.<br>Use os sinônimos públicos (pkg_job_admin) — não há necessidade de prefixar com schema.</p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="-- Inventário

BEGIN
  pkg_job_admin.list_jobs;                    -- Listar TUDO!
  pkg_job_admin.list_jobs('DEMOAPP');         -- Procurar pelo OWNER
  pkg_job_admin.list_jobs(p_like =&gt; 'JOB_%'); -- Busca por jobs cujo nome contenha o padrão informado (equivalente ao LIKE).
END;
/



--- OUTPUT : 

=== JOBS (SCHEDULER) ===
DEMOAPP.JOB_XPTO_ETL_DIARIO | enabled=TRUE | state=SCHEDULED | next=2025-09-27 01:00:00 | action=BEGIN pkg_etl.run_daily; END;
DEMOAPP.JOB_SYNC_CLIENTES   | enabled=FALSE | state=DISABLED | next=- | action=BEGIN sync_clientes(); END;

=== JOBS (DBMS_JOB) ===
DEMOAPP.128 | enabled=TRUE | next=2025-09-11 03:00:00 | what=BEGIN antiga_rotina(); END;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">-- Inventário</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.list_jobs;                    </span><span style="color: #6A9955">-- Listar TUDO!</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.list_jobs(</span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span><span style="color: #D4D4D4">);         </span><span style="color: #6A9955">-- Procurar pelo OWNER</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.list_jobs(p_like =&gt; </span><span style="color: #CE9178">&#39;JOB_%&#39;</span><span style="color: #D4D4D4">); </span><span style="color: #6A9955">-- Busca por jobs cujo nome contenha o padrão informado (equivalente ao LIKE).</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">--- OUTPUT : </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">=== JOBS (SCHEDULER) ===</span></span>
<span class="line"><span style="color: #D4D4D4">DEMOAPP.JOB_XPTO_ETL_DIARIO | </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4">=TRUE | </span><span style="color: #569CD6">state</span><span style="color: #D4D4D4">=SCHEDULED | </span><span style="color: #569CD6">next</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">2025</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">09</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">27</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">01</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">00</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">00</span><span style="color: #D4D4D4"> | </span><span style="color: #569CD6">action</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">BEGIN</span><span style="color: #D4D4D4"> pkg_etl.run_daily; </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">DEMOAPP.JOB_SYNC_CLIENTES   | </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4">=FALSE | </span><span style="color: #569CD6">state</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">DISABLED</span><span style="color: #D4D4D4"> | </span><span style="color: #569CD6">next</span><span style="color: #D4D4D4">=- | </span><span style="color: #569CD6">action</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">BEGIN</span><span style="color: #D4D4D4"> sync_clientes(); </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">=== JOBS (DBMS_JOB) ===</span></span>
<span class="line"><span style="color: #D4D4D4">DEMOAPP.128 | </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4">=TRUE | </span><span style="color: #569CD6">next</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">2025</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">09</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">11</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">03</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">00</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">00</span><span style="color: #D4D4D4"> | what=</span><span style="color: #569CD6">BEGIN</span><span style="color: #D4D4D4"> antiga_rotina(); </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<p><br></p>



<p><br><br><br><br></p>



<p></p>



<p class="has-medium-font-size"><strong>Execução (quem está rodando) com leitura guiada</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="-- Agora vamos ver se o job XPTO está rodando e há quanto tempo

BEGIN
  pkg_job_admin.list_running_jobs(p_like =&gt; 'JOB_XPTO_%');
END;
/



--- OUTPUT : 

=== RUNNING (SCHEDULER) ===
DEMOAPP.JOB_XPTO_ETL_DIARIO | sid=123 | inst=1 | elapsed=00 00:07:32 | cpu=00 00:02:10

=== RUNNING (DBMS_JOB) ===
-- (vazio, se nada estiver executando)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">-- Agora vamos ver se o job XPTO está rodando e há quanto tempo</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.list_running_jobs(p_like =&gt; </span><span style="color: #CE9178">&#39;JOB_XPTO_%&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">--- OUTPUT : </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">=== RUNNING (SCHEDULER) ===</span></span>
<span class="line"><span style="color: #D4D4D4">DEMOAPP.JOB_XPTO_ETL_DIARIO | </span><span style="color: #569CD6">sid</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">123</span><span style="color: #D4D4D4"> | inst=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> | elapsed=</span><span style="color: #B5CEA8">00</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">00</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">07</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">32</span><span style="color: #D4D4D4"> | cpu=</span><span style="color: #B5CEA8">00</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">00</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">02</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">10</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">=== RUNNING (DBMS_JOB) ===</span></span>
<span class="line"><span style="color: #6A9955">-- (vazio, se nada estiver executando)</span></span></code></pre></div>



<p><br></p>



<p><br><br><br><br></p>



<p></p>



<p class="has-medium-font-size"><strong>Operações pontuais: habilitar/desabilitar</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="-- DBMS_SCHEDULER por nome (owner informado — mais explícito):

BEGIN
  -- desativar e forçar parada se estiver rodando
  pkg_job_admin.disable_job('DEMOAPP.JOB_XPTO_ETL_DIARIO', p_stop_running =&gt; TRUE);
  -- reativar
  pkg_job_admin.enable_job ('DEMOAPP.JOB_XPTO_ETL_DIARIO');
END;
/



--- DBMS_JOB por número (owner opcional, útil para validar pertinência):

BEGIN
  -- desativar e forçar parada se estiver rodando
  pkg_job_admin.disable_job('128', p_owner =&gt; 'DEMOAPP', p_stop_running =&gt; TRUE);
  -- reativar
  pkg_job_admin.enable_job ('128', p_owner =&gt; 'DEMOAPP');
END;
/



-- O que acontece por trás:
--   • SCHEDULER: STOP_JOB(..., force =&gt; TRUE) (se p_stop_running=&gt;TRUE), seguido de DISABLE/ENABLE.
--   • DBMS_JOB: encerra sessão (se ativa) e marca BROKEN (NOT p_enable).
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">-- DBMS_SCHEDULER por nome (owner informado — mais explícito):</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- desativar e forçar parada se estiver rodando</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.disable_job(</span><span style="color: #CE9178">&#39;DEMOAPP.JOB_XPTO_ETL_DIARIO&#39;</span><span style="color: #D4D4D4">, p_stop_running =&gt; TRUE);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- reativar</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.enable_job (</span><span style="color: #CE9178">&#39;DEMOAPP.JOB_XPTO_ETL_DIARIO&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">--- DBMS_JOB por número (owner opcional, útil para validar pertinência):</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- desativar e forçar parada se estiver rodando</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.disable_job(</span><span style="color: #CE9178">&#39;128&#39;</span><span style="color: #D4D4D4">, p_owner =&gt; </span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span><span style="color: #D4D4D4">, p_stop_running =&gt; TRUE);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- reativar</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.enable_job (</span><span style="color: #CE9178">&#39;128&#39;</span><span style="color: #D4D4D4">, p_owner =&gt; </span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- O que acontece por trás:</span></span>
<span class="line"><span style="color: #6A9955">--   • SCHEDULER: STOP_JOB(..., force =&gt; TRUE) (se p_stop_running=&gt;TRUE), seguido de DISABLE/ENABLE.</span></span>
<span class="line"><span style="color: #6A9955">--   • DBMS_JOB: encerra sessão (se ativa) e marca BROKEN (NOT p_enable).</span></span>
<span class="line"></span></code></pre></div>



<p><br></p>



<p><br><br><br><br></p>



<p class="has-medium-font-size"><strong>Operações em lote: desabilitar todos os “JOB_XPTO_%” do SCHEDULER</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="-- Cenário: janela de manutenção requer pausar rotinas XPTO do schema de aplicação.

--- Desativar
BEGIN
  pkg_job_admin.set_jobs_by_pattern(
    p_name_like    =&gt; 'JOB_XPTO_%',
    p_enable       =&gt; FALSE,                              -- desativar
    p_owner        =&gt; 'DEMOAPP',
    p_type         =&gt; pkg_job_admin.c_type_scheduler,     
    p_stop_running =&gt; TRUE                                -- encerrar active session job
  );
END;
/



--- Reativar
BEGIN
  pkg_job_admin.set_jobs_by_pattern(
    p_name_like    =&gt; 'JOB_XPTO_%',
    p_enable       =&gt; TRUE,                               -- reativar
    p_owner        =&gt; 'DEMOAPP',
    p_type         =&gt; pkg_job_admin.c_type_scheduler
  );
END;
/

" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">-- Cenário: janela de manutenção requer pausar rotinas XPTO do schema de aplicação.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">--- Desativar</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.set_jobs_by_pattern(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_name_like    =&gt; </span><span style="color: #CE9178">&#39;JOB_XPTO_%&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_enable       =&gt; FALSE,                              </span><span style="color: #6A9955">-- desativar</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner        =&gt; </span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_type         =&gt; pkg_job_admin.c_type_scheduler,     </span></span>
<span class="line"><span style="color: #D4D4D4">    p_stop_running =&gt; TRUE                                </span><span style="color: #6A9955">-- encerrar active session job</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">--- Reativar</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.set_jobs_by_pattern(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_name_like    =&gt; </span><span style="color: #CE9178">&#39;JOB_XPTO_%&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_enable       =&gt; TRUE,                               </span><span style="color: #6A9955">-- reativar</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner        =&gt; </span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_type         =&gt; pkg_job_admin.c_type_scheduler</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"></span></code></pre></div>



<p><br></p>



<p><br><br><br><br></p>



<p></p>



<p class="has-medium-font-size"><strong>Analisar o job &#8216;JOB_XPTO_ETL_DIARIO&#8217; especificamente</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="-- 1. Está presente? Quando roda?

SELECT *
FROM   job_admin_all_jobs_v
WHERE  owner = 'DEMOAPP' AND job_name = 'JOB_XPTO_ETL_DIARIO';


-- 2. Está executando agora? Há quanto tempo?
SELECT running_instance, elapsed_time
FROM   job_admin_running_v
WHERE  owner = 'DEMOAPP' AND job_name = 'JOB_XPTO_ETL_DIARIO';

-- 3. Pausar com segurança (parar se ativo, depois desabilitar)
BEGIN
  pkg_job_admin.disable_job('DEMOAPP.JOB_XPTO_ETL_DIARIO', p_stop_running =&gt; TRUE);
END;
/

-- 4. Reativar
BEGIN
  pkg_job_admin.enable_job('DEMOAPP.JOB_XPTO_ETL_DIARIO');
END;
/


" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">-- 1. Está presente? Quando roda?</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> *</span></span>
<span class="line"><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4">   job_admin_all_jobs_v</span></span>
<span class="line"><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> job_name = </span><span style="color: #CE9178">&#39;JOB_XPTO_ETL_DIARIO&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- 2. Está executando agora? Há quanto tempo?</span></span>
<span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> running_instance, elapsed_time</span></span>
<span class="line"><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4">   job_admin_running_v</span></span>
<span class="line"><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> job_name = </span><span style="color: #CE9178">&#39;JOB_XPTO_ETL_DIARIO&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- 3. Pausar com segurança (parar se ativo, depois desabilitar)</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.disable_job(</span><span style="color: #CE9178">&#39;DEMOAPP.JOB_XPTO_ETL_DIARIO&#39;</span><span style="color: #D4D4D4">, p_stop_running =&gt; TRUE);</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- 4. Reativar</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  pkg_job_admin.enable_job(</span><span style="color: #CE9178">&#39;DEMOAPP.JOB_XPTO_ETL_DIARIO&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span></code></pre></div>



<p><br></p>



<p><br><br><br></p>



<p><strong>Qual a serventia dessa solução ? </strong><br><br>Ambientes Oracle costumam conviver com dois mecanismos de agendamento: DBMS_SCHEDULER (moderno) e DBMS_JOB (legado). Quando precisamos inventariar, monitorar, habilitar/desabilitar ou gerenciar em lote ambos os tipos, a experiência comum é assimétrica e dispersa.<br>Este projeto entrega uma interface única e consistente para manipular os dois mundos:</p>



<ul class="wp-block-list">
<li>Visões consolidadas para inventário e execução.</li>



<li>Um pacote PL/SQL com comandos simples e legíveis para operações pontuais e em lote.</li>



<li>Role e sinônimos públicos para padronizar o consumo de forma segura.</li>
</ul>



<p><br></p>



<p><br><br><br><br></p>



<p></p>



<p class="has-medium-font-size"><strong>Abaixo consta o codigo inteiro do pacote pkg_job_admin</strong> </p>



<div class="wp-block-file aligncenter"><a id="wp-block-file--media-5691fc75-8483-4dd2-a032-4fcb5a7fb647" href="https://furushima.com.br/wp-content/uploads/2025/09/job_admin_setup_completo.zip">Download &#8211; script pkg_job_admin &#8211; ORACLE</a><a href="https://furushima.com.br/wp-content/uploads/2025/09/job_admin_setup_completo.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-5691fc75-8483-4dd2-a032-4fcb5a7fb647">Baixar</a></div>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="-- =================================================================================================
--  job_admin_setup_completo.sql
--  Administração unificada de jobs no Oracle Database (DBMS_SCHEDULER e DBMS_JOB)
--  Autor: Carlos Furushima — Furushima IT
--  Direitos Autorais: Este script é propriedade intelectual de Furushima IT. Todos os direitos reservados.
--
--  OBJETIVO
--  --------
--  Fornecer uma interface única, consistente e profissional para:
--    • Inventariar jobs do SCHEDULER e do DBMS_JOB em visões consolidadas;
--    • Consultar jobs em execução (tempo decorrido e sessão, quando aplicável);
--    • Habilitar/Desabilitar jobs individualmente (por nome ou número);
--    • Habilitar/Desabilitar em lote por padrão de nome;
--    • Padronizar o consumo por meio de uma ROLE e sinônimos públicos.
--
--  O QUE É CRIADO
--  --------------
--    Views:
--      - JOB_ADMIN_ALL_JOBS      : inventário unificado (SCHEDULER + DBMS_JOB)
--      - JOB_ADMIN_RUNNING       : execução unificada (SCHEDULER + DBMS_JOB)
--      - JOB_ADMIN_ALL_JOBS_V    : inventário formatado para leitura humana
--      - JOB_ADMIN_RUNNING_V     : execução formatada para leitura humana
--
--    Pacote:
--      - PKG_JOB_ADMIN           : utilitários de listagem e (des)ativação unificada
--
--    Segurança e Acesso:
--      - ROLE JOBDBMSSCHEDULERALL com grants de SELECT/EXECUTE
--      - Sinônimos públicos para facilitar o uso por quem tiver a ROLE
--
--  PRÉ-REQUISITOS
--  --------------
--  • Executar com um usuário com privilégios para consultar dicionários DBA_* e GV$* e criar objetos.
--  • O pacote é AUTHID DEFINER (permissões do dono do pacote). Usuários finais só precisam da ROLE.
--
--  USO TÍPICO
--  ----------
--  -- Inventário:
--  BEGIN
--    pkg_job_admin.list_jobs;                       -- tudo
--    pkg_job_admin.list_jobs('DEMOAPP');            -- por owner
--    pkg_job_admin.list_jobs(p_like =&gt; 'JOB_%');    -- por padrão (LIKE)
--  END;
--  /
--
--  -- Executando agora:
--  BEGIN
--    pkg_job_admin.list_running_jobs;                       -- tudo
--    pkg_job_admin.list_running_jobs('DEMOAPP');            -- por owner
--    pkg_job_admin.list_running_jobs(p_like =&gt; 'SYNC_%');   -- por padrão (LIKE)
--  END;
--  /
--
--  -- Operações pontuais:
--  -- SCHEDULER (identificador por nome, owner opcional se único no banco)
--  -- BEGIN
--  --   pkg_job_admin.disable_job('DEMOAPP.JOB_ATUALIZA_INDICES', p_stop_running =&gt; TRUE);
--  --   pkg_job_admin.enable_job ('DEMOAPP.JOB_ATUALIZA_INDICES');
--  -- END;
--  -- /
--  --
--  -- DBMS_JOB (identificador numérico; owner opcional apenas para validar pertinência)
--  -- BEGIN
--  --   pkg_job_admin.disable_job('128', p_owner =&gt; 'SYS', p_stop_running =&gt; TRUE);
--  --   pkg_job_admin.enable_job ('128', p_owner =&gt; 'SYS');
--  -- END;
--  -- /
--
--  -- Lote por padrão (por tipo):
--  -- BEGIN
--  --   pkg_job_admin.set_jobs_by_pattern(
--  --     p_name_like    =&gt; 'JOB_SYNC_%',
--  --     p_enable       =&gt; FALSE,                               -- desativar
--  --     p_owner        =&gt; 'DEMOAPP',                           -- opcional
--  --     p_type         =&gt; pkg_job_admin.c_type_scheduler,      -- SCHEDULER | DBMS_JOB | ANY
--  --     p_stop_running =&gt; TRUE
--  --   );
--  -- END;
--  -- /
--
--  DICAS
--  -----
--  • O script é idempotente (CREATE OR REPLACE; checagens seguras). Pode ser executado mais de uma vez.
--  • Saída “limpa”: mensagens organizadas por PROMPT/DBMS_OUTPUT para auditoria e documentação.
-- =================================================================================================

SET FEEDBACK ON
SET SERVEROUTPUT ON SIZE UNLIMITED
SET VERIFY OFF

PROMPT
PROMPT ═════════════════════════════════════════════════════════════════════════════════════════════
PROMPT   Iniciando job_admin_setup_completo.sql
PROMPT ═════════════════════════════════════════════════════════════════════════════════════════════

-- -----------------------------------------------------------------------------------------------
-- 0) CONTEXTO — Mostra o usuário (owner) sob o qual os objetos serão criados
-- -----------------------------------------------------------------------------------------------
DECLARE
  l_user VARCHAR2(128) := USER;
BEGIN
  DBMS_OUTPUT.PUT_LINE('Owner atual: '||l_user);
END;
/

PROMPT
PROMPT ── 1) Criando/Atualizando Views Consolidadas …

-- ===============================================================================================
-- 1.1) JOB_ADMIN_ALL_JOBS
--      Consolida em uma única visão os jobs do DBMS_SCHEDULER e do DBMS_JOB.
--      Observações de tipos:
--        • next_run_date / last_start_date: TIMESTAMP WITH TIME ZONE (SCHEDULER) x DATE (DBMS_JOB)
--          -&gt; o Oracle promove DATE para TIMESTAMP durante o UNION ALL (sem perda de funcionalidade).
--        • last_run_duration: INTERVAL no SCHEDULER; CAST de NULL para INTERVAL no DBMS_JOB.
--        • job_action / repeat_interval: normalizados para VARCHAR2 (até 4000) no DBMS_JOB.
-- ===============================================================================================
CREATE OR REPLACE VIEW job_admin_all_jobs AS
    SELECT owner,
           job_name,
           'SCHEDULER'               AS job_type,
           CASE WHEN enabled = 'TRUE' THEN 'TRUE' ELSE 'FALSE' END AS enabled,
           state,
           next_run_date,                                -- TIMESTAMP WITH TIME ZONE
           last_start_date,                              -- TIMESTAMP WITH TIME ZONE
           last_run_duration,                            -- INTERVAL DAY TO SECOND
           job_action,                                   -- VARCHAR2/CLOB (na maioria dos casos, até 4000)
           repeat_interval                               -- VARCHAR2
      FROM dba_scheduler_jobs
  UNION ALL
    SELECT schema_user                                   AS owner,
           TO_CHAR(job)                                  AS job_name,
           'DBMS_JOB'                                    AS job_type,
           CASE broken WHEN 'Y' THEN 'FALSE' ELSE 'TRUE' END AS enabled,
           CAST(NULL AS VARCHAR2(30))                    AS state,
           next_date,                                    -- DATE (promovido a TIMESTAMP no UNION)
           last_date                                     AS last_start_date, -- DATE
           CAST(NULL AS INTERVAL DAY TO SECOND)          AS last_run_duration,
           SUBSTR(what,     4000)                        AS job_action,      -- LONG -&gt; VARCHAR2
           SUBSTR(interval, 4000)                        AS repeat_interval  -- LONG -&gt; VARCHAR2
      FROM dba_jobs
;

-- ===============================================================================================
-- 1.2) JOB_ADMIN_RUNNING
--      Consolida os jobs em execução. Para DBMS_JOB, calcula elapsed pelo logon_time da sessão.
--      Observações:
--        • cpu_used não se aplica ao DBMS_JOB; representa-se com NULL (cast para INTERVAL).
-- ===============================================================================================
CREATE OR REPLACE VIEW job_admin_running AS
    SELECT owner,
           job_name,
           'SCHEDULER'               AS job_type,
           session_id,
           running_instance,
           elapsed_time,                                 -- INTERVAL
           cpu_used                                      -- INTERVAL
      FROM dba_scheduler_running_jobs
  UNION ALL
    SELECT j.schema_user           AS owner,
           TO_CHAR(r.job)          AS job_name,
           'DBMS_JOB'              AS job_type,
           r.sid                   AS session_id,
           s.inst_id               AS running_instance,
           NUMTODSINTERVAL(TRUNC((SYSDATE - s.logon_time)*86400),'SECOND') AS elapsed_time,
           CAST(NULL AS INTERVAL DAY TO SECOND)          AS cpu_used
      FROM dba_jobs_running r
      JOIN gv$session s ON s.sid = r.sid
      JOIN dba_jobs j   ON j.job = r.job
;

-- ===============================================================================================
-- 1.3) JOB_ADMIN_ALL_JOBS_V — Versão “amigável” (formatos para leitura humana)
-- ===============================================================================================
CREATE OR REPLACE VIEW job_admin_all_jobs_v AS
SELECT owner, job_name, job_type, enabled, state,
       TO_CHAR(next_run_date,'YYYY-MM-DD HH24:MI:SS')      AS next_run_date,
       TO_CHAR(last_start_date,'YYYY-MM-DD HH24:MI:SS')    AS last_start_date,
       CASE WHEN last_run_duration IS NULL THEN '-' ELSE
         EXTRACT(DAY FROM last_run_duration)||' '||
         LPAD(EXTRACT(HOUR FROM last_run_duration),2,'0')||':'||
         LPAD(EXTRACT(MINUTE FROM last_run_duration),2,'0')||':'||
         LPAD(TRUNC(EXTRACT(SECOND FROM last_run_duration)),2,'0')
       END AS last_run_duration,
       job_action, repeat_interval
  FROM job_admin_all_jobs
;

-- ===============================================================================================
-- 1.4) JOB_ADMIN_RUNNING_V — Versão “amigável” (formatos para leitura humana)
-- ===============================================================================================
CREATE OR REPLACE VIEW job_admin_running_v AS
SELECT owner, job_name, job_type, session_id, running_instance,
       CASE WHEN elapsed_time IS NULL THEN '-' ELSE
         EXTRACT(DAY FROM elapsed_time)||' '||
         LPAD(EXTRACT(HOUR FROM elapsed_time),2,'0')||':'||
         LPAD(EXTRACT(MINUTE FROM elapsed_time),2,'0')||':'||
         LPAD(TRUNC(EXTRACT(SECOND FROM elapsed_time)),2,'0')
       END AS elapsed_time,
       CASE WHEN cpu_used IS NULL THEN '-' ELSE
         EXTRACT(DAY FROM cpu_used)||' '||
         LPAD(EXTRACT(HOUR FROM cpu_used),2,'0')||':'||
         LPAD(EXTRACT(MINUTE FROM cpu_used),2,'0')||':'||
         LPAD(TRUNC(EXTRACT(SECOND FROM cpu_used)),2,'0')
       END AS cpu_used
  FROM job_admin_running
;

PROMPT ✓ Views criadas/atualizadas com sucesso.

PROMPT
PROMPT ── 2) Criando/Atualizando Pacote (SPEC) …

-- =================================================================================================
-- 2) ESPECIFICAÇÃO DO PACOTE — PKG_JOB_ADMIN
--    Contém constantes de tipo e procedimentos públicos de listagem e (des)ativação unificada.
-- =================================================================================================
CREATE OR REPLACE PACKAGE pkg_job_admin AUTHID DEFINER AS
  -- Constantes para filtro por tipo
  c_type_scheduler CONSTANT VARCHAR2(11) := 'SCHEDULER';
  c_type_dbms_job  CONSTANT VARCHAR2(8)  := 'DBMS_JOB';
  c_type_any       CONSTANT VARCHAR2(3)  := 'ANY';

  -- Listagem de jobs (inventário)
  PROCEDURE list_jobs(
    p_owner IN VARCHAR2 DEFAULT NULL,   -- filtra por owner
    p_like  IN VARCHAR2 DEFAULT NULL    -- filtra por padrão (LIKE)
  );

  -- Listagem de jobs em execução
  PROCEDURE list_running_jobs(
    p_owner IN VARCHAR2 DEFAULT NULL,   -- filtra por owner
    p_like  IN VARCHAR2 DEFAULT NULL    -- filtra por padrão (LIKE)
  );

  -- Habilita/Desabilita um job (identificador por nome SCHEDULER ou número DBMS_JOB)
  PROCEDURE set_job_enabled(
    p_job_identifier IN VARCHAR2,       -- 'OWNER.JOB_NAME' | 'JOB_NAME' | '123' (DBMS_JOB)
    p_enable         IN BOOLEAN,        -- TRUE = ENABLE; FALSE = DISABLE
    p_owner          IN VARCHAR2 DEFAULT NULL,  -- para SCHEDULER sem owner único ou DBMS_JOB para validar owner
    p_stop_running   IN BOOLEAN DEFAULT FALSE   -- encerra execução corrente (se houver)
  );

  -- Açúcares sintáticos (conveniências)
  PROCEDURE enable_job(
    p_job_identifier IN VARCHAR2,
    p_owner          IN VARCHAR2 DEFAULT NULL,
    p_stop_running   IN BOOLEAN DEFAULT FALSE
  );

  PROCEDURE disable_job(
    p_job_identifier IN VARCHAR2,
    p_owner          IN VARCHAR2 DEFAULT NULL,
    p_stop_running   IN BOOLEAN DEFAULT TRUE
  );

  -- Habilita/Desabilita em lote por padrão de nome e tipo
  PROCEDURE set_jobs_by_pattern(
    p_name_like     IN VARCHAR2,                      -- ex: 'JOB_SYNC_%'
    p_enable        IN BOOLEAN,                       -- TRUE/FALSE
    p_owner         IN VARCHAR2 DEFAULT NULL,         -- opcional
    p_type          IN VARCHAR2 DEFAULT c_type_any,   -- SCHEDULER | DBMS_JOB | ANY
    p_stop_running  IN BOOLEAN DEFAULT FALSE
  );
END pkg_job_admin;
/
SHOW ERRORS

PROMPT
PROMPT ── 3) Criando/Atualizando Pacote (BODY) …

-- =================================================================================================
-- 3) CORPO DO PACOTE — PKG_JOB_ADMIN
--    Implementa utilitários de formatação, detecção de owner/instância, e operações de controle.
-- =================================================================================================
CREATE OR REPLACE PACKAGE BODY pkg_job_admin AS

  -- ---------------------------------------------------------------------------------------------
  -- Função auxiliar: formata INTERVAL DAY TO SECOND em 'DD HH24:MI:SS'
  -- ---------------------------------------------------------------------------------------------
  FUNCTION fmt_ds(p INTERVAL DAY TO SECOND) RETURN VARCHAR2 IS
    l_day  PLS_INTEGER; l_hour PLS_INTEGER; l_min PLS_INTEGER; l_sec PLS_INTEGER;
  BEGIN
    IF p IS NULL THEN RETURN '-'; END IF;
    l_day  := EXTRACT(DAY    FROM p);
    l_hour := EXTRACT(HOUR   FROM p);
    l_min  := EXTRACT(MINUTE FROM p);
    l_sec  := TRUNC(EXTRACT(SECOND FROM p));
    RETURN LPAD(l_day,2,'0')||' '||LPAD(l_hour,2,'0')||':'||LPAD(l_min,2,'0')||':'||LPAD(l_sec,2,'0');
  END fmt_ds;

  -- ---------------------------------------------------------------------------------------------
  -- Função auxiliar: TO_CHAR seguro para datas que podem ser NULL (retorna '-' no NULL)
  -- ---------------------------------------------------------------------------------------------
  FUNCTION to_char_nvl(p_date DATE) RETURN VARCHAR2 IS
  BEGIN
    RETURN CASE WHEN p_date IS NULL THEN '-' ELSE TO_CHAR(p_date,'YYYY-MM-DD HH24:MI:SS') END;
  END;

  -- ---------------------------------------------------------------------------------------------
  -- Monta o nome totalmente qualificado do job de SCHEDULER
  -- ---------------------------------------------------------------------------------------------
  FUNCTION sched_job_fqname(p_owner IN VARCHAR2, p_job_name IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
    RETURN CASE WHEN p_owner IS NOT NULL THEN UPPER(p_owner)||'.'||UPPER(p_job_name) ELSE UPPER(p_job_name) END;
  END;

  -- ---------------------------------------------------------------------------------------------
  -- Solicita parada de job SCHEDULER, se estiver em execução (silencioso em falhas)
  -- ---------------------------------------------------------------------------------------------
  PROCEDURE stop_scheduler_if_running(p_owner IN VARCHAR2, p_job_name IN VARCHAR2) IS
    l_fq VARCHAR2(261) := sched_job_fqname(p_owner, p_job_name);
  BEGIN
    DBMS_SCHEDULER.STOP_JOB(job_name =&gt; l_fq, force =&gt; TRUE);
  EXCEPTION
    WHEN OTHERS THEN NULL;
  END;

  -- ---------------------------------------------------------------------------------------------
  -- Encerra sessão de DBMS_JOB, se houver (suporte RAC com @inst_id)
  -- ---------------------------------------------------------------------------------------------
  PROCEDURE kill_dbms_job_session(p_job_id IN NUMBER) IS
    l_sid     NUMBER;
    l_serial  NUMBER;
    l_inst    NUMBER;
    l_stmt    VARCHAR2(200);
  BEGIN
    SELECT s.sid, s.serial#, s.inst_id
      INTO l_sid, l_serial, l_inst
      FROM dba_jobs_running r
      JOIN gv$session s ON s.sid = r.sid
     WHERE r.job = p_job_id
       AND ROWNUM = 1;

    l_stmt := 'ALTER SYSTEM KILL SESSION '''||l_sid||','||l_serial||
              CASE WHEN l_inst IS NOT NULL THEN ',@'||l_inst ELSE NULL END||''' IMMEDIATE';
    EXECUTE IMMEDIATE l_stmt;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN NULL;
    WHEN OTHERS THEN NULL;
  END;

  -- ---------------------------------------------------------------------------------------------
  -- Resolve owner de job SCHEDULER quando usuário não informou p_owner
  -- Lança erro se não encontrado ou se existir em múltiplos owners.
  -- ---------------------------------------------------------------------------------------------
  PROCEDURE resolve_scheduler(p_owner IN VARCHAR2, p_job_name IN VARCHAR2,
                              o_owner OUT VARCHAR2, o_job_name OUT VARCHAR2) IS
    l_cnt INTEGER;
  BEGIN
    o_job_name := UPPER(p_job_name);
    IF p_owner IS NOT NULL THEN o_owner := UPPER(p_owner); RETURN; END IF;

    SELECT COUNT(DISTINCT owner) INTO l_cnt
      FROM dba_scheduler_jobs
     WHERE job_name = o_job_name;

    IF l_cnt = 0 THEN
      RAISE NO_DATA_FOUND;
    ELSIF l_cnt &gt; 1 THEN
      RAISE_APPLICATION_ERROR(-20002,
        'JOB_NAME existe em múltiplos owners. Informe p_owner. JOB_NAME='||o_job_name);
    ELSE
      SELECT owner INTO o_owner
        FROM dba_scheduler_jobs
       WHERE job_name = o_job_name
         AND ROWNUM = 1;
    END IF;
  END resolve_scheduler;

  -- ---------------------------------------------------------------------------------------------
  -- Listagem: inventário unificado
  -- ---------------------------------------------------------------------------------------------
  PROCEDURE list_jobs(p_owner IN VARCHAR2 DEFAULT NULL, p_like IN VARCHAR2 DEFAULT NULL) IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('=== JOBS (SCHEDULER) ===');
    FOR r IN (
      SELECT owner, job_name, enabled, state, next_run_date, job_action
        FROM dba_scheduler_jobs
       WHERE (p_owner IS NULL OR owner = UPPER(p_owner))
         AND (p_like  IS NULL OR job_name LIKE UPPER(p_like))
       ORDER BY owner, job_name
    ) LOOP
      DBMS_OUTPUT.PUT_LINE(r.owner||'.'||r.job_name||
                           ' | enabled='||r.enabled||
                           ' | state='||NVL(r.state,'-')||
                           ' | next='||to_char_nvl(CAST(r.next_run_date AS DATE))||
                           ' | action='||SUBSTR(r.job_action,1,60));
    END LOOP;

    DBMS_OUTPUT.PUT_LINE(CHR(10)||'=== JOBS (DBMS_JOB) ===');
    FOR r IN (
      SELECT schema_user AS owner, job AS job_id, DECODE(broken,'Y','FALSE','TRUE') AS enabled,
             next_date, what
        FROM dba_jobs
       WHERE (p_owner IS NULL OR schema_user = UPPER(p_owner))
         AND (p_like  IS NULL OR TO_CHAR(job) LIKE p_like OR UPPER(what) LIKE UPPER(p_like))
       ORDER BY schema_user, job
    ) LOOP
      DBMS_OUTPUT.PUT_LINE(r.owner||'.'||r.job_id||
                           ' | enabled='||r.enabled||
                           ' | next='||to_char_nvl(r.next_date)||
                           ' | what='||SUBSTR(r.what,1,60));
    END LOOP;
  END list_jobs;

  -- ---------------------------------------------------------------------------------------------
  -- Listagem: execução unificada
  -- ---------------------------------------------------------------------------------------------
  PROCEDURE list_running_jobs(p_owner IN VARCHAR2 DEFAULT NULL, p_like IN VARCHAR2 DEFAULT NULL) IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('=== RUNNING (SCHEDULER) ===');
    FOR r IN (
      SELECT owner, job_name, session_id, running_instance, elapsed_time, cpu_used
        FROM dba_scheduler_running_jobs
       WHERE (p_owner IS NULL OR owner = UPPER(p_owner))
         AND (p_like  IS NULL OR job_name LIKE UPPER(p_like))
       ORDER BY running_instance, job_name
    ) LOOP
      DBMS_OUTPUT.PUT_LINE(r.owner||'.'||r.job_name||
                           ' | sid='||r.session_id||
                           ' | inst='||r.running_instance||
                           ' | elapsed='||fmt_ds(r.elapsed_time)||
                           ' | cpu='||fmt_ds(r.cpu_used));
    END LOOP;

    DBMS_OUTPUT.PUT_LINE(CHR(10)||'=== RUNNING (DBMS_JOB) ===');
    FOR r IN (
      SELECT j.schema_user AS owner, r.job AS job_id, s.sid, s.serial#,
             s.inst_id AS running_instance,
             NUMTODSINTERVAL(TRUNC((SYSDATE - s.logon_time)*86400),'SECOND') AS elapsed_time,
             j.what
        FROM dba_jobs_running r
        JOIN gv$session s ON s.sid = r.sid
        JOIN dba_jobs j   ON j.job = r.job
       WHERE (p_owner IS NULL OR j.schema_user = UPPER(p_owner))
         AND (p_like  IS NULL OR TO_CHAR(r.job) LIKE p_like OR UPPER(j.what) LIKE UPPER(p_like))
       ORDER BY running_instance, job_id
    ) LOOP
      DBMS_OUTPUT.PUT_LINE(r.owner||'.'||r.job_id||
                           ' | sid='||r.sid||','||r.serial#||
                           ' | inst='||r.running_instance||
                           ' | elapsed='||fmt_ds(r.elapsed_time));
    END LOOP;
  END list_running_jobs;

  -- ---------------------------------------------------------------------------------------------
  -- Núcleo: habilita/desabilita por identificador (nome SCHEDULER ou número DBMS_JOB)
  -- ---------------------------------------------------------------------------------------------
  PROCEDURE set_job_enabled(
    p_job_identifier IN VARCHAR2,
    p_enable         IN BOOLEAN,
    p_owner          IN VARCHAR2 DEFAULT NULL,
    p_stop_running   IN BOOLEAN DEFAULT FALSE
  ) IS
    l_owner    VARCHAR2(128);
    l_job_name VARCHAR2(128);
    l_job_id   NUMBER;
  BEGIN
    -- 1) Tentar SCHEDULER (nome)
    BEGIN
      IF REGEXP_LIKE(p_job_identifier,'^\d+$') THEN RAISE NO_DATA_FOUND; END IF;

      IF INSTR(p_job_identifier,'.') &gt; 0 THEN
        l_owner    := UPPER(REGEXP_SUBSTR(p_job_identifier,'^([^\.]+)'));
        l_job_name := UPPER(REGEXP_SUBSTR(p_job_identifier,'\.([^\.]+)$',1,1,NULL,1));
      ELSE
        l_job_name := UPPER(p_job_identifier);
        resolve_scheduler(p_owner, l_job_name, l_owner, l_job_name);
      END IF;

      -- valida existência
      DECLARE l_dummy PLS_INTEGER;
      BEGIN
        SELECT 1 INTO l_dummy
          FROM dba_scheduler_jobs
         WHERE owner = l_owner AND job_name = l_job_name AND ROWNUM = 1;
      END;

      IF p_stop_running THEN
        stop_scheduler_if_running(l_owner, l_job_name);
      END IF;

      IF p_enable THEN
        DBMS_SCHEDULER.ENABLE( sched_job_fqname(l_owner, l_job_name) );
      ELSE
        DBMS_SCHEDULER.DISABLE( sched_job_fqname(l_owner, l_job_name) );
      END IF;

      DBMS_OUTPUT.PUT_LINE('OK (SCHEDULER) '||
        sched_job_fqname(l_owner,l_job_name)||' =&gt; '||
        CASE WHEN p_enable THEN 'ENABLED' ELSE 'DISABLED' END);

      RETURN;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN NULL; -- não era scheduler; tentar DBMS_JOB
    END;

    -- 2) Tentar DBMS_JOB (número)
    BEGIN
      l_job_id := TO_NUMBER(TRIM(p_job_identifier));

      -- valida existência (restringe owner se informado)
      DECLARE l_dummy2 PLS_INTEGER;
      BEGIN
        SELECT 1 INTO l_dummy2
          FROM dba_jobs
         WHERE job = l_job_id
           AND (p_owner IS NULL OR schema_user = UPPER(p_owner))
           AND ROWNUM = 1;
      END;

      IF p_stop_running THEN
        kill_dbms_job_session(l_job_id);
      END IF;

      DBMS_JOB.BROKEN(l_job_id, NOT p_enable);

      DBMS_OUTPUT.PUT_LINE('OK (DBMS_JOB) '||l_job_id||' =&gt; '||
        CASE WHEN p_enable THEN 'ENABLED' ELSE 'DISABLED' END);

      RETURN;
    EXCEPTION
      WHEN VALUE_ERROR    THEN NULL;
      WHEN INVALID_NUMBER THEN NULL;
      WHEN NO_DATA_FOUND  THEN NULL;
    END;

    -- 3) Não encontrado em nenhuma modalidade
    RAISE_APPLICATION_ERROR(-20001,
      'Job não encontrado como SCHEDULER (por nome) nem DBMS_JOB (por número): '||p_job_identifier);
  END set_job_enabled;

  -- Açúcares sintáticos
  PROCEDURE enable_job(
    p_job_identifier IN VARCHAR2,
    p_owner          IN VARCHAR2 DEFAULT NULL,
    p_stop_running   IN BOOLEAN  DEFAULT FALSE
  ) IS
  BEGIN
    set_job_enabled(p_job_identifier =&gt; p_job_identifier,
                    p_enable         =&gt; TRUE,
                    p_owner          =&gt; p_owner,
                    p_stop_running   =&gt; p_stop_running);
  END;

  PROCEDURE disable_job(
    p_job_identifier IN VARCHAR2,
    p_owner          IN VARCHAR2 DEFAULT NULL,
    p_stop_running   IN BOOLEAN  DEFAULT TRUE
  ) IS
  BEGIN
    set_job_enabled(p_job_identifier =&gt; p_job_identifier,
                    p_enable         =&gt; FALSE,
                    p_owner          =&gt; p_owner,
                    p_stop_running   =&gt; p_stop_running);
  END;

  -- ---------------------------------------------------------------------------------------------
  -- Habilita/Desabilita em lote por padrão (LIKE) e, opcionalmente, por tipo
  -- ---------------------------------------------------------------------------------------------
  PROCEDURE set_jobs_by_pattern(
    p_name_like     IN VARCHAR2,
    p_enable        IN BOOLEAN,
    p_owner         IN VARCHAR2 DEFAULT NULL,
    p_type          IN VARCHAR2 DEFAULT c_type_any,
    p_stop_running  IN BOOLEAN  DEFAULT FALSE
  ) IS
  BEGIN
    -- SCHEDULER
    IF UPPER(p_type) IN (c_type_any, c_type_scheduler) THEN
      FOR r IN (
        SELECT owner, job_name
          FROM dba_scheduler_jobs
         WHERE (p_owner IS NULL OR owner = UPPER(p_owner))
           AND job_name LIKE UPPER(p_name_like)
      ) LOOP
        set_job_enabled(r.owner||'.'||r.job_name, p_enable, NULL, p_stop_running);
      END LOOP;
    END IF;

    -- DBMS_JOB
    IF UPPER(p_type) IN (c_type_any, c_type_dbms_job) THEN
      FOR r IN (
        SELECT schema_user AS owner, job
          FROM dba_jobs
         WHERE (p_owner IS NULL OR schema_user = UPPER(p_owner))
           AND (TO_CHAR(job) LIKE p_name_like OR UPPER(what) LIKE UPPER(p_name_like))
      ) LOOP
        set_job_enabled(TO_CHAR(r.job), p_enable, r.owner, p_stop_running);
      END LOOP;
    END IF;
  END set_jobs_by_pattern;

END pkg_job_admin;
/
SHOW ERRORS

PROMPT ✓ Pacote criado/atualizado com sucesso.

PROMPT
PROMPT ── 4) Segurança: ROLE, Grants e Sinônimos Públicos …

-- =================================================================================================
-- 4.1) ROLE — criada apenas se não existir
-- =================================================================================================
DECLARE
  l_cnt INTEGER;
BEGIN
  SELECT COUNT(*) INTO l_cnt FROM dba_roles WHERE role = 'JOBDBMSSCHEDULERALL';
  IF l_cnt = 0 THEN
    EXECUTE IMMEDIATE 'CREATE ROLE JOBDBMSSCHEDULERALL';
    DBMS_OUTPUT.PUT_LINE('Role JOBDBMSSCHEDULERALL criada.');
  ELSE
    DBMS_OUTPUT.PUT_LINE('Role JOBDBMSSCHEDULERALL já existente.');
  END IF;
END;
/

-- =================================================================================================
-- 4.2) GRANTS — executar o pacote e consultar as views por meio da ROLE
-- =================================================================================================
GRANT EXECUTE ON pkg_job_admin        TO JOBDBMSSCHEDULERALL;
GRANT SELECT  ON job_admin_all_jobs   TO JOBDBMSSCHEDULERALL;
GRANT SELECT  ON job_admin_running    TO JOBDBMSSCHEDULERALL;
GRANT SELECT  ON job_admin_all_jobs_v TO JOBDBMSSCHEDULERALL;
GRANT SELECT  ON job_admin_running_v  TO JOBDBMSSCHEDULERALL;

-- =================================================================================================
-- 4.3) SINÔNIMOS PÚBLICOS — apontam para os objetos do OWNER atual
--     Observação: garantem uso uniforme via “public synonyms” para quem tiver a ROLE.
-- =================================================================================================
DECLARE
  l_owner VARCHAR2(128) := USER;
BEGIN
  EXECUTE IMMEDIATE 'CREATE OR REPLACE PUBLIC SYNONYM job_admin_all_jobs   FOR '||l_owner||'.job_admin_all_jobs';
  EXECUTE IMMEDIATE 'CREATE OR REPLACE PUBLIC SYNONYM job_admin_running    FOR '||l_owner||'.job_admin_running';
  EXECUTE IMMEDIATE 'CREATE OR REPLACE PUBLIC SYNONYM job_admin_all_jobs_v FOR '||l_owner||'.job_admin_all_jobs_v';
  EXECUTE IMMEDIATE 'CREATE OR REPLACE PUBLIC SYNONYM job_admin_running_v  FOR '||l_owner||'.job_admin_running_v';
  EXECUTE IMMEDIATE 'CREATE OR REPLACE PUBLIC SYNONYM pkg_job_admin        FOR '||l_owner||'.pkg_job_admin';
  DBMS_OUTPUT.PUT_LINE('Sinônimos públicos criados/atualizados.');
END;
/

PROMPT ✓ Segurança configurada (ROLE + grants + sinônimos públicos).

PROMPT
PROMPT ── 5) Auto-Validação (não intrusiva) …

-- =================================================================================================
-- 5.1) Verifica erros de compilação do pacote
-- =================================================================================================
DECLARE
  l_errs INTEGER;
BEGIN
  SELECT COUNT(*) INTO l_errs
    FROM user_errors
   WHERE name = 'PKG_JOB_ADMIN';

  IF l_errs = 0 THEN
    DBMS_OUTPUT.PUT_LINE('Pacote PKG_JOB_ADMIN sem erros de compilação.');
  ELSE
    DBMS_OUTPUT.PUT_LINE('ATENÇÃO: Encontrado(s) '||l_errs||' erro(s) em PKG_JOB_ADMIN:');
    FOR r IN (
      SELECT type, name, line, position, SUBSTR(text,1,200) AS text
        FROM user_errors
       WHERE name = 'PKG_JOB_ADMIN'
       ORDER BY sequence
    ) LOOP
      DBMS_OUTPUT.PUT_LINE(r.type||' '||r.name||' @'||r.line||':'||r.position||' - '||r.text);
    END LOOP;
  END IF;
END;
/

-- =================================================================================================
-- 5.2) Validação simples de acesso às views (sanidade)
-- =================================================================================================
DECLARE
  l_all NUMBER; l_run NUMBER;
BEGIN
  SELECT COUNT(*) INTO l_all FROM job_admin_all_jobs WHERE ROWNUM &lt;= 1;
  SELECT COUNT(*) INTO l_run FROM job_admin_running  WHERE ROWNUM &lt;= 1;
  DBMS_OUTPUT.PUT_LINE('Views acessíveis: JOB_ADMIN_ALL_JOBS e JOB_ADMIN_RUNNING OK.');
END;
/

PROMPT
PROMPT ── 6) Exemplos de Uso (para referência; copiar/colar quando necessário) …

PROMPT
PROMPT -- Inventário:
PROMPT BEGIN
PROMPT   pkg_job_admin.list_jobs;                          -- todos os jobs
PROMPT   pkg_job_admin.list_jobs('DEMOAPP');               -- por owner
PROMPT   pkg_job_admin.list_jobs(p_like =&gt; 'JOB_%');       -- por padrão (LIKE)
PROMPT END;
PROMPT /

PROMPT -- Em execução agora:
PROMPT BEGIN
PROMPT   pkg_job_admin.list_running_jobs;                       -- tudo
PROMPT   pkg_job_admin.list_running_jobs('DEMOAPP');            -- por owner
PROMPT   pkg_job_admin.list_running_jobs(p_like =&gt; 'SYNC_%');   -- por padrão (LIKE)
PROMPT END;
PROMPT /

PROMPT -- Operações pontuais:
PROMPT -- SCHEDULER (por nome; owner opcional se único no banco)
PROMPT -- BEGIN
PROMPT --   pkg_job_admin.disable_job('DEMOAPP.JOB_ATUALIZA_INDICES', p_stop_running =&gt; TRUE);
PROMPT --   pkg_job_admin.enable_job ('DEMOAPP.JOB_ATUALIZA_INDICES');
PROMPT -- END;
PROMPT -- /
PROMPT -- DBMS_JOB (por número; owner apenas para validar pertinência quando desejar)
PROMPT -- BEGIN
PROMPT --   pkg_job_admin.disable_job('128', p_owner =&gt; 'SYS', p_stop_running =&gt; TRUE);
PROMPT --   pkg_job_admin.enable_job ('128', p_owner =&gt; 'SYS');
PROMPT -- END;
PROMPT -- /

PROMPT -- Lote por padrão (por tipo):
PROMPT -- BEGIN
PROMPT --   pkg_job_admin.set_jobs_by_pattern(
PROMPT --     p_name_like    =&gt; 'JOB_SYNC_%',
PROMPT --     p_enable       =&gt; FALSE,
PROMPT --     p_owner        =&gt; 'DEMOAPP',
PROMPT --     p_type         =&gt; pkg_job_admin.c_type_scheduler, -- SCHEDULER | DBMS_JOB | ANY
PROMPT --     p_stop_running =&gt; TRUE
PROMPT --   );
PROMPT -- END;
PROMPT -- /

PROMPT -- Visões consolidadas:
PROMPT -- SELECT * FROM job_admin_all_jobs_v ORDER BY owner, job_type, job_name;
PROMPT -- SELECT * FROM job_admin_running_v  ORDER BY running_instance, job_type, job_name;

PROMPT
PROMPT ═════════════════════════════════════════════════════════════════════════════════════════════
PROMPT   Conclusão: job_admin_setup_completo.sql executado.
PROMPT   Para conceder a ROLE a um usuário final, utilize:
PROMPT     GRANT JOBDBMSSCHEDULERALL TO nome_do_usuario;
PROMPT ═════════════════════════════════════════════════════════════════════════════════════════════
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #6A9955">--  job_admin_setup_completo.sql</span></span>
<span class="line"><span style="color: #6A9955">--  Administração unificada de jobs no Oracle Database (DBMS_SCHEDULER e DBMS_JOB)</span></span>
<span class="line"><span style="color: #6A9955">--  Autor: Carlos Furushima — Furushima IT</span></span>
<span class="line"><span style="color: #6A9955">--  Direitos Autorais: Este script é propriedade intelectual de Furushima IT. Todos os direitos reservados.</span></span>
<span class="line"><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #6A9955">--  OBJETIVO</span></span>
<span class="line"><span style="color: #6A9955">--  --------</span></span>
<span class="line"><span style="color: #6A9955">--  Fornecer uma interface única, consistente e profissional para:</span></span>
<span class="line"><span style="color: #6A9955">--    • Inventariar jobs do SCHEDULER e do DBMS_JOB em visões consolidadas;</span></span>
<span class="line"><span style="color: #6A9955">--    • Consultar jobs em execução (tempo decorrido e sessão, quando aplicável);</span></span>
<span class="line"><span style="color: #6A9955">--    • Habilitar/Desabilitar jobs individualmente (por nome ou número);</span></span>
<span class="line"><span style="color: #6A9955">--    • Habilitar/Desabilitar em lote por padrão de nome;</span></span>
<span class="line"><span style="color: #6A9955">--    • Padronizar o consumo por meio de uma ROLE e sinônimos públicos.</span></span>
<span class="line"><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #6A9955">--  O QUE É CRIADO</span></span>
<span class="line"><span style="color: #6A9955">--  --------------</span></span>
<span class="line"><span style="color: #6A9955">--    Views:</span></span>
<span class="line"><span style="color: #6A9955">--      - JOB_ADMIN_ALL_JOBS      : inventário unificado (SCHEDULER + DBMS_JOB)</span></span>
<span class="line"><span style="color: #6A9955">--      - JOB_ADMIN_RUNNING       : execução unificada (SCHEDULER + DBMS_JOB)</span></span>
<span class="line"><span style="color: #6A9955">--      - JOB_ADMIN_ALL_JOBS_V    : inventário formatado para leitura humana</span></span>
<span class="line"><span style="color: #6A9955">--      - JOB_ADMIN_RUNNING_V     : execução formatada para leitura humana</span></span>
<span class="line"><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #6A9955">--    Pacote:</span></span>
<span class="line"><span style="color: #6A9955">--      - PKG_JOB_ADMIN           : utilitários de listagem e (des)ativação unificada</span></span>
<span class="line"><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #6A9955">--    Segurança e Acesso:</span></span>
<span class="line"><span style="color: #6A9955">--      - ROLE JOBDBMSSCHEDULERALL com grants de SELECT/EXECUTE</span></span>
<span class="line"><span style="color: #6A9955">--      - Sinônimos públicos para facilitar o uso por quem tiver a ROLE</span></span>
<span class="line"><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #6A9955">--  PRÉ-REQUISITOS</span></span>
<span class="line"><span style="color: #6A9955">--  --------------</span></span>
<span class="line"><span style="color: #6A9955">--  • Executar com um usuário com privilégios para consultar dicionários DBA_* e GV$* e criar objetos.</span></span>
<span class="line"><span style="color: #6A9955">--  • O pacote é AUTHID DEFINER (permissões do dono do pacote). Usuários finais só precisam da ROLE.</span></span>
<span class="line"><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #6A9955">--  USO TÍPICO</span></span>
<span class="line"><span style="color: #6A9955">--  ----------</span></span>
<span class="line"><span style="color: #6A9955">--  -- Inventário:</span></span>
<span class="line"><span style="color: #6A9955">--  BEGIN</span></span>
<span class="line"><span style="color: #6A9955">--    pkg_job_admin.list_jobs;                       -- tudo</span></span>
<span class="line"><span style="color: #6A9955">--    pkg_job_admin.list_jobs(&#39;DEMOAPP&#39;);            -- por owner</span></span>
<span class="line"><span style="color: #6A9955">--    pkg_job_admin.list_jobs(p_like =&gt; &#39;JOB_%&#39;);    -- por padrão (LIKE)</span></span>
<span class="line"><span style="color: #6A9955">--  END;</span></span>
<span class="line"><span style="color: #6A9955">--  /</span></span>
<span class="line"><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #6A9955">--  -- Executando agora:</span></span>
<span class="line"><span style="color: #6A9955">--  BEGIN</span></span>
<span class="line"><span style="color: #6A9955">--    pkg_job_admin.list_running_jobs;                       -- tudo</span></span>
<span class="line"><span style="color: #6A9955">--    pkg_job_admin.list_running_jobs(&#39;DEMOAPP&#39;);            -- por owner</span></span>
<span class="line"><span style="color: #6A9955">--    pkg_job_admin.list_running_jobs(p_like =&gt; &#39;SYNC_%&#39;);   -- por padrão (LIKE)</span></span>
<span class="line"><span style="color: #6A9955">--  END;</span></span>
<span class="line"><span style="color: #6A9955">--  /</span></span>
<span class="line"><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #6A9955">--  -- Operações pontuais:</span></span>
<span class="line"><span style="color: #6A9955">--  -- SCHEDULER (identificador por nome, owner opcional se único no banco)</span></span>
<span class="line"><span style="color: #6A9955">--  -- BEGIN</span></span>
<span class="line"><span style="color: #6A9955">--  --   pkg_job_admin.disable_job(&#39;DEMOAPP.JOB_ATUALIZA_INDICES&#39;, p_stop_running =&gt; TRUE);</span></span>
<span class="line"><span style="color: #6A9955">--  --   pkg_job_admin.enable_job (&#39;DEMOAPP.JOB_ATUALIZA_INDICES&#39;);</span></span>
<span class="line"><span style="color: #6A9955">--  -- END;</span></span>
<span class="line"><span style="color: #6A9955">--  -- /</span></span>
<span class="line"><span style="color: #6A9955">--  --</span></span>
<span class="line"><span style="color: #6A9955">--  -- DBMS_JOB (identificador numérico; owner opcional apenas para validar pertinência)</span></span>
<span class="line"><span style="color: #6A9955">--  -- BEGIN</span></span>
<span class="line"><span style="color: #6A9955">--  --   pkg_job_admin.disable_job(&#39;128&#39;, p_owner =&gt; &#39;SYS&#39;, p_stop_running =&gt; TRUE);</span></span>
<span class="line"><span style="color: #6A9955">--  --   pkg_job_admin.enable_job (&#39;128&#39;, p_owner =&gt; &#39;SYS&#39;);</span></span>
<span class="line"><span style="color: #6A9955">--  -- END;</span></span>
<span class="line"><span style="color: #6A9955">--  -- /</span></span>
<span class="line"><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #6A9955">--  -- Lote por padrão (por tipo):</span></span>
<span class="line"><span style="color: #6A9955">--  -- BEGIN</span></span>
<span class="line"><span style="color: #6A9955">--  --   pkg_job_admin.set_jobs_by_pattern(</span></span>
<span class="line"><span style="color: #6A9955">--  --     p_name_like    =&gt; &#39;JOB_SYNC_%&#39;,</span></span>
<span class="line"><span style="color: #6A9955">--  --     p_enable       =&gt; FALSE,                               -- desativar</span></span>
<span class="line"><span style="color: #6A9955">--  --     p_owner        =&gt; &#39;DEMOAPP&#39;,                           -- opcional</span></span>
<span class="line"><span style="color: #6A9955">--  --     p_type         =&gt; pkg_job_admin.c_type_scheduler,      -- SCHEDULER | DBMS_JOB | ANY</span></span>
<span class="line"><span style="color: #6A9955">--  --     p_stop_running =&gt; TRUE</span></span>
<span class="line"><span style="color: #6A9955">--  --   );</span></span>
<span class="line"><span style="color: #6A9955">--  -- END;</span></span>
<span class="line"><span style="color: #6A9955">--  -- /</span></span>
<span class="line"><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #6A9955">--  DICAS</span></span>
<span class="line"><span style="color: #6A9955">--  -----</span></span>
<span class="line"><span style="color: #6A9955">--  • O script é idempotente (CREATE OR REPLACE; checagens seguras). Pode ser executado mais de uma vez.</span></span>
<span class="line"><span style="color: #6A9955">--  • Saída “limpa”: mensagens organizadas por PROMPT/DBMS_OUTPUT para auditoria e documentação.</span></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">SET</span><span style="color: #D4D4D4"> FEEDBACK </span><span style="color: #569CD6">ON</span></span>
<span class="line"><span style="color: #569CD6">SET</span><span style="color: #D4D4D4"> SERVEROUTPUT </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SIZE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">UNLIMITED</span></span>
<span class="line"><span style="color: #569CD6">SET</span><span style="color: #D4D4D4"> VERIFY </span><span style="color: #569CD6">OFF</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ═════════════════════════════════════════════════════════════════════════════════════════════</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT   Iniciando job_admin_setup_completo.sql</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ═════════════════════════════════════════════════════════════════════════════════════════════</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- -----------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">-- 0) CONTEXTO — Mostra o usuário (owner) sob o qual os objetos serão criados</span></span>
<span class="line"><span style="color: #6A9955">-- -----------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #569CD6">DECLARE</span></span>
<span class="line"><span style="color: #D4D4D4">  l_user </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">) := USER;</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  DBMS_OUTPUT.PUT_LINE(</span><span style="color: #CE9178">&#39;Owner atual: &#39;</span><span style="color: #D4D4D4">||l_user);</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ── </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">) Criando/Atualizando Views Consolidadas …</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- ===============================================================================================</span></span>
<span class="line"><span style="color: #6A9955">-- 1.1) JOB_ADMIN_ALL_JOBS</span></span>
<span class="line"><span style="color: #6A9955">--      Consolida em uma única visão os jobs do DBMS_SCHEDULER e do DBMS_JOB.</span></span>
<span class="line"><span style="color: #6A9955">--      Observações de tipos:</span></span>
<span class="line"><span style="color: #6A9955">--        • next_run_date / last_start_date: TIMESTAMP WITH TIME ZONE (SCHEDULER) x DATE (DBMS_JOB)</span></span>
<span class="line"><span style="color: #6A9955">--          -&gt; o Oracle promove DATE para TIMESTAMP durante o UNION ALL (sem perda de funcionalidade).</span></span>
<span class="line"><span style="color: #6A9955">--        • last_run_duration: INTERVAL no SCHEDULER; CAST de NULL para INTERVAL no DBMS_JOB.</span></span>
<span class="line"><span style="color: #6A9955">--        • job_action / repeat_interval: normalizados para VARCHAR2 (até 4000) no DBMS_JOB.</span></span>
<span class="line"><span style="color: #6A9955">-- ===============================================================================================</span></span>
<span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VIEW</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">job_admin_all_jobs</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">           job_name,</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #CE9178">&#39;SCHEDULER&#39;</span><span style="color: #D4D4D4">               </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> job_type,</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #569CD6">CASE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;TRUE&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;TRUE&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ELSE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;FALSE&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #569CD6">state</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">           next_run_date,                                </span><span style="color: #6A9955">-- TIMESTAMP WITH TIME ZONE</span></span>
<span class="line"><span style="color: #D4D4D4">           last_start_date,                              </span><span style="color: #6A9955">-- TIMESTAMP WITH TIME ZONE</span></span>
<span class="line"><span style="color: #D4D4D4">           last_run_duration,                            </span><span style="color: #6A9955">-- INTERVAL DAY TO SECOND</span></span>
<span class="line"><span style="color: #D4D4D4">           job_action,                                   </span><span style="color: #6A9955">-- VARCHAR2/CLOB (na maioria dos casos, até 4000)</span></span>
<span class="line"><span style="color: #D4D4D4">           repeat_interval                               </span><span style="color: #6A9955">-- VARCHAR2</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_scheduler_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">UNION ALL</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> schema_user                                   </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">           TO_CHAR(job)                                  </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> job_name,</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #CE9178">&#39;DBMS_JOB&#39;</span><span style="color: #D4D4D4">                                    </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> job_type,</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #569CD6">CASE</span><span style="color: #D4D4D4"> broken </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;Y&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;FALSE&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ELSE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;TRUE&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #DCDCAA">CAST</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">30</span><span style="color: #D4D4D4">))                    </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">state</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">           next_date,                                    </span><span style="color: #6A9955">-- DATE (promovido a TIMESTAMP no UNION)</span></span>
<span class="line"><span style="color: #D4D4D4">           last_date                                     </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> last_start_date, </span><span style="color: #6A9955">-- DATE</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #DCDCAA">CAST</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> INTERVAL </span><span style="color: #569CD6">DAY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TO</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SECOND</span><span style="color: #D4D4D4">)          </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> last_run_duration,</span></span>
<span class="line"><span style="color: #D4D4D4">           SUBSTR(what,     </span><span style="color: #B5CEA8">4000</span><span style="color: #D4D4D4">)                        </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> job_action,      </span><span style="color: #6A9955">-- LONG -&gt; VARCHAR2</span></span>
<span class="line"><span style="color: #D4D4D4">           SUBSTR(interval, </span><span style="color: #B5CEA8">4000</span><span style="color: #D4D4D4">)                        </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> repeat_interval  </span><span style="color: #6A9955">-- LONG -&gt; VARCHAR2</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- ===============================================================================================</span></span>
<span class="line"><span style="color: #6A9955">-- 1.2) JOB_ADMIN_RUNNING</span></span>
<span class="line"><span style="color: #6A9955">--      Consolida os jobs em execução. Para DBMS_JOB, calcula elapsed pelo logon_time da sessão.</span></span>
<span class="line"><span style="color: #6A9955">--      Observações:</span></span>
<span class="line"><span style="color: #6A9955">--        • cpu_used não se aplica ao DBMS_JOB; representa-se com NULL (cast para INTERVAL).</span></span>
<span class="line"><span style="color: #6A9955">-- ===============================================================================================</span></span>
<span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VIEW</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">job_admin_running</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">           job_name,</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #CE9178">&#39;SCHEDULER&#39;</span><span style="color: #D4D4D4">               </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> job_type,</span></span>
<span class="line"><span style="color: #D4D4D4">           session_id,</span></span>
<span class="line"><span style="color: #D4D4D4">           running_instance,</span></span>
<span class="line"><span style="color: #D4D4D4">           elapsed_time,                                 </span><span style="color: #6A9955">-- INTERVAL</span></span>
<span class="line"><span style="color: #D4D4D4">           cpu_used                                      </span><span style="color: #6A9955">-- INTERVAL</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_scheduler_running_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">UNION ALL</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> j.schema_user           </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">           TO_CHAR(r.job)          </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> job_name,</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #CE9178">&#39;DBMS_JOB&#39;</span><span style="color: #D4D4D4">              </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> job_type,</span></span>
<span class="line"><span style="color: #D4D4D4">           r.sid                   </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> session_id,</span></span>
<span class="line"><span style="color: #D4D4D4">           s.inst_id               </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> running_instance,</span></span>
<span class="line"><span style="color: #D4D4D4">           NUMTODSINTERVAL(TRUNC((</span><span style="color: #569CD6">SYSDATE</span><span style="color: #D4D4D4"> - s.logon_time)*</span><span style="color: #B5CEA8">86400</span><span style="color: #D4D4D4">),</span><span style="color: #CE9178">&#39;SECOND&#39;</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> elapsed_time,</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #DCDCAA">CAST</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> INTERVAL </span><span style="color: #569CD6">DAY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TO</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SECOND</span><span style="color: #D4D4D4">)          </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> cpu_used</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_jobs_running r</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">JOIN</span><span style="color: #D4D4D4"> gv$</span><span style="color: #569CD6">session</span><span style="color: #D4D4D4"> s </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> s.sid = r.sid</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">JOIN</span><span style="color: #D4D4D4"> dba_jobs j   </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> j.job = r.job</span></span>
<span class="line"><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- ===============================================================================================</span></span>
<span class="line"><span style="color: #6A9955">-- 1.3) JOB_ADMIN_ALL_JOBS_V — Versão “amigável” (formatos para leitura humana)</span></span>
<span class="line"><span style="color: #6A9955">-- ===============================================================================================</span></span>
<span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VIEW</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">job_admin_all_jobs_v</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span></span>
<span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_name, job_type, </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">state</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">       TO_CHAR(next_run_date,</span><span style="color: #CE9178">&#39;YYYY-MM-DD HH24:MI:SS&#39;</span><span style="color: #D4D4D4">)      </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> next_run_date,</span></span>
<span class="line"><span style="color: #D4D4D4">       TO_CHAR(last_start_date,</span><span style="color: #CE9178">&#39;YYYY-MM-DD HH24:MI:SS&#39;</span><span style="color: #D4D4D4">)    </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> last_start_date,</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">CASE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> last_run_duration </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;-&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ELSE</span></span>
<span class="line"><span style="color: #D4D4D4">         EXTRACT(</span><span style="color: #569CD6">DAY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> last_run_duration)||</span><span style="color: #CE9178">&#39; &#39;</span><span style="color: #D4D4D4">||</span></span>
<span class="line"><span style="color: #D4D4D4">         LPAD(EXTRACT(</span><span style="color: #569CD6">HOUR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> last_run_duration),</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">)||</span><span style="color: #CE9178">&#39;:&#39;</span><span style="color: #D4D4D4">||</span></span>
<span class="line"><span style="color: #D4D4D4">         LPAD(EXTRACT(</span><span style="color: #569CD6">MINUTE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> last_run_duration),</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">)||</span><span style="color: #CE9178">&#39;:&#39;</span><span style="color: #D4D4D4">||</span></span>
<span class="line"><span style="color: #D4D4D4">         LPAD(TRUNC(EXTRACT(</span><span style="color: #569CD6">SECOND</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> last_run_duration)),</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> last_run_duration,</span></span>
<span class="line"><span style="color: #D4D4D4">       job_action, repeat_interval</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> job_admin_all_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- ===============================================================================================</span></span>
<span class="line"><span style="color: #6A9955">-- 1.4) JOB_ADMIN_RUNNING_V — Versão “amigável” (formatos para leitura humana)</span></span>
<span class="line"><span style="color: #6A9955">-- ===============================================================================================</span></span>
<span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VIEW</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">job_admin_running_v</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span></span>
<span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_name, job_type, session_id, running_instance,</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">CASE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> elapsed_time </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;-&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ELSE</span></span>
<span class="line"><span style="color: #D4D4D4">         EXTRACT(</span><span style="color: #569CD6">DAY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> elapsed_time)||</span><span style="color: #CE9178">&#39; &#39;</span><span style="color: #D4D4D4">||</span></span>
<span class="line"><span style="color: #D4D4D4">         LPAD(EXTRACT(</span><span style="color: #569CD6">HOUR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> elapsed_time),</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">)||</span><span style="color: #CE9178">&#39;:&#39;</span><span style="color: #D4D4D4">||</span></span>
<span class="line"><span style="color: #D4D4D4">         LPAD(EXTRACT(</span><span style="color: #569CD6">MINUTE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> elapsed_time),</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">)||</span><span style="color: #CE9178">&#39;:&#39;</span><span style="color: #D4D4D4">||</span></span>
<span class="line"><span style="color: #D4D4D4">         LPAD(TRUNC(EXTRACT(</span><span style="color: #569CD6">SECOND</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> elapsed_time)),</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> elapsed_time,</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">CASE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> cpu_used </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;-&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ELSE</span></span>
<span class="line"><span style="color: #D4D4D4">         EXTRACT(</span><span style="color: #569CD6">DAY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> cpu_used)||</span><span style="color: #CE9178">&#39; &#39;</span><span style="color: #D4D4D4">||</span></span>
<span class="line"><span style="color: #D4D4D4">         LPAD(EXTRACT(</span><span style="color: #569CD6">HOUR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> cpu_used),</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">)||</span><span style="color: #CE9178">&#39;:&#39;</span><span style="color: #D4D4D4">||</span></span>
<span class="line"><span style="color: #D4D4D4">         LPAD(EXTRACT(</span><span style="color: #569CD6">MINUTE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> cpu_used),</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">)||</span><span style="color: #CE9178">&#39;:&#39;</span><span style="color: #D4D4D4">||</span></span>
<span class="line"><span style="color: #D4D4D4">         LPAD(TRUNC(EXTRACT(</span><span style="color: #569CD6">SECOND</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> cpu_used)),</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> cpu_used</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> job_admin_running</span></span>
<span class="line"><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ✓ Views criadas/atualizadas com sucesso.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ── </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">) Criando/Atualizando Pacote (SPEC) …</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #6A9955">-- 2) ESPECIFICAÇÃO DO PACOTE — PKG_JOB_ADMIN</span></span>
<span class="line"><span style="color: #6A9955">--    Contém constantes de tipo e procedimentos públicos de listagem e (des)ativação unificada.</span></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #569CD6">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">REPLACE</span><span style="color: #D4D4D4"> PACKAGE pkg_job_admin AUTHID DEFINER </span><span style="color: #569CD6">AS</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Constantes para filtro por tipo</span></span>
<span class="line"><span style="color: #D4D4D4">  c_type_scheduler CONSTANT </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">11</span><span style="color: #D4D4D4">) := </span><span style="color: #CE9178">&#39;SCHEDULER&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  c_type_dbms_job  CONSTANT </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">8</span><span style="color: #D4D4D4">)  := </span><span style="color: #CE9178">&#39;DBMS_JOB&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  c_type_any       CONSTANT </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">)  := </span><span style="color: #CE9178">&#39;ANY&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Listagem de jobs (inventário)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> list_jobs(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">,   </span><span style="color: #6A9955">-- filtra por owner</span></span>
<span class="line"><span style="color: #D4D4D4">    p_like  </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">    </span><span style="color: #6A9955">-- filtra por padrão (LIKE)</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Listagem de jobs em execução</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> list_running_jobs(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">,   </span><span style="color: #6A9955">-- filtra por owner</span></span>
<span class="line"><span style="color: #D4D4D4">    p_like  </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">    </span><span style="color: #6A9955">-- filtra por padrão (LIKE)</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Habilita/Desabilita um job (identificador por nome SCHEDULER ou número DBMS_JOB)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> set_job_enabled(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_job_identifier </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,       </span><span style="color: #6A9955">-- &#39;OWNER.JOB_NAME&#39; | &#39;JOB_NAME&#39; | &#39;123&#39; (DBMS_JOB)</span></span>
<span class="line"><span style="color: #D4D4D4">    p_enable         </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">BOOLEAN</span><span style="color: #D4D4D4">,        </span><span style="color: #6A9955">-- TRUE = ENABLE; FALSE = DISABLE</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner          </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">,  </span><span style="color: #6A9955">-- para SCHEDULER sem owner único ou DBMS_JOB para validar owner</span></span>
<span class="line"><span style="color: #D4D4D4">    p_stop_running   </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">BOOLEAN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> FALSE   </span><span style="color: #6A9955">-- encerra execução corrente (se houver)</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Açúcares sintáticos (conveniências)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> enable_job(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_job_identifier </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner          </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_stop_running   </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">BOOLEAN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> FALSE</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> disable_job(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_job_identifier </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner          </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_stop_running   </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">BOOLEAN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> TRUE</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Habilita/Desabilita em lote por padrão de nome e tipo</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> set_jobs_by_pattern(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_name_like     </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,                      </span><span style="color: #6A9955">-- ex: &#39;JOB_SYNC_%&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    p_enable        </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">BOOLEAN</span><span style="color: #D4D4D4">,                       </span><span style="color: #6A9955">-- TRUE/FALSE</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner         </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">,         </span><span style="color: #6A9955">-- opcional</span></span>
<span class="line"><span style="color: #D4D4D4">    p_type          </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> c_type_any,   </span><span style="color: #6A9955">-- SCHEDULER | DBMS_JOB | ANY</span></span>
<span class="line"><span style="color: #D4D4D4">    p_stop_running  </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">BOOLEAN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> FALSE</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> pkg_job_admin;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"><span style="color: #D4D4D4">SHOW ERRORS</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ── </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">) Criando/Atualizando Pacote (BODY) …</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #6A9955">-- 3) CORPO DO PACOTE — PKG_JOB_ADMIN</span></span>
<span class="line"><span style="color: #6A9955">--    Implementa utilitários de formatação, detecção de owner/instância, e operações de controle.</span></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #569CD6">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">REPLACE</span><span style="color: #D4D4D4"> PACKAGE BODY pkg_job_admin </span><span style="color: #569CD6">AS</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Função auxiliar: formata INTERVAL DAY TO SECOND em &#39;DD HH24:MI:SS&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> fmt_ds(p INTERVAL </span><span style="color: #569CD6">DAY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TO</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SECOND</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">    l_day  PLS_INTEGER; l_hour PLS_INTEGER; l_min PLS_INTEGER; l_sec PLS_INTEGER;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> p </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;-&#39;</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    l_day  := EXTRACT(</span><span style="color: #569CD6">DAY</span><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> p);</span></span>
<span class="line"><span style="color: #D4D4D4">    l_hour := EXTRACT(</span><span style="color: #569CD6">HOUR</span><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> p);</span></span>
<span class="line"><span style="color: #D4D4D4">    l_min  := EXTRACT(</span><span style="color: #569CD6">MINUTE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> p);</span></span>
<span class="line"><span style="color: #D4D4D4">    l_sec  := TRUNC(EXTRACT(</span><span style="color: #569CD6">SECOND</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> p));</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> LPAD(l_day,</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">)||</span><span style="color: #CE9178">&#39; &#39;</span><span style="color: #D4D4D4">||LPAD(l_hour,</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">)||</span><span style="color: #CE9178">&#39;:&#39;</span><span style="color: #D4D4D4">||LPAD(l_min,</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">)||</span><span style="color: #CE9178">&#39;:&#39;</span><span style="color: #D4D4D4">||LPAD(l_sec,</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;0&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> fmt_ds;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Função auxiliar: TO_CHAR seguro para datas que podem ser NULL (retorna &#39;-&#39; no NULL)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> to_char_nvl(p_date </span><span style="color: #569CD6">DATE</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">CASE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> p_date </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;-&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ELSE</span><span style="color: #D4D4D4"> TO_CHAR(p_date,</span><span style="color: #CE9178">&#39;YYYY-MM-DD HH24:MI:SS&#39;</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Monta o nome totalmente qualificado do job de SCHEDULER</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> sched_job_fqname(p_owner </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">, p_job_name </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">CASE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> p_owner </span><span style="color: #569CD6">IS NOT NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_owner)||</span><span style="color: #CE9178">&#39;.&#39;</span><span style="color: #D4D4D4">||</span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_job_name) </span><span style="color: #569CD6">ELSE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_job_name) </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Solicita parada de job SCHEDULER, se estiver em execução (silencioso em falhas)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> stop_scheduler_if_running(p_owner </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">, p_job_name </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">    l_fq </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">261</span><span style="color: #D4D4D4">) := sched_job_fqname(p_owner, p_job_name);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    DBMS_SCHEDULER.STOP_JOB(job_name =&gt; l_fq, </span><span style="color: #569CD6">force</span><span style="color: #D4D4D4"> =&gt; TRUE);</span></span>
<span class="line"><span style="color: #D4D4D4">  EXCEPTION</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> OTHERS </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Encerra sessão de DBMS_JOB, se houver (suporte RAC com @inst_id)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> kill_dbms_job_session(p_job_id </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NUMBER</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">    l_sid     </span><span style="color: #569CD6">NUMBER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    l_serial  </span><span style="color: #569CD6">NUMBER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    l_inst    </span><span style="color: #569CD6">NUMBER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    l_stmt    </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> s.sid, s.serial#, s.inst_id</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">INTO</span><span style="color: #D4D4D4"> l_sid, l_serial, l_inst</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_jobs_running r</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">JOIN</span><span style="color: #D4D4D4"> gv$</span><span style="color: #569CD6">session</span><span style="color: #D4D4D4"> s </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> s.sid = r.sid</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> r.job = p_job_id</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> ROWNUM = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    l_stmt := </span><span style="color: #CE9178">&#39;ALTER SYSTEM KILL SESSION &#39;&#39;&#39;</span><span style="color: #D4D4D4">||l_sid||</span><span style="color: #CE9178">&#39;,&#39;</span><span style="color: #D4D4D4">||l_serial||</span></span>
<span class="line"><span style="color: #D4D4D4">              </span><span style="color: #569CD6">CASE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> l_inst </span><span style="color: #569CD6">IS NOT NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;,@&#39;</span><span style="color: #D4D4D4">||l_inst </span><span style="color: #569CD6">ELSE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">||</span><span style="color: #CE9178">&#39;&#39;&#39; IMMEDIATE&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">EXECUTE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IMMEDIATE</span><span style="color: #D4D4D4"> l_stmt;</span></span>
<span class="line"><span style="color: #D4D4D4">  EXCEPTION</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> NO_DATA_FOUND </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> OTHERS </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Resolve owner de job SCHEDULER quando usuário não informou p_owner</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Lança erro se não encontrado ou se existir em múltiplos owners.</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> resolve_scheduler(p_owner </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">, p_job_name </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                              o_owner </span><span style="color: #569CD6">OUT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">, o_job_name </span><span style="color: #569CD6">OUT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">    l_cnt </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    o_job_name := </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_job_name);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> p_owner </span><span style="color: #569CD6">IS NOT NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> o_owner := </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_owner); </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">COUNT</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">DISTINCT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">INTO</span><span style="color: #D4D4D4"> l_cnt</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_scheduler_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> job_name = o_job_name;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> l_cnt = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">      RAISE NO_DATA_FOUND;</span></span>
<span class="line"><span style="color: #D4D4D4">    ELSIF l_cnt &gt; </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">      RAISE_APPLICATION_ERROR(-</span><span style="color: #B5CEA8">20002</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;JOB_NAME existe em múltiplos owners. Informe p_owner. JOB_NAME=&#39;</span><span style="color: #D4D4D4">||o_job_name);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">ELSE</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTO</span><span style="color: #D4D4D4"> o_owner</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_scheduler_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> job_name = o_job_name</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> ROWNUM = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> resolve_scheduler;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Listagem: inventário unificado</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> list_jobs(p_owner </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">, p_like </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    DBMS_OUTPUT.PUT_LINE(</span><span style="color: #CE9178">&#39;=== JOBS (SCHEDULER) ===&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FOR</span><span style="color: #D4D4D4"> r </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_name, </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">state</span><span style="color: #D4D4D4">, next_run_date, job_action</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_scheduler_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> (p_owner </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_owner))</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> (p_like  </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> job_name </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_like))</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_name</span></span>
<span class="line"><span style="color: #D4D4D4">    ) </span><span style="color: #569CD6">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">      DBMS_OUTPUT.PUT_LINE(r.owner||</span><span style="color: #CE9178">&#39;.&#39;</span><span style="color: #D4D4D4">||r.job_name||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | enabled=&#39;</span><span style="color: #D4D4D4">||r.enabled||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | state=&#39;</span><span style="color: #D4D4D4">||NVL(r.state,</span><span style="color: #CE9178">&#39;-&#39;</span><span style="color: #D4D4D4">)||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | next=&#39;</span><span style="color: #D4D4D4">||to_char_nvl(</span><span style="color: #DCDCAA">CAST</span><span style="color: #D4D4D4">(r.next_run_date </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DATE</span><span style="color: #D4D4D4">))||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | action=&#39;</span><span style="color: #D4D4D4">||SUBSTR(r.job_action,</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">,</span><span style="color: #B5CEA8">60</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">LOOP</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    DBMS_OUTPUT.PUT_LINE(CHR(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">)||</span><span style="color: #CE9178">&#39;=== JOBS (DBMS_JOB) ===&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FOR</span><span style="color: #D4D4D4"> r </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> schema_user </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> job_id, DECODE(broken,</span><span style="color: #CE9178">&#39;Y&#39;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;FALSE&#39;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;TRUE&#39;</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">enabled</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">             next_date, what</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> (p_owner </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> schema_user = </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_owner))</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> (p_like  </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> TO_CHAR(job) </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> p_like </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(what) </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_like))</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> schema_user, job</span></span>
<span class="line"><span style="color: #D4D4D4">    ) </span><span style="color: #569CD6">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">      DBMS_OUTPUT.PUT_LINE(r.owner||</span><span style="color: #CE9178">&#39;.&#39;</span><span style="color: #D4D4D4">||r.job_id||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | enabled=&#39;</span><span style="color: #D4D4D4">||r.enabled||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | next=&#39;</span><span style="color: #D4D4D4">||to_char_nvl(r.next_date)||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | what=&#39;</span><span style="color: #D4D4D4">||SUBSTR(r.what,</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">,</span><span style="color: #B5CEA8">60</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">LOOP</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> list_jobs;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Listagem: execução unificada</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> list_running_jobs(p_owner </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">, p_like </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    DBMS_OUTPUT.PUT_LINE(</span><span style="color: #CE9178">&#39;=== RUNNING (SCHEDULER) ===&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FOR</span><span style="color: #D4D4D4"> r </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_name, session_id, running_instance, elapsed_time, cpu_used</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_scheduler_running_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> (p_owner </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_owner))</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> (p_like  </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> job_name </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_like))</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> running_instance, job_name</span></span>
<span class="line"><span style="color: #D4D4D4">    ) </span><span style="color: #569CD6">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">      DBMS_OUTPUT.PUT_LINE(r.owner||</span><span style="color: #CE9178">&#39;.&#39;</span><span style="color: #D4D4D4">||r.job_name||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | sid=&#39;</span><span style="color: #D4D4D4">||r.session_id||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | inst=&#39;</span><span style="color: #D4D4D4">||r.running_instance||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | elapsed=&#39;</span><span style="color: #D4D4D4">||fmt_ds(r.elapsed_time)||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | cpu=&#39;</span><span style="color: #D4D4D4">||fmt_ds(r.cpu_used));</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">LOOP</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    DBMS_OUTPUT.PUT_LINE(CHR(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">)||</span><span style="color: #CE9178">&#39;=== RUNNING (DBMS_JOB) ===&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FOR</span><span style="color: #D4D4D4"> r </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> j.schema_user </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, r.job </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> job_id, s.sid, s.serial#,</span></span>
<span class="line"><span style="color: #D4D4D4">             s.inst_id </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> running_instance,</span></span>
<span class="line"><span style="color: #D4D4D4">             NUMTODSINTERVAL(TRUNC((</span><span style="color: #569CD6">SYSDATE</span><span style="color: #D4D4D4"> - s.logon_time)*</span><span style="color: #B5CEA8">86400</span><span style="color: #D4D4D4">),</span><span style="color: #CE9178">&#39;SECOND&#39;</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> elapsed_time,</span></span>
<span class="line"><span style="color: #D4D4D4">             j.what</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_jobs_running r</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">JOIN</span><span style="color: #D4D4D4"> gv$</span><span style="color: #569CD6">session</span><span style="color: #D4D4D4"> s </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> s.sid = r.sid</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">JOIN</span><span style="color: #D4D4D4"> dba_jobs j   </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> j.job = r.job</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> (p_owner </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> j.schema_user = </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_owner))</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> (p_like  </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> TO_CHAR(r.job) </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> p_like </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(j.what) </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_like))</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> running_instance, job_id</span></span>
<span class="line"><span style="color: #D4D4D4">    ) </span><span style="color: #569CD6">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">      DBMS_OUTPUT.PUT_LINE(r.owner||</span><span style="color: #CE9178">&#39;.&#39;</span><span style="color: #D4D4D4">||r.job_id||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | sid=&#39;</span><span style="color: #D4D4D4">||r.sid||</span><span style="color: #CE9178">&#39;,&#39;</span><span style="color: #D4D4D4">||r.serial#||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | inst=&#39;</span><span style="color: #D4D4D4">||r.running_instance||</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #CE9178">&#39; | elapsed=&#39;</span><span style="color: #D4D4D4">||fmt_ds(r.elapsed_time));</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">LOOP</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> list_running_jobs;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Núcleo: habilita/desabilita por identificador (nome SCHEDULER ou número DBMS_JOB)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> set_job_enabled(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_job_identifier </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_enable         </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">BOOLEAN</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner          </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_stop_running   </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">BOOLEAN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> FALSE</span></span>
<span class="line"><span style="color: #D4D4D4">  ) </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">    l_owner    </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    l_job_name </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    l_job_id   </span><span style="color: #569CD6">NUMBER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">-- 1) Tentar SCHEDULER (nome)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> REGEXP_LIKE(p_job_identifier,</span><span style="color: #CE9178">&#39;^\d+$&#39;</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> RAISE NO_DATA_FOUND; </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> INSTR(p_job_identifier,</span><span style="color: #CE9178">&#39;.&#39;</span><span style="color: #D4D4D4">) &gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">        l_owner    := </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(REGEXP_SUBSTR(p_job_identifier,</span><span style="color: #CE9178">&#39;^([^\.]+)&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">        l_job_name := </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(REGEXP_SUBSTR(p_job_identifier,</span><span style="color: #CE9178">&#39;\.([^\.]+)$&#39;</span><span style="color: #D4D4D4">,</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">,</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">,</span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">,</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">ELSE</span></span>
<span class="line"><span style="color: #D4D4D4">        l_job_name := </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_job_identifier);</span></span>
<span class="line"><span style="color: #D4D4D4">        resolve_scheduler(p_owner, l_job_name, l_owner, l_job_name);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- valida existência</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">DECLARE</span><span style="color: #D4D4D4"> l_dummy PLS_INTEGER;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTO</span><span style="color: #D4D4D4"> l_dummy</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_scheduler_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4"> = l_owner </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> job_name = l_job_name </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> ROWNUM = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> p_stop_running </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">        stop_scheduler_if_running(l_owner, l_job_name);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> p_enable </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">        DBMS_SCHEDULER.ENABLE( sched_job_fqname(l_owner, l_job_name) );</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">ELSE</span></span>
<span class="line"><span style="color: #D4D4D4">        DBMS_SCHEDULER.DISABLE( sched_job_fqname(l_owner, l_job_name) );</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      DBMS_OUTPUT.PUT_LINE(</span><span style="color: #CE9178">&#39;OK (SCHEDULER) &#39;</span><span style="color: #D4D4D4">||</span></span>
<span class="line"><span style="color: #D4D4D4">        sched_job_fqname(l_owner,l_job_name)||</span><span style="color: #CE9178">&#39; =&gt; &#39;</span><span style="color: #D4D4D4">||</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">CASE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> p_enable </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;ENABLED&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ELSE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;DISABLED&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    EXCEPTION</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> NO_DATA_FOUND </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">; </span><span style="color: #6A9955">-- não era scheduler; tentar DBMS_JOB</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">-- 2) Tentar DBMS_JOB (número)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">      l_job_id := TO_NUMBER(</span><span style="color: #DCDCAA">TRIM</span><span style="color: #D4D4D4">(p_job_identifier));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- valida existência (restringe owner se informado)</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">DECLARE</span><span style="color: #D4D4D4"> l_dummy2 PLS_INTEGER;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTO</span><span style="color: #D4D4D4"> l_dummy2</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> job = l_job_id</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> (p_owner </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> schema_user = </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_owner))</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> ROWNUM = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> p_stop_running </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">        kill_dbms_job_session(l_job_id);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      DBMS_JOB.BROKEN(l_job_id, </span><span style="color: #569CD6">NOT</span><span style="color: #D4D4D4"> p_enable);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      DBMS_OUTPUT.PUT_LINE(</span><span style="color: #CE9178">&#39;OK (DBMS_JOB) &#39;</span><span style="color: #D4D4D4">||l_job_id||</span><span style="color: #CE9178">&#39; =&gt; &#39;</span><span style="color: #D4D4D4">||</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">CASE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> p_enable </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;ENABLED&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ELSE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;DISABLED&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    EXCEPTION</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> VALUE_ERROR    </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> INVALID_NUMBER </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> NO_DATA_FOUND  </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">-- 3) Não encontrado em nenhuma modalidade</span></span>
<span class="line"><span style="color: #D4D4D4">    RAISE_APPLICATION_ERROR(-</span><span style="color: #B5CEA8">20001</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #CE9178">&#39;Job não encontrado como SCHEDULER (por nome) nem DBMS_JOB (por número): &#39;</span><span style="color: #D4D4D4">||p_job_identifier);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> set_job_enabled;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Açúcares sintáticos</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> enable_job(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_job_identifier </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner          </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_stop_running   </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">BOOLEAN</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> FALSE</span></span>
<span class="line"><span style="color: #D4D4D4">  ) </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    set_job_enabled(p_job_identifier =&gt; p_job_identifier,</span></span>
<span class="line"><span style="color: #D4D4D4">                    p_enable         =&gt; TRUE,</span></span>
<span class="line"><span style="color: #D4D4D4">                    p_owner          =&gt; p_owner,</span></span>
<span class="line"><span style="color: #D4D4D4">                    p_stop_running   =&gt; p_stop_running);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> disable_job(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_job_identifier </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner          </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_stop_running   </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">BOOLEAN</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> TRUE</span></span>
<span class="line"><span style="color: #D4D4D4">  ) </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    set_job_enabled(p_job_identifier =&gt; p_job_identifier,</span></span>
<span class="line"><span style="color: #D4D4D4">                    p_enable         =&gt; FALSE,</span></span>
<span class="line"><span style="color: #D4D4D4">                    p_owner          =&gt; p_owner,</span></span>
<span class="line"><span style="color: #D4D4D4">                    p_stop_running   =&gt; p_stop_running);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- Habilita/Desabilita em lote por padrão (LIKE) e, opcionalmente, por tipo</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- ---------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> set_jobs_by_pattern(</span></span>
<span class="line"><span style="color: #D4D4D4">    p_name_like     </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_enable        </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">BOOLEAN</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_owner         </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_type          </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> c_type_any,</span></span>
<span class="line"><span style="color: #D4D4D4">    p_stop_running  </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">BOOLEAN</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> FALSE</span></span>
<span class="line"><span style="color: #D4D4D4">  ) </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">-- SCHEDULER</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_type) </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> (c_type_any, c_type_scheduler) </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">FOR</span><span style="color: #D4D4D4"> r </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job_name</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_scheduler_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> (p_owner </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_owner))</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> job_name </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_name_like)</span></span>
<span class="line"><span style="color: #D4D4D4">      ) </span><span style="color: #569CD6">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">        set_job_enabled(r.owner||</span><span style="color: #CE9178">&#39;.&#39;</span><span style="color: #D4D4D4">||r.job_name, p_enable, </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">, p_stop_running);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">LOOP</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">-- DBMS_JOB</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_type) </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> (c_type_any, c_type_dbms_job) </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">FOR</span><span style="color: #D4D4D4"> r </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> schema_user </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, job</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_jobs</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> (p_owner </span><span style="color: #569CD6">IS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> schema_user = </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_owner))</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> (TO_CHAR(job) </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> p_name_like </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(what) </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UPPER</span><span style="color: #D4D4D4">(p_name_like))</span></span>
<span class="line"><span style="color: #D4D4D4">      ) </span><span style="color: #569CD6">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">        set_job_enabled(TO_CHAR(r.job), p_enable, r.owner, p_stop_running);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">LOOP</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> set_jobs_by_pattern;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> pkg_job_admin;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"><span style="color: #D4D4D4">SHOW ERRORS</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ✓ Pacote criado/atualizado com sucesso.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ── </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">) Segurança: </span><span style="color: #569CD6">ROLE</span><span style="color: #D4D4D4">, Grants e Sinônimos Públicos …</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #6A9955">-- 4.1) ROLE — criada apenas se não existir</span></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #569CD6">DECLARE</span></span>
<span class="line"><span style="color: #D4D4D4">  l_cnt </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">COUNT</span><span style="color: #D4D4D4">(*) </span><span style="color: #569CD6">INTO</span><span style="color: #D4D4D4"> l_cnt </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_roles </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">role</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;JOBDBMSSCHEDULERALL&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> l_cnt = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">EXECUTE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IMMEDIATE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;CREATE ROLE JOBDBMSSCHEDULERALL&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    DBMS_OUTPUT.PUT_LINE(</span><span style="color: #CE9178">&#39;Role JOBDBMSSCHEDULERALL criada.&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">ELSE</span></span>
<span class="line"><span style="color: #D4D4D4">    DBMS_OUTPUT.PUT_LINE(</span><span style="color: #CE9178">&#39;Role JOBDBMSSCHEDULERALL já existente.&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #6A9955">-- 4.2) GRANTS — executar o pacote e consultar as views por meio da ROLE</span></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #569CD6">GRANT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">EXECUTE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> pkg_job_admin        </span><span style="color: #569CD6">TO</span><span style="color: #D4D4D4"> JOBDBMSSCHEDULERALL;</span></span>
<span class="line"><span style="color: #569CD6">GRANT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> job_admin_all_jobs   </span><span style="color: #569CD6">TO</span><span style="color: #D4D4D4"> JOBDBMSSCHEDULERALL;</span></span>
<span class="line"><span style="color: #569CD6">GRANT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> job_admin_running    </span><span style="color: #569CD6">TO</span><span style="color: #D4D4D4"> JOBDBMSSCHEDULERALL;</span></span>
<span class="line"><span style="color: #569CD6">GRANT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> job_admin_all_jobs_v </span><span style="color: #569CD6">TO</span><span style="color: #D4D4D4"> JOBDBMSSCHEDULERALL;</span></span>
<span class="line"><span style="color: #569CD6">GRANT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> job_admin_running_v  </span><span style="color: #569CD6">TO</span><span style="color: #D4D4D4"> JOBDBMSSCHEDULERALL;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #6A9955">-- 4.3) SINÔNIMOS PÚBLICOS — apontam para os objetos do OWNER atual</span></span>
<span class="line"><span style="color: #6A9955">--     Observação: garantem uso uniforme via “public synonyms” para quem tiver a ROLE.</span></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #569CD6">DECLARE</span></span>
<span class="line"><span style="color: #D4D4D4">  l_owner </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">) := USER;</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">EXECUTE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IMMEDIATE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;CREATE OR REPLACE PUBLIC SYNONYM job_admin_all_jobs   FOR &#39;</span><span style="color: #D4D4D4">||l_owner||</span><span style="color: #CE9178">&#39;.job_admin_all_jobs&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">EXECUTE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IMMEDIATE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;CREATE OR REPLACE PUBLIC SYNONYM job_admin_running    FOR &#39;</span><span style="color: #D4D4D4">||l_owner||</span><span style="color: #CE9178">&#39;.job_admin_running&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">EXECUTE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IMMEDIATE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;CREATE OR REPLACE PUBLIC SYNONYM job_admin_all_jobs_v FOR &#39;</span><span style="color: #D4D4D4">||l_owner||</span><span style="color: #CE9178">&#39;.job_admin_all_jobs_v&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">EXECUTE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IMMEDIATE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;CREATE OR REPLACE PUBLIC SYNONYM job_admin_running_v  FOR &#39;</span><span style="color: #D4D4D4">||l_owner||</span><span style="color: #CE9178">&#39;.job_admin_running_v&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">EXECUTE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IMMEDIATE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;CREATE OR REPLACE PUBLIC SYNONYM pkg_job_admin        FOR &#39;</span><span style="color: #D4D4D4">||l_owner||</span><span style="color: #CE9178">&#39;.pkg_job_admin&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  DBMS_OUTPUT.PUT_LINE(</span><span style="color: #CE9178">&#39;Sinônimos públicos criados/atualizados.&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ✓ Segurança configurada (</span><span style="color: #569CD6">ROLE</span><span style="color: #D4D4D4"> + grants + sinônimos públicos).</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ── </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">Auto</span><span style="color: #D4D4D4">-Validação (não intrusiva) …</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #6A9955">-- 5.1) Verifica erros de compilação do pacote</span></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #569CD6">DECLARE</span></span>
<span class="line"><span style="color: #D4D4D4">  l_errs </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">COUNT</span><span style="color: #D4D4D4">(*) </span><span style="color: #569CD6">INTO</span><span style="color: #D4D4D4"> l_errs</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> user_errors</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">name</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;PKG_JOB_ADMIN&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> l_errs = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">    DBMS_OUTPUT.PUT_LINE(</span><span style="color: #CE9178">&#39;Pacote PKG_JOB_ADMIN sem erros de compilação.&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">ELSE</span></span>
<span class="line"><span style="color: #D4D4D4">    DBMS_OUTPUT.PUT_LINE(</span><span style="color: #CE9178">&#39;ATENÇÃO: Encontrado(s) &#39;</span><span style="color: #D4D4D4">||l_errs||</span><span style="color: #CE9178">&#39; erro(s) em PKG_JOB_ADMIN:&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FOR</span><span style="color: #D4D4D4"> r </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">type</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">name</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">line</span><span style="color: #D4D4D4">, position, SUBSTR(</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">,</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">,</span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">text</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> user_errors</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">name</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;PKG_JOB_ADMIN&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">sequence</span></span>
<span class="line"><span style="color: #D4D4D4">    ) </span><span style="color: #569CD6">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">      DBMS_OUTPUT.PUT_LINE(r.type||</span><span style="color: #CE9178">&#39; &#39;</span><span style="color: #D4D4D4">||r.name||</span><span style="color: #CE9178">&#39; @&#39;</span><span style="color: #D4D4D4">||r.line||</span><span style="color: #CE9178">&#39;:&#39;</span><span style="color: #D4D4D4">||r.position||</span><span style="color: #CE9178">&#39; - &#39;</span><span style="color: #D4D4D4">||r.text);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">LOOP</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #6A9955">-- 5.2) Validação simples de acesso às views (sanidade)</span></span>
<span class="line"><span style="color: #6A9955">-- =================================================================================================</span></span>
<span class="line"><span style="color: #569CD6">DECLARE</span></span>
<span class="line"><span style="color: #D4D4D4">  l_all </span><span style="color: #569CD6">NUMBER</span><span style="color: #D4D4D4">; l_run </span><span style="color: #569CD6">NUMBER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">COUNT</span><span style="color: #D4D4D4">(*) </span><span style="color: #569CD6">INTO</span><span style="color: #D4D4D4"> l_all </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> job_admin_all_jobs </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> ROWNUM &lt;= </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">COUNT</span><span style="color: #D4D4D4">(*) </span><span style="color: #569CD6">INTO</span><span style="color: #D4D4D4"> l_run </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> job_admin_running  </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> ROWNUM &lt;= </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  DBMS_OUTPUT.PUT_LINE(</span><span style="color: #CE9178">&#39;Views acessíveis: JOB_ADMIN_ALL_JOBS e JOB_ADMIN_RUNNING OK.&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ── </span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4">) Exemplos de Uso (para referência; copiar/colar quando necessário) …</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- Inventário:</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT   pkg_job_admin.list_jobs;                          </span><span style="color: #6A9955">-- todos os jobs</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT   pkg_job_admin.list_jobs(</span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span><span style="color: #D4D4D4">);               </span><span style="color: #6A9955">-- por owner</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT   pkg_job_admin.list_jobs(p_like =&gt; </span><span style="color: #CE9178">&#39;JOB_%&#39;</span><span style="color: #D4D4D4">);       </span><span style="color: #6A9955">-- por padrão (LIKE)</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT /</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- Em execução agora:</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT   pkg_job_admin.list_running_jobs;                       </span><span style="color: #6A9955">-- tudo</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT   pkg_job_admin.list_running_jobs(</span><span style="color: #CE9178">&#39;DEMOAPP&#39;</span><span style="color: #D4D4D4">);            </span><span style="color: #6A9955">-- por owner</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT   pkg_job_admin.list_running_jobs(p_like =&gt; </span><span style="color: #CE9178">&#39;SYNC_%&#39;</span><span style="color: #D4D4D4">);   </span><span style="color: #6A9955">-- por padrão (LIKE)</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT /</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- Operações pontuais:</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- SCHEDULER (por nome; owner opcional se único no banco)</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">--   pkg_job_admin.disable_job(&#39;DEMOAPP.JOB_ATUALIZA_INDICES&#39;, p_stop_running =&gt; TRUE);</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">--   pkg_job_admin.enable_job (&#39;DEMOAPP.JOB_ATUALIZA_INDICES&#39;);</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- END;</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- /</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- DBMS_JOB (por número; owner apenas para validar pertinência quando desejar)</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">--   pkg_job_admin.disable_job(&#39;128&#39;, p_owner =&gt; &#39;SYS&#39;, p_stop_running =&gt; TRUE);</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">--   pkg_job_admin.enable_job (&#39;128&#39;, p_owner =&gt; &#39;SYS&#39;);</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- END;</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- /</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- Lote por padrão (por tipo):</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">--   pkg_job_admin.set_jobs_by_pattern(</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">--     p_name_like    =&gt; &#39;JOB_SYNC_%&#39;,</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">--     p_enable       =&gt; FALSE,</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">--     p_owner        =&gt; &#39;DEMOAPP&#39;,</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">--     p_type         =&gt; pkg_job_admin.c_type_scheduler, -- SCHEDULER | DBMS_JOB | ANY</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">--     p_stop_running =&gt; TRUE</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">--   );</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- END;</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- /</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- Visões consolidadas:</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- SELECT * FROM job_admin_all_jobs_v ORDER BY owner, job_type, job_name;</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT </span><span style="color: #6A9955">-- SELECT * FROM job_admin_running_v  ORDER BY running_instance, job_type, job_name;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PROMPT</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ═════════════════════════════════════════════════════════════════════════════════════════════</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT   Conclusão: job_admin_setup_completo.sql executado.</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT   Para conceder a </span><span style="color: #569CD6">ROLE</span><span style="color: #D4D4D4"> a um usuário final, utilize:</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT     </span><span style="color: #569CD6">GRANT</span><span style="color: #D4D4D4"> JOBDBMSSCHEDULERALL </span><span style="color: #569CD6">TO</span><span style="color: #D4D4D4"> nome_do_usuario;</span></span>
<span class="line"><span style="color: #D4D4D4">PROMPT ═════════════════════════════════════════════════════════════════════════════════════════════</span></span>
<span class="line"></span></code></pre></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Estruturas de Armazenamento do Oracle</title>
		<link>https://furushima.com.br/blog/estruturas-de-armazenamento-do-oracle/</link>
		
		<dc:creator><![CDATA[Weverton Amorim]]></dc:creator>
		<pubDate>Tue, 10 Jun 2025 10:59:20 +0000</pubDate>
				<category><![CDATA[Banco De Dados]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[ORACLE]]></category>
		<guid isPermaLink="false">https://furushima.com.br/?p=2841</guid>

					<description><![CDATA[Como o Oracle armazena os dados? A estrutura de armazenamento do Oracle Database é projetada para ser altamente eficiente e flexível, permitindo o armazenamento e o gerenciamento de grandes volumes de dados de forma organizada e segura. Visão Geral da Estrutura de Armazenamento O Oracle organiza os dados em várias camadas hierárquicas, garantindo escalabilidade e [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Como o Oracle armazena os dados?</h3>



<p>A estrutura de armazenamento do <strong>Oracle Database</strong> é projetada para ser altamente eficiente e flexível, permitindo o armazenamento e o gerenciamento de grandes volumes de dados de forma organizada e segura. </p>



<h3 class="wp-block-heading">Visão Geral da Estrutura de Armazenamento</h3>



<p>O Oracle organiza os dados em várias camadas hierárquicas, garantindo escalabilidade e otimização. As principais estruturas de armazenamento do Oracle são:</p>



<ul class="wp-block-list">
<li><strong>Database</strong> (Banco de dados)</li>



<li><strong>Tablespace</strong></li>



<li><strong>Segment</strong></li>



<li><strong>Extent</strong></li>



<li><strong>Oracle Data Block</strong></li>
</ul>



<p>Cada um desses níveis desempenha um papel importante na organização e armazenamento dos dados.</p>



<h3 class="wp-block-heading">Database</h3>



<p>No nível mais alto da hierarquia, temos o <strong>Database</strong>. O banco de dados Oracle é composto por vários arquivos de dados que armazenam as informações do usuário e os metadados necessários para o funcionamento do sistema. Ele é o contêiner principal que engloba todos os outros componentes de armazenamento.</p>



<p>O Oracle Database é composto por três tipos principais de arquivos:</p>



<ul class="wp-block-list">
<li><strong>Datafiles</strong>: Armazenam os dados reais.</li>



<li><strong>Redo Log Files</strong>: Guardam um histórico das alterações no banco, usados para recuperação em caso de falhas.</li>



<li><strong>Control Files</strong>: Contêm informações estruturais sobre o banco, como a localização dos datafiles e redo logs.</li>
</ul>



<figure class="wp-block-image size-full"><img alt="" fetchpriority="high" decoding="async" width="823" height="695" src="https://furushima.com.br/wp-content/uploads/2025/06/image.png" alt="" class="wp-image-2842" srcset="https://furushima.com.br/wp-content/uploads/2025/06/image.png 823w, https://furushima.com.br/wp-content/uploads/2025/06/image-300x253.png 300w, https://furushima.com.br/wp-content/uploads/2025/06/image-768x649.png 768w" sizes="(max-width: 823px) 100vw, 823px" /></figure>



<h3 class="wp-block-heading">Tablespace</h3>



<p>O <strong>Tablespace</strong> é o próximo nível da hierarquia e age como um contêiner lógico para organizar os dados dentro do banco de dados. Ele agrupa múltiplos <strong>datafiles</strong>, que são arquivos físicos no sistema operacional onde os dados reais são armazenados. Um banco de dados pode ter vários tablespaces, sendo cada um especializado em armazenar diferentes tipos de objetos de dados.</p>



<p>Os <strong>tablespaces</strong> podem ser divididos em dois tipos principais:</p>



<ul class="wp-block-list">
<li><strong>Permanent Tablespaces</strong>: Armazenam dados persistentes, como tabelas e índices.</li>



<li><strong>Temporary Tablespaces</strong>: Usados para operações temporárias, como ordenações ou junções de dados durante consultas.</li>
</ul>



<p>Exemplos comuns de tablespaces incluem:</p>



<ul class="wp-block-list">
<li><strong>SYSTEM</strong>: Onde ficam os dicionários de dados (metadados do banco).</li>



<li><strong>SYSAUX</strong>: Um tablespace auxiliar para armazenar componentes não-críticos, como o AWR.</li>



<li><strong>USERS</strong>: Um tablespace típico onde são armazenados os dados dos usuários.</li>
</ul>



<figure class="wp-block-image size-full"><img alt="" decoding="async" width="650" height="495" src="https://furushima.com.br/wp-content/uploads/2025/06/image-1.png" alt="" class="wp-image-2843" srcset="https://furushima.com.br/wp-content/uploads/2025/06/image-1.png 650w, https://furushima.com.br/wp-content/uploads/2025/06/image-1-300x228.png 300w" sizes="(max-width: 650px) 100vw, 650px" /></figure>



<h3 class="wp-block-heading">Segment</h3>



<p>Dentro de cada <strong>tablespace</strong>, encontramos os <strong>segments</strong>. Um <strong>segmento</strong> é um espaço lógico alocado para armazenar um tipo específico de objeto de banco de dados, como uma <strong>tabela</strong>, <strong>índice</strong>, <strong>view materializada</strong>, <strong>rollback segment</strong>, etc.</p>



<p>Cada tipo de segmento desempenha um papel específico:</p>



<ul class="wp-block-list">
<li><strong>Data Segments</strong>: Armazenam os dados reais das tabelas.</li>



<li><strong>Index Segments</strong>: Contêm os índices de tabelas para melhorar a performance de busca.</li>



<li><strong>Temporary Segments</strong>: Usados para operações temporárias, como ao realizar consultas grandes.</li>



<li><strong>Undo Segments</strong>: Utilizados para manter o controle das transações para garantir a consistência dos dados e permitir rollback.</li>
</ul>



<p>Os segmentos são compostos por unidades de espaço chamadas <strong>extents</strong>.</p>



<h3 class="wp-block-heading">Extent</h3>



<p>Um <strong>extent</strong> é uma unidade contígua de espaço dentro de um segmento, onde os dados são armazenados fisicamente nos datafiles. Um segmento é composto por um ou mais extents, que são alocados conforme necessário para acomodar o crescimento do objeto de banco de dados (como uma tabela que aumenta de tamanho).</p>



<p>Quando um segmento precisa de mais espaço, o Oracle aloca um novo extent para ele. Os extents garantem que os dados sejam armazenados em blocos contínuos, o que melhora a eficiência de leitura/escrita.</p>



<figure class="wp-block-image size-full"><img alt="" decoding="async" width="607" height="406" src="https://furushima.com.br/wp-content/uploads/2025/06/image-2.png" alt="" class="wp-image-2844" srcset="https://furushima.com.br/wp-content/uploads/2025/06/image-2.png 607w, https://furushima.com.br/wp-content/uploads/2025/06/image-2-300x201.png 300w" sizes="(max-width: 607px) 100vw, 607px" /></figure>



<h3 class="wp-block-heading">Oracle Data Block</h3>



<p>O nível mais baixo da hierarquia de armazenamento é o <strong>Oracle Data Block</strong>, também chamado de <strong>database block</strong> ou <strong>data block</strong>. Os <strong>data blocks</strong> representam a menor unidade de armazenamento no Oracle Database. Cada <strong>extent</strong> é composto de múltiplos <strong>data blocks</strong>.</p>



<p>Os <strong>data blocks</strong> armazenam os dados reais, como as linhas de uma tabela. Eles são a interface entre o banco de dados e o sistema de arquivos subjacente. O tamanho dos <strong>data blocks</strong> é configurável e pode variar (tipicamente 4KB, 8KB, 16KB ou 32KB), dependendo das necessidades do ambiente.</p>



<p>Os <strong>data blocks</strong> contêm várias informações, além dos dados do usuário, como cabeçalhos que registram metadados importantes, como o endereço do bloco e informações de transações.</p>



<h3 class="wp-block-heading">Componentes de um Oracle Data Block</h3>



<p>Um <strong>data block</strong> possui várias subestruturas:</p>



<ol class="wp-block-list">
<li><strong>Cabeçalho do Bloco (Block Header)</strong>: Contém metadados sobre o bloco, como o endereço do bloco, identificadores de transações ativas e status de formatação.</li>



<li><strong>Tabela de Diretório (Table Directory)</strong>: Mantém informações sobre as tabelas cujos dados estão armazenados neste bloco (importante em caso de blocos com dados de mais de uma tabela).</li>



<li><strong>Tabela de Linhas (Row Directory)</strong>: Lista de ponteiros para as linhas reais armazenadas no bloco.</li>



<li><strong>Linhas de Dados</strong>: São os dados reais das colunas de uma tabela.</li>



<li><strong>Espaço Livre (Free Space)</strong>: Espaço não utilizado no bloco que pode ser usado para inserções futuras ou expansões de linhas.</li>



<li><strong>Gerenciamento de Espaço</strong>: O Oracle utiliza métodos sofisticados para o gerenciamento de espaço dentro dos blocos, como o <strong>PCTFREE</strong> (percentual de espaço reservado para futuras atualizações) e <strong>PCTUSED</strong> (percentual de ocupação após o qual novos dados podem ser inseridos no bloco).</li>
</ol>



<figure class="wp-block-image size-full is-resized"><img alt="" loading="lazy" decoding="async" width="737" height="781" src="https://furushima.com.br/wp-content/uploads/2025/06/image-3.png" alt="" class="wp-image-2845" style="width:741px;height:auto" srcset="https://furushima.com.br/wp-content/uploads/2025/06/image-3.png 737w, https://furushima.com.br/wp-content/uploads/2025/06/image-3-283x300.png 283w" sizes="(max-width: 737px) 100vw, 737px" /></figure>



<h3 class="wp-block-heading">Tabelas e Índices no Oracle Data Block</h3>



<p>Os <strong>data blocks</strong> podem armazenar dados de tabelas e índices. Ao trabalhar com tabelas:</p>



<ul class="wp-block-list">
<li>As <strong>linhas</strong> da tabela são armazenadas dentro dos <strong>data blocks</strong>.</li>



<li>Em caso de atualização, se a linha de dados crescer e não couber no bloco original, pode ocorrer a <strong>migração de linhas</strong> ou <strong>encadeamento de linhas</strong>, em que a linha é movida para outro bloco, o que pode afetar a performance.</li>
</ul>



<p>No caso de índices, os <strong>data blocks</strong> são usados para armazenar as estruturas de árvore B-tree que organizam e aceleram a busca de dados.</p>



<figure class="wp-block-image size-full"><img alt="" loading="lazy" decoding="async" width="770" height="673" src="https://furushima.com.br/wp-content/uploads/2025/06/image-4.png" alt="" class="wp-image-2846" srcset="https://furushima.com.br/wp-content/uploads/2025/06/image-4.png 770w, https://furushima.com.br/wp-content/uploads/2025/06/image-4-300x262.png 300w, https://furushima.com.br/wp-content/uploads/2025/06/image-4-768x671.png 768w" sizes="(max-width: 770px) 100vw, 770px" /></figure>



<figure class="wp-block-image size-full"><img alt="" loading="lazy" decoding="async" width="538" height="352" src="https://furushima.com.br/wp-content/uploads/2025/06/image-5.png" alt="" class="wp-image-2847" srcset="https://furushima.com.br/wp-content/uploads/2025/06/image-5.png 538w, https://furushima.com.br/wp-content/uploads/2025/06/image-5-300x196.png 300w" sizes="(max-width: 538px) 100vw, 538px" /></figure>



<p><br>No <strong>Oracle Database</strong>, a parametrização de armazenamento em uma tabela, definida pela cláusula <strong>STORAGE</strong>, determina como o espaço em disco será alocado e gerenciado para essa tabela. Esses parâmetros são essenciais para otimizar o uso de espaço, controlar o crescimento dos segmentos e reduzir a fragmentação. Eles influenciam aspectos como o tamanho dos extents, a reserva de espaço para atualizações futuras e a frequência de alocação de novos extents. Vamos explorar esses parâmetros com base na tabela de exemplo <strong>&#8220;empregados&#8221;</strong>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="CREATE TABLE empregados (
    empregado_id NUMBER PRIMARY KEY,
    nome VARCHAR2(100),
    cargo VARCHAR2(50),
    salario NUMBER(10, 2),
    data_admissao DATE DEFAULT SYSDATE,
    departamento_id NUMBER,
    CONSTRAINT fk_departamento
    FOREIGN KEY (departamento_id) REFERENCES departamentos(departamento_id)
) TABLESPACE meu_tablespace
STORAGE (
    INITIAL 64K
    NEXT 128K
    PCTINCREASE 0
)
PCTFREE 10
PCTUSED 40;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4FC1FF">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">TABLE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">empregados</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">empregado_id</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">NUMBER</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">PRIMARY</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">KEY</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">nome</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">cargo</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">50</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">salario</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">NUMBER</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">data_admissao</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">DATE</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">SYSDATE</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">departamento_id</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">NUMBER</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">CONSTRAINT</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">fk_departamento</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">FOREIGN</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">KEY</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">departamento_id</span><span style="color: #D4D4D4">) </span><span style="color: #4FC1FF">REFERENCES</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">departamentos</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">departamento_id</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #4FC1FF">TABLESPACE</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">meu_tablespace</span></span>
<span class="line"><span style="color: #DCDCAA">STORAGE</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">INITIAL</span><span style="color: #D4D4D4"> 64</span><span style="color: #4FC1FF">K</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">NEXT</span><span style="color: #D4D4D4"> 128</span><span style="color: #4FC1FF">K</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">PCTINCREASE</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #4FC1FF">PCTFREE</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">10</span></span>
<span class="line"><span style="color: #4FC1FF">PCTUSED</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">40</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<h3 class="wp-block-heading">Parâmetros de Armazenamento (STORAGE Clause)</h3>



<h3 class="wp-block-heading">1. INITIAL</h3>



<ul class="wp-block-list">
<li><strong>Descrição</strong>: Define o tamanho do primeiro <strong>extent</strong> alocado para o segmento da tabela. Um <strong>extent</strong> é uma unidade contígua de espaço no disco alocada para armazenar dados.</li>



<li><strong>Exemplo</strong>: <kbd>"INITIAL 64K"</kbd> significa que o primeiro extent terá 64 kilobytes. Isso determina o espaço inicial reservado para a tabela ao ser criada, influenciando a capacidade inicial de armazenamento.</li>
</ul>



<h3 class="wp-block-heading">2. NEXT</h3>



<ul class="wp-block-list">
<li><strong>Descrição</strong>: Especifica o tamanho dos <strong>extents</strong> subsequentes alocados após o primeiro. À medida que a tabela cresce e o primeiro extent é preenchido, um novo extent é alocado com o tamanho definido aqui.</li>



<li><strong>Exemplo</strong>: <kbd>"NEXT 128K"</kbd> indica que cada novo extent alocado após o primeiro terá 128 kilobytes. Esse valor ajuda a controlar o crescimento da tabela ao longo do tempo, garantindo alocações eficientes de espaço.</li>
</ul>



<h3 class="wp-block-heading">3. PCTINCREASE</h3>



<ul class="wp-block-list">
<li><strong>Descrição</strong>: Define a porcentagem de aumento de cada novo extent em relação ao anterior. Isso controla o crescimento progressivo dos extents.</li>



<li><strong>Exemplo</strong>: <kbd>"PCTINCREASE 0"</kbd> indica que todos os extents subsequentes terão o mesmo tamanho definido em <kbd>"NEXT"</kbd>, ou seja, 128K. Se fosse configurado um valor diferente de zero, cada novo extent seria maior que o anterior, aumentando pela porcentagem especificada. Por exemplo, se <kbd>"PCTINCREASE"</kbd> fosse 50, o próximo extent após 128K seria 192K (50% maior).</li>
</ul>



<h3 class="wp-block-heading">Outros Parâmetros de Tabela</h3>



<h3 class="wp-block-heading">1. PCTFREE</h3>



<ul class="wp-block-list">
<li><strong>Descrição</strong>: Determina a porcentagem de espaço em cada <strong>data block</strong> que é reservada para futuras atualizações de linhas já existentes. Isso garante que, ao alterar valores de uma linha, o bloco tenha espaço suficiente para armazenar os novos dados sem precisar movê-los para um bloco diferente.</li>



<li><strong>Exemplo</strong>: <kbd>"PCTFREE 10"</kbd> reserva 10% de cada <strong>data block</strong> para atualizações futuras. Se uma linha for atualizada e seus novos dados excederem o espaço previamente alocado para ela, os 10% reservados serão usados para evitar a migração de linhas para outros blocos, o que poderia impactar a performance.</li>
</ul>



<h3 class="wp-block-heading">2. PCTUSED</h3>



<ul class="wp-block-list">
<li><strong>Descrição</strong>: Define a porcentagem mínima de ocupação de um <strong>data block</strong> antes que ele seja reutilizado para novas inserções de dados. Após a exclusão ou movimentação de linhas, se o percentual de uso do bloco cair abaixo desse limite, o bloco será reutilizado para novas inserções.</li>



<li><strong>Exemplo</strong>: <kbd>"PCTUSED 40"</kbd> indica que, quando a ocupação do bloco cair abaixo de 40%, ele será marcado como disponível para novas inserções de dados. Esse parâmetro ajuda a evitar fragmentação e melhora a eficiência na reutilização de blocos parcialmente cheios.</li>
</ul>



<h3 class="wp-block-heading">Como Esses Parâmetros Funcionam Juntos</h3>



<ol class="wp-block-list">
<li><strong>Alocação Inicial e Crescimento de Extents</strong>:
<ul class="wp-block-list">
<li>Ao criar a tabela, o Oracle aloca um <strong>extent</strong> inicial de 64K, conforme definido em <kbd>"INITIAL"</kbd>. À medida que os dados são inseridos e o extent inicial é preenchido, o Oracle aloca novos <strong>extents</strong> de 128K, conforme especificado em <kbd>"NEXT"</kbd>. Como <kbd>"PCTINCREASE"</kbd> está definido como 0, todos os extents subsequentes terão o mesmo tamanho de 128K. Isso mantém o crescimento linear e previsível da tabela.</li>
</ul>
</li>



<li><strong>Gerenciamento de Espaço Livre em Data Blocks</strong>:
<ul class="wp-block-list">
<li>O parâmetro <kbd>"PCTFREE 10"</kbd> garante que 10% de cada <strong>data block</strong> seja reservado para atualizações de dados. Isso é importante para evitar que atualizações frequentes de linhas movam os dados para novos blocos, o que reduziria a eficiência de leitura. Esse espaço reservado permite que as linhas cresçam dentro do mesmo bloco.</li>



<li>O parâmetro <kbd>"PCTUSED 40"</kbd> garante que blocos parcialmente utilizados sejam reutilizados para novas inserções quando sua ocupação cair abaixo de 40%. Isso ajuda a evitar o desperdício de espaço em blocos que não estão completamente cheios e reduz a necessidade de alocar novos blocos, otimizando o uso do espaço.</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading">Benefícios da Configuração Correta dos Parâmetros de Armazenamento</h3>



<p>Ao configurar corretamente os parâmetros de armazenamento, é possível otimizar o uso de espaço e melhorar a performance da tabela. Esses parâmetros permitem ao DBA:</p>



<ul class="wp-block-list">
<li><strong>Controlar o crescimento do segmento</strong>: Ao especificar tamanhos adequados para os extents e definir políticas claras para a alocação subsequente, o crescimento da tabela é gerenciado de maneira eficiente, evitando fragmentação excessiva.</li>



<li><strong>Gerenciar atualizações e inserções</strong>: Parâmetros como <kbd>"PCTFREE"</kbd> e <kbd>"PCTUSED"</kbd> garantem que os blocos de dados sejam utilizados de forma inteligente, reservando espaço para atualizações e reutilizando blocos que ficaram abaixo da ocupação mínima.</li>



<li><strong>Prevenir fragmentação</strong>: O controle da alocação de extents e a reutilização de blocos parcialmente ocupados ajudam a minimizar a fragmentação, o que melhora a performance de leitura e escrita no banco de dados.</li>
</ul>



<p></p>



<p>Esses parâmetros, quando bem configurados, são ferramentas poderosas para otimizar o armazenamento e o desempenho de tabelas no Oracle Database, garantindo uma utilização eficiente dos recursos de hardware e mantendo a performance à medida que a tabela cresce e é atualizada ao longo do tempo.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Oracle Database Fases de Startup/Shutdown</title>
		<link>https://furushima.com.br/blog/oracle-database-fases-de-startup-shutdown/</link>
		
		<dc:creator><![CDATA[Weverton Amorim]]></dc:creator>
		<pubDate>Tue, 29 Apr 2025 15:11:13 +0000</pubDate>
				<category><![CDATA[Banco De Dados]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[ORACLE]]></category>
		<guid isPermaLink="false">https://furushima.com.br/?p=2818</guid>

					<description><![CDATA[Iniciando a instância do banco de dados Oracle Antes que os usuários possam se conectar a uma instância de banco de dados, um administrador de banco de dados deve iniciar a instância do banco de dados. A instância e o banco de dados passam por estágios à medida que o banco de dados é disponibilizado [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Iniciando a instância do banco de dados Oracle</h3>



<p><br>Antes que os usuários possam se conectar a uma instância de banco de dados, um administrador de banco de dados deve iniciar a instância do banco de dados. A instância e o banco de dados passam por estágios à medida que o banco de dados é disponibilizado para acesso pelos usuários. A instância é iniciada, o banco de dados é montado e, em seguida, o banco de dados é aberto, como mostrado no slide.</p>



<figure class="wp-block-image size-full"><img alt="" loading="lazy" decoding="async" width="1006" height="478" src="https://furushima.com.br/wp-content/uploads/2025/04/image-6.png" alt="" class="wp-image-2819" srcset="https://furushima.com.br/wp-content/uploads/2025/04/image-6.png 1006w, https://furushima.com.br/wp-content/uploads/2025/04/image-6-300x143.png 300w, https://furushima.com.br/wp-content/uploads/2025/04/image-6-768x365.png 768w" sizes="(max-width: 1006px) 100vw, 1006px" /></figure>



<p><br><strong>NOMOUNT</strong>: Nesta etapa, o software Oracle lê um arquivo de parâmetros de inicialização, <strong>PFILE</strong> ou <strong>SPFILE</strong>, inicia os processos em segundo plano, aloca memória para a SGA, abre o log de alerta e os arquivos de rastreamento. Uma instância é tipicamente iniciada apenas no modo NOMOUNT durante a criação do banco de dados, durante a recriação de arquivos de controle ou em cenários específicos de backup e recuperação.</p>



<p><br><strong>MOUNT</strong>: Nesta etapa, o software Oracle associa o banco de dados à instância de banco de dados previamente iniciada, abre e lê o controlefile especificado no arquivo de parâmetros de inicialização, <strong>PFILE</strong> ou <strong>SPFILE,</strong> e obtém os nomes e estados dos datafiles e dos redo logs. No entanto, nesta fase, não são realizadas verificações para confirmar a existência dos datafiles e dos redo logs. Iniciar no modo MOUNT para executar algumas operações de manutenção, como renomear datafiles e realizar restore do banco de dados.</p>



<p><br><strong>OPEN</strong>: O software Oracle abre os redo logs e os datafiles de acordo com a lista registrada no controlefile. Inicie no modo OPEN para permitir que os usuários se conectem à instância do banco de dados. Os PDBs não são iniciados por padrão quando você abre o banco de dados.</p>



<p></p>



<h3 class="wp-block-heading">Desligando a instância do banco de dados Oracle</h3>



<p></p>



<p>Às vezes, é necessário desligar a instância do banco de dados (por exemplo, para alterar um parâmetro estático ou aplicar um patch no servidor do banco de dados).</p>



<p>Use o comando SHUTDOWN para desligar a instância do banco de dados, porém há vários modos possívels de se desligar a instância: ABORT, IMMEDIATE, NORMAL e TRANSACTIONAL.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td></td><td>ABORT</td><td>IMMEDIATE</td><td>NORMAL</td><td>TRANSACTIONAL</td></tr><tr><td>Permite novas conexões</td><td>NO</td><td>NO</td><td>NO</td><td>NO</td></tr><tr><td>Espera até que todas as sessões terminem</td><td>NO</td><td>NO</td><td>YES</td><td>NO</td></tr><tr><td>Espera até que todas as transações terminem</td><td>NO</td><td>NO</td><td>YES</td><td>YES</td></tr><tr><td>Força um checkpoint e fecha os todos os arquivos</td><td>NO</td><td>YES</td><td>YES</td><td>YES</td></tr></tbody></table></figure>



<p><br><strong>ABORT</strong>: Se os outros modos de desligamento não funcionarem, você pode usar o modo ABORT. O modo ABORT executa a menor quantidade de trabalho antes de desligar. Como esse modo coloca o banco de dados em um estado inconsistente e requer recuperação antes do reinício, use-o apenas quando necessário. Não é aconselhável fazer backup do banco de dados nesse estado. Geralmente, é usado quando nenhuma outra forma de desligamento funciona, quando há problemas para iniciar a instância do banco de dados ou quando você precisa desligar imediatamente devido a uma situação iminente (como aviso de queda de energia em questão de segundos). O modo ABORT costuma ser o modo de desligamento mais rápido, e o modo NORMAL é o mais lento. Os modos NORMAL e TRANSACTIONAL podem levar muito tempo, dependendo do número de sessões e transações.</p>



<p><br>Durante um desligamento no modo ABORT, uma falha na instância ou um reinício da instância do banco de dados no modo FORCE, o que acontece com o banco de dados:</p>



<ul class="wp-block-list">
<li>As declarações SQL atuais sendo processadas pelo servidor Oracle são imediatamente interrompidas.</li>



<li>O servidor Oracle não espera pelos usuários que estão atualmente conectados ao banco de dados se desconectarem.</li>



<li>Os buffers do banco de dados e de redo não são gravados em disco.</li>



<li>Transações não confirmadas não são revertidas.</li>



<li>A instância é terminada sem fechar os arquivos.</li>



<li>O banco de dados não é fechado ou desmontado.</li>



<li>O próximo reinício requer recuperação da instância, que ocorre automaticamente pelo processo SMON.</li>
</ul>



<p></p>



<p><strong>IMMEDIATE</strong>: Um desligamento no modo <strong>IMMEDIATE</strong> é a opção mais utilizada. • As declarações SQL atuais sendo processadas pela instância do banco de dados não são concluídas. • O servidor de banco de dados não espera pelos usuários que estão atualmente conectados à instância do banco de dados se desconectarem. • O servidor de banco de dados faz rollback das transações ativas e desconecta todos os usuários conectados. • O servidor de banco de dados fecha e desmonta o banco de dados antes de desligar a instância do banco de dados.</p>



<p><strong>NORMAL</strong>: NORMAL é o modo de desligamento padrão se nenhum modo for especificado com o comando SHUTDOWN. • Novas conexões não podem ser feitas. • O servidor Oracle <strong>espera</strong> que todos os usuários se desconectem antes de concluir o desligamento. • Buffers de banco de dados e de redo são gravados em disco. • Processos em segundo plano são terminados e a SGA é removida da memória. • O servidor Oracle fecha e desmonta o banco de dados antes de desligar a instância.</p>



<p><strong>TRANSACTIONAL</strong>: Um desligamento no modo TRANSACTIONAL impede que os clientes percam dados, incluindo resultados de sua atividade atual. • Nenhum cliente pode iniciar uma nova transação nesta instância específica. • Um cliente é desconectado quando o cliente encerra a transação que está em andamento. • Quando todas as transações forem concluídas, ocorre um desligamento imediato.</p>



<figure class="wp-block-image size-full"><img alt="" loading="lazy" decoding="async" width="1017" height="511" src="https://furushima.com.br/wp-content/uploads/2025/04/image-7.png" alt="" class="wp-image-2820" srcset="https://furushima.com.br/wp-content/uploads/2025/04/image-7.png 1017w, https://furushima.com.br/wp-content/uploads/2025/04/image-7-300x151.png 300w, https://furushima.com.br/wp-content/uploads/2025/04/image-7-768x386.png 768w" sizes="(max-width: 1017px) 100vw, 1017px" /></figure>



<p></p>



<h3 class="wp-block-heading">Exemplos práticos:</h3>



<p>Executando apenas o comando <strong>STARTUP</strong> é possível verificar todas as etapas que a instância transita até o estado <strong>OPEN</strong>, onde a base de dados está aberta e pronta para receber conexões:</p>



<figure class="wp-block-image size-full"><img alt="" loading="lazy" decoding="async" width="633" height="283" src="https://furushima.com.br/wp-content/uploads/2025/04/image-8.png" alt="" class="wp-image-2821" srcset="https://furushima.com.br/wp-content/uploads/2025/04/image-8.png 633w, https://furushima.com.br/wp-content/uploads/2025/04/image-8-300x134.png 300w" sizes="(max-width: 633px) 100vw, 633px" /></figure>



<p>É possível escolher a fase de inicialização da instância utilizando as opções <strong>NOMOUNT</strong> ou <strong>MOUNT</strong>:</p>



<p><strong>STARTUP NOMOUNT</strong>, o arquivo de parametros PFILE ou SPFILE será lido e apenas a instância fará a alocação na memória:</p>



<figure class="wp-block-image size-full"><img alt="" loading="lazy" decoding="async" width="610" height="233" src="https://furushima.com.br/wp-content/uploads/2025/04/image-9.png" alt="" class="wp-image-2822" srcset="https://furushima.com.br/wp-content/uploads/2025/04/image-9.png 610w, https://furushima.com.br/wp-content/uploads/2025/04/image-9-300x115.png 300w" sizes="(max-width: 610px) 100vw, 610px" /></figure>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="-- VERIFICAR O STATUS(FASE) DA INSTÂNCIA

SELECT STATUS FROM V$INSTANCE;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">-- </span><span style="color: #4FC1FF">VERIFICAR</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">O</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">STATUS</span><span style="color: #D4D4D4">(</span><span style="color: #4FC1FF">FASE</span><span style="color: #D4D4D4">) </span><span style="color: #4FC1FF">DA</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">INSTÂNCIA</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4FC1FF">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">STATUS</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">FROM</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">V$INSTANCE</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<p><br>Ao consultar o status da instância, aparecerá</p>



<figure class="wp-block-image size-full"><img alt="" loading="lazy" decoding="async" width="533" height="163" src="https://furushima.com.br/wp-content/uploads/2025/04/image-10.png" alt="" class="wp-image-2823" srcset="https://furushima.com.br/wp-content/uploads/2025/04/image-10.png 533w, https://furushima.com.br/wp-content/uploads/2025/04/image-10-300x92.png 300w" sizes="(max-width: 533px) 100vw, 533px" /></figure>



<p><br>STARTUP MOUNT, o arquivo de parametros PFILE ou SPFILE será lido, a instância iniciará e o controlfile será montado:</p>



<figure class="wp-block-image size-full"><img alt="" loading="lazy" decoding="async" width="626" height="264" src="https://furushima.com.br/wp-content/uploads/2025/04/image-11.png" alt="" class="wp-image-2824" srcset="https://furushima.com.br/wp-content/uploads/2025/04/image-11.png 626w, https://furushima.com.br/wp-content/uploads/2025/04/image-11-300x127.png 300w" sizes="(max-width: 626px) 100vw, 626px" /></figure>



<p><br>Ao consultar o status da instância, aparecerá como MOUNTED:</p>



<figure class="wp-block-image size-full is-resized"><img alt="" loading="lazy" decoding="async" width="542" height="160" src="https://furushima.com.br/wp-content/uploads/2025/04/image-12.png" alt="" class="wp-image-2825" style="width:542px;height:auto" srcset="https://furushima.com.br/wp-content/uploads/2025/04/image-12.png 542w, https://furushima.com.br/wp-content/uploads/2025/04/image-12-300x89.png 300w" sizes="(max-width: 542px) 100vw, 542px" /></figure>



<p><br>SHUTDOWN IMMEDIATE, que é o mais utilizado, ve-se também todas as fases:</p>



<figure class="wp-block-image size-full"><img alt="" loading="lazy" decoding="async" width="478" height="132" src="https://furushima.com.br/wp-content/uploads/2025/04/image-14.png" alt="" class="wp-image-2827" srcset="https://furushima.com.br/wp-content/uploads/2025/04/image-14.png 478w, https://furushima.com.br/wp-content/uploads/2025/04/image-14-300x83.png 300w" sizes="(max-width: 478px) 100vw, 478px" /></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Views no Oracle</title>
		<link>https://furushima.com.br/blog/views-no-oracle/</link>
		
		<dc:creator><![CDATA[Luis Jacoveto]]></dc:creator>
		<pubDate>Thu, 24 Apr 2025 12:11:29 +0000</pubDate>
				<category><![CDATA[Banco De Dados]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[ORACLE]]></category>
		<category><![CDATA[RDBMS]]></category>
		<guid isPermaLink="false">https://furushima.com.br/?p=2806</guid>

					<description><![CDATA[As views (ou também visões) são recursos bastante úteis em bancos de dados relacionais, pois permitem a criação de representações lógicas dos dados armazenados em tabelas, facilitando a consulta, segurança e manutenção. Mas o que exatamente são as views? Uma view pode ser entendida como uma tabela virtual que se baseia no resultado de uma [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>As views (ou também visões) são recursos bastante úteis em bancos de dados relacionais, pois permitem a criação de representações lógicas dos dados armazenados em tabelas, facilitando a consulta, segurança e manutenção.</p>



<h2 class="wp-block-heading">Mas o que exatamente são as views?</h2>



<p>Uma view pode ser entendida como uma tabela virtual que se baseia no resultado de uma consulta, ou seja, ao invés de armazenar os dados diretamente ela apenas exibe os dados pertencentes a outras tabelas. Estes dados são recuperados através de uma instrucão SQL toda vez que a view é executada.</p>



<p>De acordo com a documentação da versão 19c do Oracle, temos:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Use the CREATE VIEW statement to define a view, which is a logical table based on one or more tables or views. A view contains no data itself. The tables upon which a view is based are called base tables.</p>
</blockquote>



<h2 class="wp-block-heading">Vantagens ao utilizar views</h2>



<h4 class="wp-block-heading"> &#8211; Simplicar consultar complexas</h4>



<p>A utilização de views possibilita que uma query complexa seja encapsulada em uma query simples.</p>



<h4 class="wp-block-heading"> &#8211; Segurança no acesso aos dados</h4>



<p>Através da utilização de views é possível restringir o acesso a colunas ou linhas específicas, podendo assim exibir somente os dados necessários.</p>



<h4 class="wp-block-heading"> &#8211; Abstração</h4>



<p>Com as views é possível implementar uma camada de abstração que permite ocultar tanto a estrutura das tabelas ou até mesmo a fonte dos dados.</p>



<h4 class="wp-block-heading"> &#8211; Reutilização de consulta</h4>



<p>Para consultas que são utilizadas com certa frequência é indica a criação de views para reduzir a repetição de código.</p>



<h2 class="wp-block-heading">Tipos de Views no Oracle</h2>



<h3 class="wp-block-heading">Views</h3>



<p>Podem ter desde uma estrutura simplificada baseada em apenas uma tabela e sem funções de agregações e joins ou até mesmo mais complexas com joins entre multiplas tabelas, funções de agregação, subconsultas, etç.</p>



<p>As views com estrutura simples geralmente permitem que sejam feitas inserções e alterações nos dados da tabela de origem.</p>



<p>Já as views que não permitem inserções e alterações são as que possuem clasulas como DISTINCT, funções de agregação, GROPU BY, ORDER BY, sub queries no select, condições recursivas com a clásula WITH, etç.</p>



<p>Independente da estrutura da view, ela não ocupa espaço em disco.</p>



<p>Mais informações disponíveis em <a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/UPDATE.html">https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/UPDATE.html</a></p>



<p>Exemplo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="CREATE VIEW vw_empresas AS
SELECT id, nome_empresa
FROM empresas;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4FC1FF">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">VIEW</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">vw_empresas</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">AS</span></span>
<span class="line"><span style="color: #4FC1FF">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">nome_empresa</span></span>
<span class="line"><span style="color: #4FC1FF">FROM</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">empresas</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<h3 class="wp-block-heading">Materialized Views</h3>



<p>Já as materialized views (views materializadas) armazenam os dados fisicamente, ou seja, ela irá consumir espaço em disco.</p>



<p>As materialized views podem ser usadas para melhorar a performance em consultas complexas ou consultas que envolvam grandes volumes de dados.</p>



<p>Também é possível utiliá-las para transportar ou replicar dados para outros bancos de dados oracle através de database links.</p>



<p>As MVs podem ser atualizadas periodicamente ou sob demanda e podem ser totalmente reconstruídas a cada atualização ou de maneira incremental com a utilização de mlogs (materialized view logs).</p>



<p>Exemplo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="CREATE MATERIALIZED VIEW mv_vendas
REFRESH FAST ON COMMIT
AS
SELECT produto_id, SUM(quantidade) AS total_vendido
FROM vendas
GROUP BY produto_id;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4FC1FF">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">MATERIALIZED</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">VIEW</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">mv_vendas</span></span>
<span class="line"><span style="color: #4FC1FF">REFRESH</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">FAST</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">ON</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">COMMIT</span></span>
<span class="line"><span style="color: #4FC1FF">AS</span></span>
<span class="line"><span style="color: #4FC1FF">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">produto_id</span><span style="color: #D4D4D4">, </span><span style="color: #DCDCAA">SUM</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">quantidade</span><span style="color: #D4D4D4">) </span><span style="color: #4FC1FF">AS</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">total_vendido</span></span>
<span class="line"><span style="color: #4FC1FF">FROM</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">vendas</span></span>
<span class="line"><span style="color: #4FC1FF">GROUP</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">BY</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">produto_id</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
