Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

dbandre29

Para os Dbas da pra fazer

Recommended Posts

tenho umas procedures cabeludas aqui, ja estava feito por outro DBA . Elas são feitas para gerar um relatório , porém dentro da PROC .Dentro da mesma tem cursores e variaveis que são usadas em um select campo into from tabela que depois será inserida numa tabela temporaria que mostrará a saída da PROC .O problema é que na procedure você pode consultar por diversos parametros e pode ter diversos tipos de retornos. Bem eu trabalho com Oracle 8 , voces acham que da pra fazer uma SnapShot com esses seguintes contextos apresesntados acima :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hello,

 

Dá sim para criar uma SNAPSHOT dentro da procedure, desde quê, na sua outra base de dados também tenha a mesma tabela com a mesma estrutura, assim, o SQL irá conseguir funcionar perfeitamente.

 

Lembre-se que dar os GRANTS para o usuário que irá fazer o DBLINK!

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/bye1.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala irmão da uma olhada numa delas

 

 

PROCEDURE SP_REPORT_GRP

 

 

( PE_GRP_EMP IN NUMBER,

PE_TP_FILTRO_RECEITA_VOZ IN VARCHAR2,

PE_RECEITA_VOZ IN VARCHAR2,

PE_TIPOFILTRORECEITADADOS IN VARCHAR2,

PE_RECEITA_DADOS IN VARCHAR2,

PE_TIPOFILTRORECEITATELEFONICA IN VARCHAR2,

PE_RECEITA_TELEFONIA IN VARCHAR2,

PE_TIPOFILTRORECEITAINTERNET IN VARCHAR2,

PE_RECEITA_INTERNET IN VARCHAR2,

 

 

PE_DIPO_CD IN VARCHAR2

, PS_USUA_LOGIN IN VARCHAR2

, PS_RETORNO OUT PKG_SHOW_RESULTS.T_SHOW )

 

IS

 

V_ERROR VARCHAR2(1000);

V_DT_MOV VARCHAR2(6);

V_TOTAL_VOZ NUMBER(20,2);

V_TOTAL_DADOS NUMBER(20,2);

V_TOTAL_TELEFONIA NUMBER(20,2);

V_TOTAL_INTERNET NUMBER(20,2);

v_SQL_W VARCHAR2(4000);

 

 

CURSOR cGRUPO

IS

SELECT GRCE.GRCE_ID

, GRCE_DS

, GRCE.DIPO_CD

FROM GRUPO_CLIENTE_EBT GRCE, CLIENTE_PORTAL CLIE

WHERE GRCE.GRCE_CLIENTE_CONTROLADOR = CLIE.CLIE_CODIGO

AND RTRIM(CLIE.CLIE_SG_COORDENADOR_LOCAL) IN( SELECT RTRIM(A.DS_DIRET_REGIO )

FROM DIRETORIA A , DIRETORIA_X_USUARIO_CONTATO B

WHERE B.USUA_NM_LOGIN = PS_USUA_LOGIN

AND A.CD_DIRET_REGIO = B.CD_DIRET_REGIO

UNION SELECT PE_DIPO_CD FROM DUAL

WHERE PE_DIPO_CD IS NOT NULL

-- Importante lembrar que se nao passo a diretoria isso quer dizer que nao é um usuario

-- do MVR

)

ORDER BY GRCE.GRCE_DS;

 

 

BEGIN

 

DELETE FROM TM_GRUPOS_RECEITAS;

 

-- Recupera a maior data de valor de

 

-- 3CON - elimina o max com full na tabela valor_dw

SELECT VADW_DT_MOV

INTO V_DT_MOV

FROM VALOR_DW_DATA_REF;

 

 

FOR rGRUPO IN cGRUPO LOOP

 

-- 3CON - inclusão da tabela GRUPO_CLIENTE_VALOR e o modelo de CONTA/SUB_CONTA

 

SELECT SUM(VADW_VL) TOTAL

INTO V_TOTAL_VOZ

FROM GRUPO_CLIENTE_EBT GRCE

, GRUPO_CLIENTE_X_CLIENTE GRCC

, VALOR_DW V

, GRUPO_CLIENTE_VALOR gv

WHERE GRCE.GRCE_ID = GRCC.GRCE_ID

AND GRCE.GRCE_ID = rGRUPO.GRCE_ID

