<?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>Dia a dia Oracle &#187; database</title>
	<atom:link href="http://www.diaadiaoracle.com.br/category/database/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.diaadiaoracle.com.br</link>
	<description></description>
	<lastBuildDate>Mon, 01 Aug 2011 22:36:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Oracle Tuning &#8211; Exportando Estatísticas de Tabelas</title>
		<link>http://www.diaadiaoracle.com.br/2011/08/01/oracle-tuning-exportando-estatisticas-de-tabelas/</link>
		<comments>http://www.diaadiaoracle.com.br/2011/08/01/oracle-tuning-exportando-estatisticas-de-tabelas/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 22:36:23 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[pl/sql]]></category>
		<category><![CDATA[procedures]]></category>
		<category><![CDATA[query]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=98</guid>
		<description><![CDATA[Fala PessoAll, Depois de muito tempo sem postar, estou eu aqui de novo para falar de mais um recurso usado no nosso Diaadia. Desta vez o problema foi o seguinte: Temos uma base de produção 9i que está em plena fase de migração para 11g, claro que para que esta migração aconteça, temos que ter [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoAll,</p>
<p>Depois de muito tempo sem postar, estou eu aqui de novo para falar de mais um recurso usado no nosso Diaadia.</p>
<p>Desta vez o problema foi o seguinte:</p>
<p>Temos uma base de produção 9i que está em plena fase de migração para 11g, claro que para que esta migração aconteça, temos que ter a homologação de vários sistemas em 11g, que atualmente rodam na nossa base de produção 9i. Em uma das homologações deste sistema, o analista nos acionou informando que um processo que rodava na base 9i em 10 minutos, já estava a mais de 1 hora rodando na base 11g, sem sucesso.</p>
<p>Vamos as análises&#8230;</p>
<p>Passo 1: Identificar que comando estava causando nosso problema, para isso solicitei ao analista rodar a rotina dele habilitando um trace, para tentarmos identificar. Foi solicitado adicionar os seguintes comandos na execução:</p>
<p><code>begin<br />
   --Habilita geracao do trace.<br />
   execute immediate('alter session set tracefile_identifier=''TRACE_PROC_LENTA''');<br />
   sys.dbms_support.start_trace(true, true);<br />
   -- Call the procedure<br />
   PROCEDURE_DO_ANALISTA_LENTA;<br />
   --Finaliza geracao do trace.<br />
   sys.DBMS_SUPPORT.STOP_TRACE;<br />
end;<br />
/</code></p>
<p>Após concluído o processo, temos que procurar na nossa pasta UDUMP o trace que foi gerado com o identificador &#8220;_TRACE_PROC_LENTA&#8221;.</p>
<p>Analisando o trace&#8230;<br />
<code><br />
call     count       cpu    elapsed       disk      query    current        rows<br />
------- ------  -------- ---------- ---------- ---------- ----------  ----------<br />
Parse      791      0.02       1.25          0          3          0           0<br />
Execute  72124      9.77     127.63        365       3759      75246        7469<br />
Fetch    81349    109.26    2466.37     229643   14999926          0       75146<br />
------- ------  -------- ---------- ---------- ---------- ----------  ----------<br />
total   154264    119.05    2595.27     230008   15003688      75246       82615<br />
</code></p>
<p>Identificamos que o processo rodou em 2595.27 segundos, total!</p>
<p>E temos um comando único, que rodou em 2289.73 segundos. Ficou claro que este é o culpado não??</p>
<p><code><br />
select COL1, COL2, COL3 from MINHA_TABELA</p>
<p>call     count       cpu    elapsed       disk      query    current        rows<br />
------- ------  -------- ---------- ---------- ---------- ----------  ----------<br />
Parse        1      0.00       0.00          0          0          0           0<br />
Execute   5430      1.11       3.54          0          0          0           0<br />
Fetch     5430    106.61    2286.19     222786   14703253          0        3431<br />
------- ------  -------- ---------- ---------- ---------- ----------  ----------<br />
total    10861    107.72    2289.73     222786   14703253          0        3431</p>
<p>Misses in library cache during parse: 0<br />
Optimizer mode: ALL_ROWS<br />
Parsing user id: 214  (OWNER)   (recursive depth: 1)</p>
<p>Rows     Row Source Operation<br />
-------  ---------------------------------------------------<br />
      1  TABLE ACCESS BY INDEX ROWID MINHA_TABELA (cr=7 pr=0 pw=0 time=68 us cost=5 size=33 card=1)<br />
     13   INDEX RANGE SCAN MINHA_TABELA_IDX2 (cr=4 pr=0 pw=0 time=40 us cost=4 size=0 card=1)(object id 32870)<br />
</code></p>
<p>Como podemos ver, este select está sendo executado utilizando um índice, o MINHA_TABELA_IDX2. Ótimo, agora vamos comparar este plano de execução, com o plano de execução que temos em produção. Eis o plano de produção: </p>
<p><code><br />
Rows     Row Source Operation<br />
-------  ---------------------------------------------------<br />
      1  TABLE ACCESS BY INDEX ROWID MINHA_TABELA (cr=7 pr=0 pw=0 time=68 us cost=5 size=33 card=1)<br />
     13   INDEX RANGE SCAN MINHA_TABELA_PK (cr=4 pr=0 pw=0 time=40 us cost=4 size=0 card=1)<br />
</code></p>
<p>Opa&#8230;. qual a diferença? Nesta base a minha query acessa os dados pela PK, e não pelo índice! Matamos a parada!!! </p>
<p>Como resolver?</p>
<p>A base onde a homologação estava sendo feita era uma base 11g criada com uma cópia antiga de produção, que não vinha sendo coletada estatística, que estava sendo constantemente alterada pelos testes e que não estava 100%. Para coletar estatísticas novamente desta tabela, seria mais complicado e demorado, pois a tabela tem 667.000.000 de linhas, claro, o teste tem que ser agora!!!!</p>
<p>Lembramos então que tinhamos uma cópia fresquinha da base de produção, que tinha sido recém migrada para 11g, ou seja, estava em 11g, mas tinha as estatísticas certinhas de produção, onde a query estava rápida.</p>
<p>A solução encontrada foi: <b>Exportar as estatísticas desta tabela</b>.</p>
<p>Então, vamos lá&#8230;</p>
<p>Passo 1: Criar uma tabela de estatísticas na base origem, para receber as estatísticas atuais da tabela:</p>
<p><code><br />
SQL> exec SYS.DBMS_STATS.CREATE_STAT_TABLE(ownname => 'DBAGABOS', stattab => 'TLISTENER_STATS');<br />
Procedimento PL/SQL concluÝdo com sucesso.<br />
SQL><br />
</code></p>
<p>Passo 2: Exportar as estatísticas atuais da tabela na base de origem, para a tabela de esatísticas que você criou:</p>
<p><code><br />
SQL> exec DBMS_STATS.EXPORT_TABLE_STATS(ownname => 'DBAGABOS', tabname => 'TLISTENER', stattab => 'TLISTENER_STATS', cascade => true);<br />
Procedimento PL/SQL concluÝdo com sucesso.<br />
SQL><br />
</code></p>
<p>Passo 3: Exportar esta tabela gerada&#8230;</p>
<p><code><br />
C:\Users\GersonJr>exp dbagabos@orcl tables=TLISTENER_STATS file=dump_stats.dmp<br />
Export: Release 10.2.0.3.0 - Production on Seg Ago 1 19:23:58 2011<br />
Copyright (c) 1982, 2005, Oracle.  All rights reserved.<br />
Senha:<br />
Conectado a: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production<br />
With the Partitioning, OLAP and Data Mining options<br />
ExportaþÒo executada no conjunto de caracteres de WE8MSWIN1252  e no conjunto de caracteres de AL16UTF16 NCHAR<br />
Sobre exportar tabelas especificadas ... via Caminho Convencional ...<br />
. . exportando tabela                TLISTENER_STATS          113 linhas exportadas<br />
ExportaþÒo encerrada com sucesso, sem advertÛncias.<br />
C:\Users\GersonJr><br />
</code></p>
<p>Passo 4: Importar a tabela de estatísticas que você exportou, no banco de destino&#8230;</p>
<p><code><br />
C:\Users\GersonJr>imp dbagabos@orcl_destino tables=TLISTENER_STATS file=dump_stats.dmp<br />
Import: Release 10.2.0.3.0 - Production on Seg Ago 1 19:24:58 2011<br />
Copyright (c) 1982, 2005, Oracle.  All rights reserved.<br />
Senha:<br />
Conectado a: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production<br />
With the Partitioning, OLAP and Data Mining options<br />
Arquivo de exportaþÒo criado por EXPORT:V10.02.01 via caminho convencional<br />
AdvertÛncia: os objetos foram exportados por DBAGABOS; nÒo por vocÛ<br />
importaþÒo realizada nos conjuntos de caracteres WE8MSWIN1252 e NCHAR AL16UTF16<br />
. importando objetos de DBAGABOS para DBAGABOS<br />
. importando objetos de DBAGABOS para DBAGABOS<br />
. . importando table              "TLISTENER_STATS"          113 linhas importadas<br />
ImportaþÒo encerrada com sucesso, sem advertÛncias.<br />
C:\Users\GersonJr><br />
</code></p>
<p>Passo 5: Importar as estatísticas para a tabela, lendo da tabela de estatísticas que você importou.<br />
<code><br />
exec DBMS_STATS.IMPORT_TABLE_STATS(ownname => 'DBAGABOS', tabname => ‘TLISTENER’, stattab => ‘TLISTENER_STATS’, cascade => true, no_invalidate => true);<br />
</code></p>
<p>E agora é só você testar seu plano de execução e verificar se na base nova a query está se comportando da mesma forma que na base antiga.</p>
<p>Algumas considerações:<br />
1 &#8211; O problema ocorreu na base 11g, porém para criar o post refiz os comandos na base instalada no meu PC, que é 10.2.0.3, como podem ver nos comandos acima.</p>
<p>2 &#8211; Estes passos não querem dizer que há uma garantia 100% da sua query ficar igual a sua base de origem, lembre-se que em performance existem inúmeros outros pontos que são verificados para o banco montar um plano de execução.</p>
<p>3 &#8211; A idéia deste post é mostrar este recurso de export/import de estatísticas, que é simples e rápido de fazer, e pode ajudar-nos em vários casos.</p>
<p>Qualquer coisa, estou à disposição para dúvidas e/ou sugestões!</p>
<p>Grande abraço.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2011/08/01/oracle-tuning-exportando-estatisticas-de-tabelas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica EXPDP &#8211; COMPRESSION</title>
		<link>http://www.diaadiaoracle.com.br/2011/03/21/dica-expdp-compression/</link>
		<comments>http://www.diaadiaoracle.com.br/2011/03/21/dica-expdp-compression/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 13:57:28 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[11g]]></category>
		<category><![CDATA[exp]]></category>
		<category><![CDATA[expdp]]></category>
		<category><![CDATA[export]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=92</guid>
		<description><![CDATA[Fala PessoAll, Estive fazendo um EXPDP de uma base de aproximadamente 360Gb. nohup expdp userid=myusr/mypwd directory=DIR_EXPORT_SCHEMA dumpfile=exp_MS_MSI_18032011.dmp logfile=exp_MS_MSI_18032011.log schemas=MS,MSI status=300 Iniciei o export, e o directory DIR_EXPORT_SCHEMA estava em uma partição que tinha 112Gb livre, imaginei que o export ocorreria sem problemas, porém&#8230; de repente&#8230; erro no log, ao verificar, disco estava em 100% de [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoAll,</p>
<p>Estive fazendo um <strong>EXPDP </strong> de uma base de aproximadamente 360Gb. </p>
<p><code><br />
nohup expdp userid=myusr/mypwd directory=DIR_EXPORT_SCHEMA dumpfile=exp_MS_MSI_18032011.dmp logfile=exp_MS_MSI_18032011.log schemas=MS,MSI status=300<br />
</code></p>
<p>Iniciei o <strong>export</strong>, e o directory DIR_EXPORT_SCHEMA estava em uma partição que tinha 112Gb livre, imaginei que o export ocorreria sem problemas, porém&#8230; de repente&#8230; erro no log, ao verificar, disco estava em 100% de uso. Ou seja, ele gerou um arquivo de 112Gb!</p>
<p>Então, lembrei que no bom e velho <strong>EXP </strong> tinha um parâmetro <strong>COMPRESS </strong>e decidi ver como era agora no novo <strong>EXPDP</strong>. Verificando o Help (<code>expdp help=y</code>), encontrei o parâmetro COMPRESSION e passei a utilizá-lo no meu comando, ficando assim:</p>
<p><code><br />
nohup expdp userid=myusr/mypwd directory=DIR_EXPORT_SCHEMA dumpfile=exp_MS_MSI_18032011.dmp logfile=exp_MS_MSI_18032011.log schemas=MS,MSI compression=ALL status=300<br />
</code></p>
<p>Depois da conclusão do processo, fui ver o tamanho do arquivo e tive um baita surpresa! O dump inteiro ficou com 31Gb! Ou seja, sem compressão, chegamos em 112Gb e estourou o disco, com a compressão ficou em 31Gb. </p>
<p>Fica a dica, caso alguém tenha alguma restrição de espaço, manda bala com o <strong>COMPRESSION</strong> do <strong>EXPDP</strong> que realmente funciona, e a compressão é BEM significativa!</p>
<p>Abraços.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2011/03/21/dica-expdp-compression/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Guida de referência de SQL Básico</title>
		<link>http://www.diaadiaoracle.com.br/2010/03/08/guida-de-referencia-de-sql-basico/</link>
		<comments>http://www.diaadiaoracle.com.br/2010/03/08/guida-de-referencia-de-sql-basico/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 20:01:49 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[aula oracle]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[curso oracle]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[distinct]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[oracle 10g]]></category>
		<category><![CDATA[query]]></category>
		<category><![CDATA[select]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[basico]]></category>
		<category><![CDATA[comando sql]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=74</guid>
		<description><![CDATA[Fala pessoAll, Com a contribuição do nosso amigo e leitor Robson Cristovão, está aí um guia básico de SQL que pode ser bastante útil para quem está começando no mundo SQL e tem algumas dúvidas quanto ao uso e sitaxe de alguns comandos SQL! Fica a dica! AND &#124; OR: SELECT nome_coluna(s) FROM nome_tabela WHERE [...]]]></description>
			<content:encoded><![CDATA[<p>Fala pessoAll,</p>
<p>Com a contribuição do nosso amigo e leitor <strong>Robson Cristovão</strong>, está aí um guia básico de SQL que pode ser bastante útil para quem está começando no mundo SQL e tem algumas dúvidas quanto ao uso e sitaxe de alguns comandos SQL! Fica a dica! </p>
<p><code>AND | OR:<br />
	SELECT nome_coluna(s)<br />
	FROM    nome_tabela<br />
	WHERE condiçao<br />
	AND | OR condiçao<br />
</code></p>
<p><code>ALTER TABLE (add coluna):<br />
	ALTER TABLE nome_tabela<br />
	ADD nome_coluna datatype<br />
</code></p>
<p><code>ALTER TABLE (drop column):<br />
	ALTER TABLE nome_tabela<br />
	DROP COLUMN nome_coluna<br />
</code></p>
<p><code>AS (alias for column):<br />
	SELECT nome_coluna AS coluna_apelido<br />
	FROM nome_tabela<br />
</code></p>
<p><code>AS (alias for table):<br />
	SELECT nome_coluna<br />
	FROM nome_tabela  AS tabela_apelido<br />
</code></p>
<p><code>BETWEEN:<br />
	SELECT nome_coluna(s)<br />
	FROM nome_tabela<br />
	WHERE nome_coluna<br />
	BETWEEN valor1 AND valor2<br />
</code></p>
<p><code>CREATE (database):<br />
	CREATE DATABASE nome_base_de_dados<br />
</code></p>
<p><code>CREATE (index):<br />
	CREATE INDEX nome_indice<br />
	ON nome_tabela (nome_coluna)<br />
</code></p>
<p><code>CREATE (table):<br />
	CREATE TABLE nome_tabela(<br />
	nome_coluna1 tipo_dado,<br />
	nome_coluna2 tipo_dado,...)<br />
</code></p>
<p><code>CREATE (unique index):<br />
	CREATE UNIQUE INDEX nome_indice<br />
	ON nome_tabela (nome_coluna)<br />
</code></p>
<p><code>CREATE (view):<br />
	CREATE VIEW nome_da_view AS<br />
	SELECT nome_coluna(s)<br />
	FROM nome_tabela<br />
	WHERE condiçao<br />
</code></p>
<p><code>DELETE:<br />
	DELETE FROM nome_tabela<br />
OU<br />
	DELETE FROM nome_tabela<br />
	WHERE condiçao<br />
</code></p>
<p><code>DROP (database):<br />
	DROP DATABASE nome_base_de_dados<br />
</code></p>
<p><code>DROP (index):<br />
	DROP INDEX nome_tabela.nome_indice<br />
</code></p>
<p><code>DROP (table):<br />
	DROP TABLE nome_tabela<br />
</code></p>
<p><code>GROUP BY:<br />
	SELECT nome_coluna1,SUM(nome_coluna2)<br />
	FROM nome_tabela<br />
	GROUP BY nome_coluna1<br />
</code></p>
<p><code>HAVING:<br />
	SELECT nome_coluna1,SUM(nome_coluna2)<br />
	FROM nome_tabela<br />
	GROUP BY nome_coluna1<br />
	HAVING SUM(nome_coluna2) valor_da_condiçao<br />
</code></p>
<p><code>IN:<br />
	SELECT nome_coluna(s)<br />
	FROM nome_tabela<br />
	WHERE nome_coluna<br />
	IN (valor1,valor2,..)<br />
</code></p>
<p><code>INSERT:<br />
	INSERT INTO nome_tabela<br />
	VALUES (valor1, valor2,....)<br />
OU<br />
	INSERT INTO nome_tabela<br />
	(nome_coluna1, nome_coluna2,...)<br />
	VALUES (valor1, valor2,....)<br />
</code></p>
<p><code>LIKE:<br />
	SELECT nome_coluna(s)<br />
	FROM nome_tabela<br />
	WHERE nome_coluna<br />
	LIKE padrao<br />
</code></p>
<p><code>ORDER BY:<br />
	SELECT nome_coluna(s)<br />
	FROM nome_tabela<br />
	ORDER BY nome_coluna [ASC | DESC<br />
</code></p>
<p><code>SELECT:<br />
	SELECT nome_coluna(s)<br />
	FROM nome_tabela<br />
</code></p>
<p><code>SELECT (all):<br />
	SELECT * FROM nome_tabela<br />
</code></p>
<p><code>SELECT (distinct):<br />
	SELECT DISTINCT nome_coluna(s)<br />
	FROM nome_tabela<br />
</code></p>
<p><code>SELECT (into - usado para criar cópias auxiliares das tabelas):<br />
	SELECT * INTO new_nome_tabela<br />
	FROM original_nome_tabela<br />
OU<br />
	SELECT nome_coluna(s)<br />
	INTO new_nome_tabela<br />
	FROM original_nome_tabela<br />
</code></p>
<p><code>TRUNCATE:<br />
	TRUNCATE TABLE nome_tabela<br />
</code></p>
<p><code>UPDATE:<br />
	UPDATE nome_tabela<br />
	SET nome_coluna=novo_valor<br />
	[, nome_coluna=novo_valor]<br />
	WHERE nome_coluna = algum_valor<br />
</code></p>
<p><code>WHERE:<br />
	SELECT nome_coluna(s)<br />
	FROM nome_tabela<br />
	WHERE condiçao<br />
</code></p>
<p>Espero que gostem.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2010/03/08/guida-de-referencia-de-sql-basico/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Como descobrir quem referencia uma coluna?</title>
		<link>http://www.diaadiaoracle.com.br/2010/02/11/dica-como-descobrir-quem-referencia-uma-coluna/</link>
		<comments>http://www.diaadiaoracle.com.br/2010/02/11/dica-como-descobrir-quem-referencia-uma-coluna/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 14:46:26 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[distinct]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[pl/sql]]></category>
		<category><![CDATA[query]]></category>
		<category><![CDATA[select]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[dictionary]]></category>
		<category><![CDATA[foreign key]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=72</guid>
		<description><![CDATA[Fala PessoAll, A dica de hoje é a respeito do seguinte&#8230; Muitas vezes temos a necessidade de fazer algumas alterações nas nossas tabelas, nosso modelo, etc. E aí precisamos levantar quais tabelas recerenciam uma determinada tabela ou coluna, quais as filhas dessas colunas, quais as foreign key que fazem referência a elas e etc. Aí, [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoAll,</p>
<p>A dica de hoje é a respeito do seguinte&#8230;</p>
<p>Muitas vezes temos a necessidade de fazer algumas alterações nas nossas tabelas, nosso modelo, etc. E aí precisamos levantar quais tabelas recerenciam uma determinada tabela ou coluna, quais as filhas dessas colunas, quais as <b>foreign key</b> que fazem referência a elas e etc.</p>
<p>Aí, podemos usar o seguinte <b>select</b>:</p>
<p><code><br />
select distinct c.table_name<br />
  from dba_constraints  c,<br />
       dba_cons_columns cc<br />
 where c.constraint_type = 'R'<br />
   and cc.owner           = c.owner<br />
   and cc.constraint_name = c.r_constraint_name<br />
   and cc.owner           = &#038;SCHEMA<br />
   and cc.table_name      = &#038;TABELA<br />
   and cc.column_name     = &#038;COLUNA<br />
</code></p>
<p>Claro que temos que mudar os parâmetros &#038;SCHEMA, &#038;TABELA e &#038;COLUNA, para recuperar as tabelas que são filhas da tabela que você deseja.</p>
<p>Exemplo fica melhor não? Vamos lá:</p>
<p>Eu preciso descobrir quais as tabelas que fazem referência a alguma coluna da tabela <code>SOURCE</code>, para tal fazemos o seguinte <b>select</b>:</p>
<p><code><br />
SQL> select DISTINCT C.TABLE_NAME<br />
  2    from dba_constraints  c,<br />
  3         dba_cons_columns cc<br />
  4   where c.constraint_type = 'R'<br />
  5     and cc.owner           = c.owner<br />
  6     and cc.constraint_name = c.r_constraint_name<br />
  7     and cc.owner           = 'ORABUGIT'<br />
  8     and cc.table_name      = 'SOURCES'<br />
  9  /<br />
TABLE_NAME<br />
------------------------------<br />
PEOPLE_EQUIPS<br />
</code></p>
<p>Como podemos ver, obtemos como resposta a tabela <code>PEOPLE_EQUIPS</code>, portanto podemos ver que nesta tabela tem alguma coluna que referencia através de <b>foreign key</b> uma coluna da tabela <code>SOURCE</code>.</p>
<p>Espero que a dica seja útil!!</p>
<p>Abraços.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2010/02/11/dica-como-descobrir-quem-referencia-uma-coluna/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Potência / Expoentes em SQL e PL/SQL &#8211; Oracle</title>
		<link>http://www.diaadiaoracle.com.br/2010/02/08/potencia-expoentes-em-sql-e-plsql-oracle/</link>
		<comments>http://www.diaadiaoracle.com.br/2010/02/08/potencia-expoentes-em-sql-e-plsql-oracle/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 17:08:32 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[functions]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[oracle 10g]]></category>
		<category><![CDATA[pl/sql]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[dica sql]]></category>
		<category><![CDATA[expoente]]></category>
		<category><![CDATA[potencia]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=69</guid>
		<description><![CDATA[Fala Pessoal, Hoje vai mais uma dica de SQL e PL/SQL. Até o dia de hoje, eu nunca tinha necessitado usar expoente no SQL / PL/SQL, nunca tinha pego nenhum problema em desenvolvimento que precisasse ser usado potência, expoente e tal. Porém, hoje uma amiga desenvolvedora, Leilah, precisou dessa funcionalidade e aí discutimos um pouco [...]]]></description>
			<content:encoded><![CDATA[<p>Fala Pessoal,</p>
<p>Hoje vai mais uma dica  de SQL e PL/SQL.</p>
<p>Até o dia de hoje, eu nunca tinha necessitado usar expoente no SQL / PL/SQL, nunca tinha pego nenhum problema em desenvolvimento que precisasse ser usado potência, expoente e tal. </p>
<p>Porém, hoje uma amiga desenvolvedora, Leilah, precisou dessa funcionalidade e aí discutimos um pouco sobre o assunto. Descobri portanto, que no Oracle, não precisamos fazer muita conta e nem usar sintaxes esquisitas para usar potência e elevar um número a uma determinada potência, basta usarmos a função <b>POWER</b>, isso mesmo, funciona assim:</p>
<p>Exemplo SQL:<br />
<code><br />
SQL> select power(2,3) from dual;<br />
POWER(2,3)<br />
----------<br />
         8<br />
</code><br />
Neste exemplo, temos 2 elevado a 3, que nos dá 8 como resultado&#8230;</p>
<p>Exemplo PL/SQL:<br />
<code><br />
SQL> declare<br />
  2     v_num number;<br />
  3  begin<br />
  4     v_num := power(2,3);<br />
  5     dbms_output.put_line('O numero 2 elevado a 3 é: '||to_char(v_num));<br />
  6  end;<br />
  7  /<br />
O numero 2 elevado a 3 é: 8<br />
Procedimento PL/SQL concluÝdo com sucesso.<br />
</code></p>
<p>Pronto pessoal, fica aí a dica de utilização de potência em PL/SQL.</p>
<p>Espero que gostem.</p>
<p>Grande abraço.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2010/02/08/potencia-expoentes-em-sql-e-plsql-oracle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Oracle &#8211; SQL TRACE &#8211; TKPROF</title>
		<link>http://www.diaadiaoracle.com.br/2009/12/22/oracle-sql-trace-tkprof/</link>
		<comments>http://www.diaadiaoracle.com.br/2009/12/22/oracle-sql-trace-tkprof/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 12:02:19 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[sql trace]]></category>
		<category><![CDATA[tkprof]]></category>
		<category><![CDATA[trace]]></category>
		<category><![CDATA[tunning]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=49</guid>
		<description><![CDATA[Fala PessoAll, Estamos aqui novamente para compartilhar mais uma experiência. Dessa vez com algo bastante básico para quem quer se especializar em performance de aplicações, que é o meu caso!! Em alguns momentos na nossa vida de DBA nos deparamos com processos que são um tanto quanto complexos de serem analisados, por exemplo: Uma procedure [...]]]></description>
			<content:encoded><![CDATA[<p>Fala  PessoAll,</p>
<p>Estamos aqui novamente para compartilhar mais uma experiência.</p>
<p>Dessa vez com algo bastante básico para quem quer se especializar em performance de aplicações, que é o meu caso!!</p>
<p>Em alguns momentos na nossa vida de DBA nos deparamos com processos que são um tanto quanto complexos de serem analisados, por exemplo: Uma procedure que demora muito ou uma query que demora demais para retornar ou um procedimento inteiro que tem todas as querys otimizadas mas demora muito entre outras coisas. Para que possamos analisar estes tipos de problemas, temos um grande aliado que é o SQL_TRACE, ele vai gerar uma espécie de “relatório” com todas as query´s envolvidas no processamento, e nos mostrar o que cada query fez, o plano de execução de cada uma, quanto tempo demorou para rodar, quanto de CPU consumiu, quantas vezes foi executada, isso nos dá uma visão exata do que está ocorrendo, podendo ser até um erro de lógica na aplicação, onde por exemplo, devido a um erro uma determinada query é executada milhares de vezes sem necessidade.</p>
<p>Hoje vou mostrar como fazemos para gerar um trace de uma determinada operação no banco e como formatar este trace de forma que possamos ler e entender o passo a passo da execução. Vamos lá!</p>
<p>O primeiro passo é alterar a sessão que o processo vai rodar para que o trace seja gerado, isso pode ser feito com o comando:</p>
<p>ALTER SESSION SET SQL_TRACE=TRUE;</p>
<p>Após este commando, podemos executar a nossa rotina lenta, que um arquivo será gerado com o que esta rotina fez.</p>
<p>Begin<br />
   Nossa_Rotina_Lenta(1,4,4);<br />
End;</p>
<p>Após a conclusão do processamento, devemos ir até o local onde foi gerado o arquivo, no meu caso, o arquivo é gerado no caminho: {ORACLE_BASE}\admin\negraod\udump</p>
<p>Se você tentar abrir o arquivo gerado, possivelmente não vai conseguir entender nada! Para que nosso arquivo fique legível, vamos usar um utilitário chamado TKPROF. Esse utilitário tem como objetivo interpretar o trace e deixar ele num formato legível.</p>
<p>O uso do TKPROF é da seguinte forma: tkprof trace.trc arquivo_saida.txt explain=usuário/senha@banco</p>
<p>Depois deste comando executado, no seu arquivo de saída, terá um conteúdo parecido com este:</p>
<p>********************************************************************************<br />
count    = Numero de vezes que o procedimento foi executado<br />
cpu      = Tempo em segundos executando pelo CPU<br />
elapsed  = Tem em segundos para execução do procedimento<br />
disk     = Numero de leituras físicas no disco<br />
rows     = Numero de linhas processadas pelo comando<br />
********************************************************************************</p>
<p> SELECT COUNT(*)<br />
 FROM   dual</p>
<p>call    count    cpu elapsed    disk   query current     rows<br />
&#8212;&#8212;- &#8212;&#8211;  &#8212;&#8211; &#8212;&#8212;- &#8212;&#8212;- &#8212;&#8212;- &#8212;&#8212;-  &#8212;&#8212;-<br />
Parse       1   0.02    0.02       0       0       0        0<br />
Execute     1   0.00    0.00       0       0       0        0<br />
Fetch       2   0.00    0.00       0       1       4        1<br />
&#8212;&#8212;- &#8212;&#8211;  &#8212;&#8211; &#8212;&#8212;- &#8212;&#8212;- &#8212;&#8212;- &#8212;&#8212;-  &#8212;&#8212;-<br />
total       4   0.02    0.02       0       1       4        1</p>
<p>Misses in library cache during parse: 1<br />
Optimizer goal: CHOOSE<br />
Parsing user id: 121  </p>
<p>Rows     Row Source Operation<br />
&#8212;&#8212;-  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
      1  SORT AGGREGATE<br />
      1   TABLE ACCESS FULL DUAL</p>
<p>Neste exemplo, conseguimos ler e ver o que aconteceu com a query, além do plano de execução que ela utilizou para executar.</p>
<p>Depois disso é analisar as query´s mais complexas e atacar na mudança delas, em muitos casos é necessário a mudança da lógica da rotina, para que se possa ganhar alguma performance!</p>
<p>É isso pessoal. Espero que ajude vocês!</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2009/12/22/oracle-sql-trace-tkprof/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizando Compartilhamento Windows no Linux</title>
		<link>http://www.diaadiaoracle.com.br/2009/11/13/utilizando-compartilhamento-windows-no-linux/</link>
		<comments>http://www.diaadiaoracle.com.br/2009/11/13/utilizando-compartilhamento-windows-no-linux/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 20:40:14 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[oracle security]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[compartilhamento]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[rede]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=46</guid>
		<description><![CDATA[Fala PessoAll, Bom, hoje tivemos mais um desafio bem interessante. Recebemos um dump de um determinado cliente, o arquivo de dump (X.dmp) veio com 260Gb em um único arquivo. Infelizmente, na máquina Linux onde a base está instalada não tinha nenhum disco com esta quantidade de espaço livre. E agora pra importar esse dump?? Vasculhamos [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoAll,</p>
<p>Bom, hoje tivemos mais um desafio bem interessante.</p>
<p>Recebemos um dump de um determinado cliente, o arquivo de dump (X.dmp) veio com 260Gb em um único arquivo. Infelizmente, na máquina Linux onde a base está instalada não tinha nenhum disco com esta quantidade de espaço livre. E agora pra importar esse dump??</p>
<p>Vasculhamos nossos servidores e achamos um servidor com mais de 260Gb livre, dando sopa! Que beleza, problema resolvido! </p>
<p>Idéia 1: Descompactamos os 260Gb neste servidor e a partir dele fazemos o import na máquina destino, tudo certo! NÃO! Este servidor roda Oracle 10G e o servidor de destino roda Oracle 9i, não funciona! Que falta de sorte!</p>
<p>Idéia 2: Descompactamos neste servidor e através da rede, criamos um mapeamento da máquina onde será importado, para esta máquina que tem espaço sobrando e tudo certo! Ok? NÃO de novo. O servidor que tem esse espaço é um Windows 2003 Server, e a máquina onde a base está rodando e o dump teria que ser importada, estava rodando Linux&#8230; Red Hat Enterprise. </p>
<p>Mas&#8230; porque não? Será que não tem como fazer? Pesquisando na internet achei alguns sites que explicavam como fazer e aí decidi testar. E, para alegrar ainda mais minha sexta-feira, funcionou beleza! Como se fosse uma pasta na máquina Linux.</p>
<p>Segue o passo a passo:</p>
<p><code><br />
<b>Inicialmente deve-se verificar os compartilhamentos disponíveis na máquina destino</b><br />
 [oracle@oracle9i oracle]$ smbclient -L 192.168.0.13 -U oracle<br />
Password:<br />
        Sharename      Type      Comment<br />
        ---------      ----      -------<br />
        IPC$           IPC       IPC remoto<br />
        D$             Disk      Recurso compartilhado padrÃ£o<br />
        RV             Disk<br />
        SQLLDR         Disk<br />
        ADMIN$         Disk      AdministraÃ§Ã£o remota<br />
        C$             Disk      Recurso compartilhado padrÃ£o</p>
<p><b>Em seguida deve-se conectar como SU</b><br />
 [oracle@oracle9i oracle]$ su -<br />
Password:</p>
<p><b>Depois deve ser criada a pasta que irá exibir os dados do compartilhamento</b><br />
[root@oracle9i root]# mkdir /mnt/Dump</p>
<p><b>Depois deve ser executado o commando que efetivamente vai  criar o link</b><br />
 [root@oracle9i root]# mount -t smbfs -o username=oracle,password=oracle01 //192.168.0.13/SQLLDR /mnt/Dump</p>
<p><b>Depois disso já podemos listar o conteúdo da pasta, que já será exibido o conteúdo do mapeamento em questão</b><br />
[root@oracle9i root]# ls /mnt/Dump<br />
IN<br />
</code></p>
<p>É isso!</p>
<p>Espero que seja útil também pra vocês!</p>
<p>Grande abraço.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2009/11/13/utilizando-compartilhamento-windows-no-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notebook com Windows 7 para um DBA</title>
		<link>http://www.diaadiaoracle.com.br/2009/11/06/notebook-com-windows-7-para-um-dba/</link>
		<comments>http://www.diaadiaoracle.com.br/2009/11/06/notebook-com-windows-7-para-um-dba/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 12:11:30 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[oracle 10g]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dba]]></category>
		<category><![CDATA[seven]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[windows 7]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=43</guid>
		<description><![CDATA[Fala PessoAll, Creio que muita gente está pensando e vivendo um grande dilema: Migro ou não para o Windows 7. Comprei uma máquina nova, um Dell Vostro 1320, como todas as máquinas recentes eu tinha direito ao upgrade gratuito do Vista para o Windows 7, e claro eu decidi arriscar instalar o 7 pra ver [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoAll,</p>
<p>Creio que muita gente está pensando e vivendo um grande dilema: <b>Migro ou não para o Windows 7</b>.</p>
<p>Comprei uma máquina nova, um Dell Vostro 1320, como todas as máquinas recentes eu tinha direito ao upgrade gratuito do <b>Vista</b> para o <b>Windows 7</b>, e claro eu decidi arriscar instalar o 7 pra ver como sairia no ambiente de trabalho, enfim no dia a dia de um DBA.</p>
<p>Meio receioso&#8230; com o CD do <b>XP Professional</b> do lado, para que em caso de problemas, não perdesse tempo, iniciei a instalação.</p>
<p>Primeira coisa: Particionar o HD, claro&#8230; C:\ e D:\, arquivos todos no D:\ e S.O no C:\ em caso de problemas&#8230; Formata apenas o C:\, instala o S.O novo e tá tudo certo!</p>
<p>Para este passo, evitando quebrar cabeça, pesquisei alguém que já tivesse feito algo e achei um vídeo no <a href="http://www.youtube.com" target="top">Youtube</a> que explicava direitinho como fazer. O vídeo é <a href="http://www.youtube.com/watch?v=_4TXV3NDHII" target="top">Como Formatar um Computador e instalar o Windows 7</a>. Claro que eu já tinha uma noção boa, mas usando Windows XP&#8230; o vídeo serve só pra conferir se não tem nenhuma particularidade, e não tem!</p>
<p>Pronto&#8230; <b>Windows 7 Ultimate</b> instalado! Rodando 100%</p>
<p>Agora vem o desafio, instalar o <b>Oracle</b>!</p>
<p>Pesquisei em alguns sites, e confirmei que existe uma versão do <b>Oracle</b> para <b>Windows Vista</b> e que funciona no <b>Windows 7</b>. Como todo e qualquer download de produtos Oracle, fui até o OTN (http://otn.oracle.com) e dei uma pesquisada nas versões disponíveis do <b>Database</b>, e encontrei a tal versão para Vista, que pode ser encontrada no link: <a href="http://download-llnw.oracle.com/otn/nt/oracle10g/10203/10203_vista_w2k8_x86_production_db.zip" target="top">Oracle 10g  para Windows Vista e 2k8</a>, depois do download, fiz a instalação! Ele deu um erro dizendo que o S.O não era homologado para aquela versão do <b>Oracle</b>. Solução: Marcar o checkbox dizendo que tá sabendo, mas quer instalar assim mesmo! Pronto. Instalado, <b>Oracle</b> no ar, rodando, sem problema algum! Já dei shutdown/startup pra ver se ia subir numa boa, e até então tudo certo!</p>
<p>Depois disso vem as nossas queridas ferramentas! Tão importantes no nosso dia a dia!</p>
<p>Até então estão instaladas e funcionando normalmente:</p>
<p>- PL/SQL Developer (FrontEnd Oracle)<br />
- Toad (FrontEnd Oracle)<br />
- UltraEdit (Editor poderoso de Texto)<br />
- UltraVNC (Irmão do VNC fee e mais poderodo)<br />
- One Studio (Ferramenta de controle de solicitações)<br />
- Putty (Ferramenta de conexões com ambientes Unix)</p>
<p>Tudo isso funcionando normalmente, como se fosse o bom e velho XP, só que muito mais rápido e muito mais bonito!</p>
<p>As demais atividades que precisamos fazer como DBA, podemos conectar via Terminal Server e fazer sem problemas, como sempre fizemos! No mais, está tudo certo! Rodando, funcionando e aprovado!</p>
<p>Estou agora desfrutando da novidade, como diria Jessier Quirino: &#8220;Eu ando é na frente, feito bengala de cego!&#8221;</p>
<p>Abraço a todos.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2009/11/06/notebook-com-windows-7-para-um-dba/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Job não executa no Oracle 8i (DBA)</title>
		<link>http://www.diaadiaoracle.com.br/2009/10/23/job-nao-executa-no-oracle-8i-dba/</link>
		<comments>http://www.diaadiaoracle.com.br/2009/10/23/job-nao-executa-no-oracle-8i-dba/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 13:16:44 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[automatizar tarefas.]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=41</guid>
		<description><![CDATA[Fala PessoALL, Bom, ontem me deparei com mais um pequeno probleminha&#8230; Criei um Job em um banco de dados Oracle 8i, o job estava criado certinho, com as datas de Next_Sec setadas, ou seja, tudo perfeito pra rodar. Pra confirmar se a procedure do Job estava ok, executei manualmente o Job, pra ver se seria [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoALL,</p>
<p>Bom, ontem me deparei com mais um pequeno probleminha&#8230;<br />
Criei um <b>Job</b> em um <b>banco de dados Oracle 8i</b>, o job estava criado certinho, com as datas de <b>Next_Sec</b> setadas, ou seja, tudo perfeito pra rodar. Pra confirmar se a procedure do Job estava ok, executei manualmente o Job, pra ver se seria alimentado o campo <b>Failures</b>, ou se manteria 0 (zero).</p>
<p>Executei manualmente assim:<br />
<code><br />
begin<br />
   dbms_job.run(1);<br />
end;<br />
</code></p>
<p>Depois conferi e Failures permanecia 0 (zero), perfeito. Era só esperar a próxima hora de execução (Next_Sec) e ele rodaria perfeitamente! No horário esperado&#8230; cadê??? Nada do Job executar!</p>
<p>Aí vamos as pesquisas&#8230; recorri ao grupo <b>GPOracle</b> e aí me veio a dica: &#8220;Dá uma olhada no parâmetro <b>JOB_QUEUE_PROCESSES</b>&#8220;. </p>
<p>Então vamos lá, olhar o parâmetro:</p>
<p><code><br />
SQL> select name, value from v$parameter where name like '%job_queue%';</p>
<p>NAME                        VALUE<br />
---------------------  ------------------<br />
job_queue_processes   0<br />
</code></p>
<p>Hum&#8230; está como 0 (zero), ou seja, estou dizendo pro banco que nenhum processo de Job vai rodar na minha base.</p>
<p>Beleza, então vamos alterar este parâmetro.</p>
<p>Supondo que você está conectado com um usuário com tal privilégio&#8230;</p>
<p><code><br />
SQL> alter system set job_queue_processes=10;</p>
<p>Sistema alterado.</p>
<p>SQL> select name, value from v$parameter where name like '%job_queue%';</p>
<p>NAME                        VALUE<br />
---------------------  ------------------<br />
job_queue_processes   10<br />
</code></p>
<p>Pronto! Como este parâmetro é dinâmico, seu banco já está ok! Seus Job&#8217;s já vão funcionar normalmente.</p>
<p>Lembrando que para que a alteração se mantenha em um possível shutdown -> startup no seu banco, é necessário que no arquivo <code>initBASE.ora</code> deve ser adicionada a linha  <code>job_queue_processes=10</code> para que na inicialização este parâmetro seja devidamente carregado.</p>
<p>É isso gente, espero que seja útil pra vocês!!</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2009/10/23/job-nao-executa-no-oracle-8i-dba/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Validando Digito Verificador Inscrição Estadual Bahia (BA)</title>
		<link>http://www.diaadiaoracle.com.br/2009/10/22/validando-digito-verificador-inscricao-estadual-bahia-ba/</link>
		<comments>http://www.diaadiaoracle.com.br/2009/10/22/validando-digito-verificador-inscricao-estadual-bahia-ba/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 12:15:26 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[functions]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[oracle 10g]]></category>
		<category><![CDATA[pl/sql]]></category>
		<category><![CDATA[digito verificador IE]]></category>
		<category><![CDATA[inscricao estadual]]></category>
		<category><![CDATA[validar dig verificador]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=39</guid>
		<description><![CDATA[Fala PessoAll, Bom, como toda e boa pessoa normal, de vez em quando bate a saudade das épocas de desenvolvimento, de quebrar cabeça para fazer alguns códigos &#8220;ninja&#8221; pra resolver alguns problemas do nosso Dia a Dia (Oracle, rsrs). Otem me deparei com a demanda de um amigo, precisando fazer uma validação do dígito da [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoAll,</p>
<p>Bom, como toda e boa pessoa normal, de vez em quando bate a saudade das épocas de desenvolvimento, de quebrar cabeça para fazer alguns códigos &#8220;ninja&#8221; pra resolver alguns problemas do nosso Dia a Dia (Oracle, rsrs).</p>
<p>Otem me deparei com a demanda de um amigo, precisando fazer uma validação do dígito da Inscrição estadual da Bahia, em PL/SQL. Vamos lá!</p>
<p>Primeiro passo: Pesquisar como se faz a validação do dígito verificador da inscrição estadual da BAHIA!! BAHIA!! Ninguém melhor que a Sefaz/BA pra me dizer isso. Então, fui no site da SEFAZ/BA e achei como fazer a validação, depois foi só cair no PL/SQL de cabeça e colocar pra funcionar. A página que diz como deve ser feita a validação é: <a href="http://www.sefaz.ba.gov.br/contribuinte/informacoes_fiscais/doc_fiscal/calculodv.htm" target="top">http://www.sefaz.ba.gov.br/contribuinte/informacoes_fiscais/doc_fiscal/calculodv.htm</a>.</p>
<p>Segue abaixo a function utilizada para fazer esta validação. Essa function retorna &#8216;S&#8217; caso esteja OK e &#8216;N&#8217; caso não seja validado o dígito verificador.</p>
<p><code><br />
create or replace function valida_dig_inscest_BA(pInscEstadual varchar2) return varchar2 is<br />
   v_IE varchar2(10);</p>
<p>   idig1 number;<br />
   idig2 number;</p>
<p>   iRes1 number;<br />
   iRes2 number;</p>
<p>   cBase1 number;<br />
   cBase2 number;<br />
begin<br />
   v_IE := rtrim(replace(replace(replace(pInscEstadual, '.', ''), '-', ''), '/', ''));</p>
<p>   if length(v_IE) <> 8 then<br />
      return('N');<br />
   end if;</p>
<p>   iRes1  := 0;<br />
   iRes2  := 0;</p>
<p>   cBase1 := substr(v_IE, 1, 6);<br />
   iDig1  := substr(v_IE, 7, 1);<br />
   iDig2  := substr(v_IE, 8, 1);</p>
<p>   --Se o primeiro dígito for um dos testados, modulo 10, senao, modulo 11<br />
   if(substr(cBase1, 1, 1) in (0, 1, 2, 3, 4, 5, 8)) then<br />
      --Faz um loop de 7 até 2...<br />
      for i in reverse 2 .. 7 loop<br />
         --Verifica se o numero encontrado é válido.<br />
         if instr('0123456789', SubStr(cBase1, (7-i)+1, 1)) > 0 Then<br />
            --Sendo válido, já soma com a multiplicação pelo indice.<br />
            ires2 := ires2 + (SubStr(cBase1, (7-i)+1, 1) * i);<br />
         else<br />
            return('N');<br />
         end if;<br />
      end loop;</p>
<p>      --Recupera o resto do calculo realizado por 10<br />
      ires2 := mod(ires2, 10);</p>
<p>      --Se for 0, o digito é zero.<br />
      if(ires2 = 0) then<br />
         ires2 := 0;<br />
      --Se não for zero, subtrai o valor de 10<br />
      else<br />
         ires2 := 10 - ires2;<br />
      end if;</p>
<p>      --O numero para o calculo do primeiro digito, é os 6 primeiros + o digito 2<br />
      cBase2 := cBase1||ires2;</p>
<p>      --Faz um loop de 8 até 2...<br />
      for i in reverse 2 .. 8 loop<br />
         --Verifica se o numero encontrado é válido.<br />
         if instr('0123456789', SubStr(cBase2, (8-i)+1, 1)) > 0 Then<br />
            --Sendo válido, já soma com a multiplicação pelo indice.<br />
            ires1 := ires1 + (SubStr(cBase2, (8-i)+1, 1) * i);<br />
         else<br />
            return('N');<br />
         end if;<br />
      end loop;</p>
<p>      --Recupera o resto do calculo realizado por 10<br />
      ires1 := mod(ires1, 10);</p>
<p>      --Se for 0, o digito é zero.<br />
      if(ires1 = 0) then<br />
         ires1 := 0;<br />
      --Se não for zero, subtrai o valor de 10<br />
      else<br />
         ires1 := 10 - ires1;<br />
      end if;</p>
<p>      --Se resultado 1 e 2 iguais a digitos 1 e 2, é válido<br />
      if(ires1 = idig1 and ires2 = idig2) then<br />
         return('S');<br />
      else<br />
         return('N');<br />
      end if;<br />
   --Se começa com 6, 7 ou 9<br />
   else<br />
      --Faz um loop de 7 até 2...<br />
      for i in reverse 2 .. 7 loop<br />
         --Verifica se o numero encontrado é válido.<br />
         if instr('0123456789', SubStr(cBase1, (7-i)+1, 1)) > 0 Then<br />
            --Sendo válido, já soma com a multiplicação pelo indice.<br />
            ires2 := ires2 + (SubStr(cBase1, (7-i)+1, 1) * i);<br />
         else<br />
            return('N');<br />
         end if;<br />
      end loop;</p>
<p>      --Recupera o resto do calculo realizado por 11<br />
      ires2 := mod(ires2, 11);</p>
<p>      --Se for 0, o digito é zero.<br />
      if(ires2 = 0) then<br />
         ires2 := 0;<br />
      --Se não for zero, subtrai o valor de 11<br />
      else<br />
         ires2 := 11 - ires2;<br />
      end if;</p>
<p>      --O numero para o calculo do primeiro digito, é os 6 primeiros + o digito 2<br />
      cBase2 := cBase1||ires2;</p>
<p>      --Faz um loop de 8 até 2...<br />
      for i in reverse 2 .. 8 loop<br />
         --Verifica se o numero encontrado é válido.<br />
         if instr('0123456789', SubStr(cBase2, (8-i)+1, 1)) > 0 Then<br />
            --Sendo válido, já soma com a multiplicação pelo indice.<br />
            ires1 := ires1 + (SubStr(cBase2, (8-i)+1, 1) * i);<br />
         else<br />
            return('N');<br />
         end if;<br />
      end loop;</p>
<p>      --Recupera o resto do calculo realizado por 10<br />
      ires1 := mod(ires1, 11);</p>
<p>      --Se for 0, o digito é zero.<br />
      if(ires1 = 0) then<br />
         ires1 := 0;<br />
      --Se não for zero, subtrai o valor de 10<br />
      else<br />
         ires1 := 11 - ires1;<br />
      end if;</p>
<p>      if(ires1 = idig1 and ires2 = idig2) then<br />
         return('S');<br />
      else<br />
         return('N');<br />
      end if;<br />
   end if;<br />
end;<br />
</code></p>
<p>É isso aí gente, espero que seja útil.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2009/10/22/validando-digito-verificador-inscricao-estadual-bahia-ba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

