Consulta em nível na tabela: ALL_SOURCE

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 321
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Senhores, boa noite.

Quando não conheço determinado processo no banco de dados ou onde ocorre determinada operação e me é questionado: "onde é ou em que ponto são excluidos os registros de determinada tabela?", eu costumo recorrer as tabelas/views de sistemas do Oracle, como por exemplo a: ALL_SOURCE.

Assim, supondo que eu sei que existe algumas packages que excluem os dados da tabela: TAB_X, eu faria a seguinte busca:

Selecionar tudo


SELECT *
  FROM ALL_SOURCE ASR
 WHERE ASR.OWNER = 'OWNER'
   AND ASR.NAME = 'PKG_X'
   AND ASR.TYPE = 'PACKAGE BODY'
   AND UPPER(ASR.TEXT)  LIKE '%DEL%FROM%TAB_X%'
ORDER BY ASR.LINE;

Dessa forma, seria retornado todo o código da package especificada a onde exista o DML de DELETE todo na mesma linha. No entanto, pode ser que o comando tenha sido quebrado em mais de uma linha, por exemplo:

Selecionar tudo


DELETE
  FROM TAB_X;
  
Considerando que exista as duas formas de escrita do DML dentro da package, a consulta anterior, não pegaria os casos onde houvesse quebra de linha.

A minha dúvida é: Será que seria possível fazer com que a consulta leia as linhas subsequentes pertencentes a mesma package em busca da incidência a ser procurada?

Desde já agradeço a quem puder ajudar.

Att.
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 99
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Teria que verificar as possibilidades e adequar para sua necessidade, mas pensei em algo do gênero:

Selecionar tudo

WITH source_code AS (
    SELECT name, type, line, text,
           LAG(UPPER(text)) OVER (PARTITION BY name, type ORDER BY line) AS prev_line,
           LEAD(UPPER(text)) OVER (PARTITION BY name, type ORDER BY line) AS next_line
    FROM all_source
)
SELECT name, type, line, text
FROM source_code
WHERE UPPER(text) LIKE '%DELETE%'
   OR prev_line LIKE '%DELETE%' AND UPPER(text) LIKE '%FROM%'
   OR UPPER(text) LIKE '%FROM%' AND next_line LIKE '%TAB%'
ORDER BY name, type, line;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Google [Bot], Google Adsense [Bot] e 2 visitantes