AND GV.CLIE_CONTA = SUBSTR(GRCC.CLIE_CODIGO,1,11)

AND GV.VADW_DT_MOV = V_DT_MOV

AND GV.TIVD_ID = 4

and v.vadw_id = gv.vadw_id ;

 

SELECT SUM(VADW_VL) TOTAL

INTO V_TOTAL_DADOS

FROM GRUPO_CLIENTE_EBT GRCE

, GRUPO_CLIENTE_X_CLIENTE GRCC

, VALOR_DW V

, GRUPO_CLIENTE_VALOR gv

WHERE GRCE.GRCE_ID = GRCC.GRCE_ID

AND GRCE.GRCE_ID = rGRUPO.GRCE_ID

AND GV.CLIE_CONTA = SUBSTR(GRCC.CLIE_CODIGO,1,11)

AND GV.VADW_DT_MOV = V_DT_MOV

AND GV.TIVD_ID = 6

and v.vadw_id = gv.vadw_id ;

 

 

SELECT SUM(VADW_VL) TOTAL

INTO V_TOTAL_TELEFONIA

FROM GRUPO_CLIENTE_EBT GRCE

, GRUPO_CLIENTE_X_CLIENTE GRCC

, VALOR_DW V

, GRUPO_CLIENTE_VALOR gv

WHERE GRCE.GRCE_ID = GRCC.GRCE_ID

AND GRCE.GRCE_ID = rGRUPO.GRCE_ID

AND GV.CLIE_CONTA = SUBSTR(GRCC.CLIE_CODIGO,1,11)

AND GV.VADW_DT_MOV = V_DT_MOV

AND GV.TIVD_ID = 5

and v.vadw_id = gv.vadw_id ;

 

 

SELECT SUM(VADW_VL) TOTAL

INTO V_TOTAL_INTERNET

FROM GRUPO_CLIENTE_EBT GRCE

, GRUPO_CLIENTE_X_CLIENTE GRCC

, VALOR_DW V

, GRUPO_CLIENTE_VALOR gv

WHERE GRCE.GRCE_ID = GRCC.GRCE_ID

AND GRCE.GRCE_ID = rGRUPO.GRCE_ID

AND GV.CLIE_CONTA = SUBSTR(GRCC.CLIE_CODIGO,1,11)

AND GV.VADW_DT_MOV = V_DT_MOV

AND GV.TIVD_ID = 3

and v.vadw_id = gv.vadw_id ;

 

INSERT INTO TM_GRUPOS_RECEITAS

VALUES (rGRUPO.GRCE_ID

,rGRUPO.GRCE_DS

,rGRUPO.DIPO_CD

,V_TOTAL_VOZ

,V_TOTAL_DADOS

,V_TOTAL_TELEFONIA

,V_TOTAL_INTERNET);

 

END LOOP;

 

 

 

 

 

IF ((PE_TP_FILTRO_RECEITA_VOZ is NULL) AND

(PE_TipoFiltroReceitaDados is NULL) AND

(PE_TipoFiltroReceitatelefonica is NULL) AND

(PE_TipoFiltroReceitaInternet is NULL)) THEN

 

v_SQL_W:= 'SELECT * FROM TM_GRUPOS_RECEITAS';

ELSE

 

v_SQL_W:='SELECT * FROM TM_GRUPOS_RECEITAS WHERE GRUPO_ID IS NOT NUL';

 

 

 

If ( PE_TP_FILTRO_RECEITA_VOZ Is Not Null ) Then

 

If PE_TP_FILTRO_RECEITA_VOZ='>' then

 

 

v_SQL_W := v_SQL_W || ' AND UPPER(TOTAL_VOZ) > ''' || PE_Receita_Voz ||

''' ';

 

End If;

 

 

If PE_TP_FILTRO_RECEITA_VOZ='<' then

 

 

v_SQL_W := v_SQL_W || ' AND UPPER(TOTAL_VOZ) < ''' || PE_Receita_Voz ||

''' ';

 

End If;

 

If PE_TP_FILTRO_RECEITA_VOZ='=' then

 

 

v_SQL_W := v_SQL_W || 'AND UPPER(TOTAL_VOZ) = ''' || PE_Receita_Voz ||

