- This topic has 6 replies, 4 voices, and was last updated 7 years, 2 months ago by Motta.
-
AuthorPosts
-
15 de setembro de 2017 at 7:04 pm #108988airoospParticipant
Bom dia pessoal,
Preciso de uma ajuda. Me pediram um levantamento do total de linhas dos objetos do banco, neste caso seria o total de linhas de procedures, functions, packages, views, database link, synonym.
Aqui temos procedures isoladas e procedures dentro de packages, se alguém tiver alguma dica, agradeço.
Obrigado.
Airton
15 de setembro de 2017 at 7:47 pm #108990C-S-RParticipantAirton não entendi sua pergunta.
Vc quer o numero de linhas da sua procedure?
15 de setembro de 2017 at 8:04 pm #108991airoospParticipantSim, o número de linhas de código das procedures, functions, views, triggers, etc.
O detalhe são as procedures e function que estão dentro das packages.
15 de setembro de 2017 at 8:20 pm #108992MottaParticipantMuito “grosso modo” , linhas de um owner
SELECT TYPE,COUNT(LINE) LINHAS
FROM USER_SOURCE
GROUP BY TYPEas views e trigger* não entram nesta bagaça pois não tem “linhas” , todavia os codigos estão nas views USER_TRIGGERS e USER_VIEWS
- não tenho certeza se funciona sempre
15 de setembro de 2017 at 9:07 pm #108994José Laurindo ChiappaModeratorPingos nos Is : fique CLARO que ** database links ** e ** synonyms ** NÂO POSSUEM CÓDIGO DENTRE DELES, então absolutamente Não Faz Sentido “total de linhas de código” pra Objetos Não-Programáticos como eles…
Já para Procedures, Functions e Packages é simples : CADA linha de Código desses objetos é um registro na DBA_SOURCE, então seria simplesmente um :SELECT OWNER, TYPE, NAME, COUNT(*) FROM DBA_SOURCE WHERE OWNER in (‘listadeownersapesquisar’) GROUP BY OWNER, TYPE, NAME ORDER BY 1,2,3;
Apenas as VIEWs (que são objetos programáticos diferentes) a coisa muda : o código SQL que compõe a view não é compilado, então esse Não Vai estar contido na DBA_SOURCE, não tem ‘fonte’ nem ‘compilado’ a armazenar…
O código SQL que compõe cada view fica na DBA_VIEWS numa única coluna LONG chamada TEXT : como não há uma built-in que leia o texto dentro de um LONG linha-a-linha (pra vc poder as contar), o que eu faria seria CONVERTER o LONG para LOB (CLOB, já que um LONG contém strings longas), aí sim temos diversas built-ins que aceitam LOBs…. Um exemplo, digamos que quero obter o texto e a quantidade de linhas das views que pertencem aos schemas HR ou SH :SQL> create table T_VIEWS as (select owner, view_name, text_length, TO_LOB(text) TEXTO_EM_LOB from dba_views where owner in (‘HR’, ‘SH’) );
Tabela criada.
SQL> desc T_VIEWS
Nome Nulo? Tipo
OWNER NOT NULL VARCHAR2(30)
VIEW_NAME NOT NULL VARCHAR2(30)
TEXT_LENGTH NUMBER
TEXTO_EM_LOB CLOB==> Agora que tenho o texto SQL das views num LOB, temos Diversas built-ins e métodos disponíveis… Um método possível (já que sabemos que as linhas de um texto normalmente terminam com o caracter ASCII 10, que é o newline) é obter uma outra string sem os CHR(10) – é o que o REPLACE faz – e depois vermos a diferença do comprimento original menos o comprimento da segunda string sem os fins-de-linha, isso nos dá a qtdade de caracteres de fim de linha que foram removidos E PORTANTO a qtdade de linhas…. Ficaria assim :
SQL> set long 500000 lines 133 pages 50000 trimspool on
SQL> select owner, view_name, text_length, TEXTO_EM_LOB, (LENGTH(TEXTO_EM_LOB) – LENGTH(replace(TEXTO_EM_LOB,chr(10)))) QTD_LINHAS from t_VIEWS;OWNER VIEW_NAME TEXT_LENGTH TEXTO_EM_LOB LINHAS
HR EMP_DETAILS_VIEW 538 SELECT 29
e.employee_id,
e.job_id,
e.manager_id,
e.department_id,
d.location_id,
l.country_id,
e.first_name,
e.last_name,
e.salary,
e.commission_pct,
d.department_name,
j.job_title,
l.city,
l.state_province,
c.country_name,
r.region_name
FROM
employees e,
departments d,
jobs j,
locations l,
countries c,
regions r
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id
AND l.country_id = c.country_id
AND c.region_id = r.region_id
AND j.job_id = e.job_id
WITH READ ONLYSH PROFITS 394 SELECT 15
s.channel_id,
s.cust_id,
s.prod_id,
s.promo_id,
s.time_id,
c.unit_cost,
c.unit_price,
s.amount_sold,
s.quantity_sold,
c.unit_cost * s.quantity_sold TOTAL_COST
FROM costs c, sales s
WHERE c.prod_id = s.prod_id
AND c.time_id = s.time_id
AND c.channel_id = s.channel_id
AND c.promo_id = s.promo_idSQL>
Blz ??
[]s
Chiappa
OBS : reforço NOVAMENTE, esse é apenas UM dos meios possíveis….
15 de setembro de 2017 at 9:10 pm #108995José Laurindo ChiappaModeratorPaulo, só uma obs : realmente VIEWS não entram na USER/ALL/DBA_SOURCE mas triggers *** ENTRAM SIM ***, pois elas são compiladas e portanto possuem SIM código fonte E código compilado armazenado no dicionário de dados :
SQL> select distinct type from dba_source;
TYPE
PROCEDURE
PACKAGE
PACKAGE BODY
LIBRARY
TYPE BODY
TRIGGER
FUNCTION
JAVA SOURCE
TYPE9 linhas selecionadas.
SQL>
Só não lembro se as triggers passaram a ser compiladas no 8i ou no 9i, mas de qquer maneira já faz MUUUITO TEMPO que isso ocorre…
15 de setembro de 2017 at 10:02 pm #108996MottaParticipantBeleza , não tinha certeza quanto a trigger se todas iam para o “code” , a view eu tinha certeza pois já tive problemas para achar “códigos” na view.
E dba_source é logicamente mais completa que user_source.
-
AuthorPosts
- You must be logged in to reply to this topic.