''' ';

 

End IF;

END IF;

 

If ( PE_TipoFiltroReceitaDados Is Not Null ) Then

 

IF PE_TipoFiltroReceitaDados='>' THEN

 

 

v_SQL_W := v_SQL_W || 'AND UPPER(TOTAL_DADOS) > ''' || PE_Receita_Dados||

''' ';

END IF;

 

IF PE_TipoFiltroReceitaDados='<' THEN

 

 

v_SQL_W := v_SQL_W || 'AND UPPER(TOTAL_DADOS) < ''' || PE_Receita_Dados||

''' ';

END IF;

 

IF PE_TipoFiltroReceitaDados='=' THEN

 

 

v_SQL_W := v_SQL_W || 'AND UPPER(TOTAL_DADOS) = ''' || PE_Receita_Dados||

''' ';

END IF;

END IF;

 

If ( PE_TipoFiltroReceitatelefonica Is Not Null ) Then

 

IF PE_TipoFiltroReceitatelefonica='>' THEN

 

 

v_SQL_W := v_SQL_W || 'AND UPPER(TOTAL_TELEFONIA) >''' || PE_Receita_Telefonia||

''' ';

END IF;

 

IF PE_TipoFiltroReceitatelefonica='<' THEN

 

 

v_SQL_W := v_SQL_W || 'AND UPPER(TOTAL_TELEFONIA) < ''' || PE_Receita_Telefonia||

''' ';

END IF;

 

IF PE_TipoFiltroReceitatelefonica='=' THEN

 

 

v_SQL_W := v_SQL_W || 'AND UPPER(TOTAL_TELEFONIA) =''' || PE_Receita_Telefonia||

''' ';

END IF;

END IF;

 

 

If ( PE_TipoFiltroReceitaInternet Is Not Null ) Then

 

IF PE_TipoFiltroReceitaInternet='>' THEN

 

 

v_SQL_W := v_SQL_W || 'AND UPPER(TOTAL_INTERNET) > ''' || PE_Receita_Internet||

''' ';

END IF;

 

IF PE_TipoFiltroReceitaInternet='<' THEN

 

 

v_SQL_W := v_SQL_W || 'AND UPPER(TOTAL_INTERNET) < ''' || PE_Receita_Internet||

''' ';

END IF;

 

IF PE_TipoFiltroReceitaInternet='=' THEN

 

 

v_SQL_W := v_SQL_W || 'AND UPPER(TOTAL_INTERNET) = ''' || PE_Receita_Internet||

''' ';

END IF;

END IF;

 

END IF;

 

 

 

 

 

 

OPEN PS_RETORNO FOR v_SQL_W;

 

DELETE FROM TM_GRUPOS_RECEITAS;

 

COMMIT;

 

EXCEPTION

WHEN OTHERS THEN

V_ERROR := 'ERRO NA EXECUCãO DA PROCEDURE (SP_SHOW_GRUPOS_RECEITAS) ! ' || SQLERRM;

Raise_Application_Error( -20001, V_ERROR );

END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais para que você quer criar uma SNAPSHOT? Qual o motivo do SNAPSHOT!

 

Esses cursores lê tabelas com quantas linhas? Tem índices nessas tabelas?

 

Tem analyze também para diminuir o custo do SELECT?

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

viu a proc o que você achou ela nao retorna muitas linhas meu deu entender o escopo dela né , sobre indices tem sim , mas o qual sua opinião ?você acha vantajoso criar SnapShot ?Cara pra ser sincero o que é analise, e pra analisar estatistica

Compartilhar este post


Link para o post
Compartilhar em outros sites

Novamente... Para quê você quer colocar um SNAPSHOT? Pelo que tô vendo a PROC pode ser um pouco melhorada e pode fazer um TUNING no banco! Abraços, :blink:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Rodrigo o que eu queria escutar de você é isso?Não há uma necessidade então de fazer uma SnapShot, mas veja bem qual o comando no Oracle que eu vejo a fragmentação de indices nas tabelas .Cara obrigadão pela força.[]s, André

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para você ver a fragmentação, você terá que fazer um SELECT do tamanho total da ìndice, dividido pelo tamanho total e saber quantos EXTENTS estão alocados para esse índice e verificar a marca d' água.

 

Logo, Logo eu posto um scripts do Fórum de Scrips para verificar a fragmentação.

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.