<?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>WEBCODELOG &#187; Banco de Dados</title>
	<atom:link href="http://www.lucianosilva.com/category/banco-de-dados/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lucianosilva.com</link>
	<description>free codes, enjoy</description>
	<lastBuildDate>Mon, 14 Jun 2010 00:34:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Enviando e-mail com PL/SQL para múltiplos endereços</title>
		<link>http://www.lucianosilva.com/2009/11/16/enviando-e-mail-com-plsql-para-multiplos-enderecos/</link>
		<comments>http://www.lucianosilva.com/2009/11/16/enviando-e-mail-com-plsql-para-multiplos-enderecos/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 18:54:03 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[procedure]]></category>
		<category><![CDATA[utl_mail]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=312</guid>
		<description><![CDATA[A situação mais comum é o envio de e-mail para diversos destinatários, portanto, complementando o código já postado aqui sobre o envio de e-mails utilizando PLSQL. Uma lista de destinatários formatada normalmente assim:  Luciano &#60;luciano@lucianosilva.com&#62;, Grupos &#60;grupos@lucianosilva.com&#62;, Futebol &#60;futebol@cfb.com.br&#62;  Este é o nosso problema, o Oracle não irá conseguir trabalhar com a String formatada dessa [...]]]></description>
			<content:encoded><![CDATA[<p>A situação mais comum é o envio de e-mail para diversos destinatários, portanto, complementando o código já postado <a href="http://www.lucianosilva.com/2009/07/05/enviando-e-mail-com-plsql/">aqui</a> sobre o envio de e-mails utilizando PLSQL.</p>
<p>Uma lista de destinatários formatada normalmente assim:</p>
<blockquote><p> Luciano &lt;<a href="mailto:luciano@lucianosilva.com">luciano@lucianosilva.com</a>&gt;, Grupos &lt;<a href="mailto:grupos@lucianosilva.com">grupos@lucianosilva.com</a>&gt;, Futebol &lt;<a href="mailto:futebol@cfb.com.br">futebol@cfb.com.br</a>&gt; </p></blockquote>
<p>Este é o nosso problema, o Oracle não irá conseguir trabalhar com a String formatada dessa maneira, e irá lançar o erro:</p>
<blockquote><p><strong>ORA-29279: SMTP permanent error: 501 Bad address syntax</strong></p></blockquote>
<p>Enfim, para conseguir solucionar o problema do envio de e-mail para multiplos destinatários, utilize a função abaixo, ela irá devolver apenas o endereço de e-mail.</p>
<pre class="brush: sql;">

FUNCTION FORMAT_ADDRESS(ADDR_LIST IN OUT VARCHAR2) RETURN VARCHAR2 IS
    ---
    ADDR VARCHAR2(256);
    I    PLS_INTEGER;
    ---
    FUNCTION LOOKUP_UNQUOTED_CHAR(STR IN VARCHAR2, CHRS IN VARCHAR2)
      RETURN PLS_INTEGER AS
      C            VARCHAR2(5);
      I            PLS_INTEGER;
      LEN          PLS_INTEGER;
      INSIDE_QUOTE BOOLEAN;
      ---
    BEGIN
      INSIDE_QUOTE := FALSE;
      I            := 1;
      LEN          := LENGTH(STR);
      WHILE (I &lt;= LEN) LOOP
        C := SUBSTR(STR, I, 1);
        IF (INSIDE_QUOTE) THEN
          IF (C = '&quot;') THEN
            INSIDE_QUOTE := FALSE;
          ELSIF (C = '\') THEN
            I := I + 1; -- Skip the quote character
          END IF;
          GOTO NEXT_CHAR;
        END IF;
        IF (C = '&quot;') THEN
          INSIDE_QUOTE := TRUE;
          GOTO NEXT_CHAR;
        END IF;
        IF (INSTR(CHRS, C) &gt;= 1) THEN
          RETURN I;
        END IF;
        &lt;&lt;NEXT_CHAR&gt;&gt;
        I := I + 1;
      END LOOP;
      RETURN 0;
    END;
  BEGIN
    ADDR_LIST := LTRIM(ADDR_LIST);
    I         := LOOKUP_UNQUOTED_CHAR(ADDR_LIST, ',;');
    IF (I &gt;= 1) THEN
      ADDR      := SUBSTR(ADDR_LIST, 1, I - 1);
      ADDR_LIST := SUBSTR(ADDR_LIST, I + 1);
    ELSE
      ADDR      := ADDR_LIST;
      ADDR_LIST := '';
    END IF;
    I := LOOKUP_UNQUOTED_CHAR(ADDR, '&lt;');
    IF (I &gt;= 1) THEN
      ADDR := SUBSTR(ADDR, I + 1);
      I    := INSTR(ADDR, '&gt;');
      IF (I &gt;= 1) THEN
        ADDR := SUBSTR(ADDR, 1, I - 1);
      END IF;
    END IF;
    RETURN ADDR;
  END FORMAT_ADDRESS;
</pre>
<p>A mudança do código anterior não é tão drástica, já que o parâmetro é entrada/saída, você pode fazer um looping na lista de endereços para adicionar um-a-um.</p>
<pre class="brush: sql;">
UTL_SMTP.MAIL(MAIL_CONN, V_FROM );
    WHILE( V_LIST_ADDRESS IS NOT NULL )LOOP
           UTL_SMTP.RCPT(MAIL_CONN, FORMAT_ADDRESS(V_LIST_ADDRESS) );   
    END LOOP;
</pre>
<p>Veja que é uma modificação simples, porém, ganha-se muito quando é necessário deixar o programa o mais abrangente possível<br />
Enjoy!</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "hobbit, Isaac Asimov, Alice";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "7";bb_format = "bbc";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/11/16/enviando-e-mail-com-plsql-para-multiplos-enderecos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enviando e-mail com PL/SQL</title>
		<link>http://www.lucianosilva.com/2009/07/05/enviando-e-mail-com-plsql/</link>
		<comments>http://www.lucianosilva.com/2009/07/05/enviando-e-mail-com-plsql/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 16:01:34 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[procedure]]></category>
		<category><![CDATA[utl_mail]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=283</guid>
		<description><![CDATA[Em continuidade a nossa série &#8220;as mil-e-uma utilidades do seu banco de dados Oracle&#8221;, agora você poderá descobrir como é fácil enviar e-mails a partir do PL/SQL e saber o quanto isto é produtivo. Vamos lá, para o envio de e-mails é necessário que o pacote UTL_MAIL esteja instalado. Conectando como sysdba na instância ORCL. [...]]]></description>
			<content:encoded><![CDATA[<p>Em continuidade a nossa série &#8220;as mil-e-uma utilidades do seu banco de dados Oracle&#8221;, agora você poderá descobrir como é fácil enviar e-mails a partir do PL/SQL e saber o quanto isto é produtivo.</p>
<p>Vamos lá, para o envio de e-mails é necessário que o pacote UTL_MAIL esteja instalado.</p>
<p>Conectando como sysdba na instância ORCL.</p>
<pre class="brush: sql;">
C:\&gt;set oracle_sid=orcl
C:\&gt;sqlplus sys/oracle as sysdba
</pre>
<p>Instalando o pacote UTL_MAIL. Isto não é nenhuma novidade, mas a variável de ambiente %ORACLE_HOME% indica o caminho a qual o banco de dados foi instalado, neste caso, foi utilizada a versão 10.2.0 &#8211; C:\oracle\product\10.2.0\db_1. Os sub-diretórios, contém os pacotes necessários para o UTL_MAIL funcionar.</p>
<pre class="brush: sql;">
SQL&gt; set serveroutput on
SQL&gt; @%ORACLE_HOME%/rdbms/admin/utlmail.sql
SQL&gt; @%ORACLE_HOME%/rdbms/admin/prvtmail.plb
SQL&gt; show errors;
</pre>
<p>Pronto, isto é o suficiente para o nosso próximo passo, a criação da procedure de envio de e-mails.</p>
<p>Crie uma package para agrupar todas as funcionalidades que podem ser comuns a diversos projetos, e reutilize o código quando necessário.</p>
<pre class="brush: sql;">
create or replace package PKG_BLOG_UTIL is

-- Author  : LUCIANO
-- Created : 05/07/2009

PROCEDURE enviar_email_auth(p_USUARIO   IN VARCHAR2,
p_SENHA     IN VARCHAR2,
p_TO        IN VARCHAR2,
p_COPIA     IN VARCHAR2,
p_SUBJECT   IN VARCHAR2,
p_MESSAGE   IN VARCHAR2);
end PKG_BLOG_UTIL;
</pre>
<p>Veja agora a versão 1.0 desta implementação:</p>
<pre class="brush: sql;">
CREATE OR REPLACE PACKAGE BODY PKG_BLOG_UTIL IS

PROCEDURE ENVIAR_EMAIL_AUTH(P_HOST    IN VARCHAR2,
P_USUARIO IN VARCHAR2,
P_SENHA   IN VARCHAR2,
P_TO      IN VARCHAR2,
P_COPIA   IN VARCHAR2,
P_SUBJECT IN VARCHAR2,
P_MESSAGE IN VARCHAR2)
IS

MAIL_CONN   UTL_SMTP.CONNECTION;
V_HEADER    VARCHAR2(4000);
CRLF        VARCHAR2(2) := CHR(13) || CHR(10); -- quebra de linha

BEGIN

-- Abre a conexão
MAIL_CONN   := UTL_SMTP.OPEN_CONNECTION(P_HOST, 25);
UTL_SMTP.HELO(MAIL_CONN, P_HOST);

-- Faz a autenticação para envio de mensagem
UTL_SMTP.COMMAND(MAIL_CONN, 'AUTH LOGIN');
UTL_SMTP.COMMAND(MAIL_CONN, UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(P_USUARIO))));
UTL_SMTP.COMMAND(MAIL_CONN, UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(P_SENHA))));

-- Prepara o cabeçalho de
V_HEADER := 'Date:'    || TO_CHAR(SYSDATE, 'dd Mon yy hh24:mi:ss') || CRLF ||
'From:'    || p_USUARIO || CRLF ||
'Subject:' || p_SUBJECT || CRLF ||
'To:'      || p_TO      || CRLF ||
'Cc:'      || p_COPIA   || CRLF ||
CRLF || CRLF ||
p_MESSAGE;

--
UTL_SMTP.MAIL(MAIL_CONN, '&lt;' || P_USUARIO || '&gt;');
UTL_SMTP.RCPT(MAIL_CONN, '&lt;' || P_TO || '&gt;');
UTL_SMTP.DATA(MAIL_CONN, V_HEADER);

-- Fecha a conexão
UTL_SMTP.QUIT(MAIL_CONN);

END ENVIAR_EMAIL_AUTH;
END PKG_BLOG_UTIL;
</pre>
<p>Algumas coisas podem ser melhoradas como, separar o corpo da mensagem do cabeçalho e utilizar o UTL_TCP.CRLF como separador de linhas no lugar da variável CRLF, veja como o código fica mais organizado:</p>
<pre class="brush: sql;">
/* APENAS UM TRECHO DO CÓDIGO */
UTL_SMTP.MAIL(MAIL_CONN, '&lt;' || P_USUARIO || '&gt;');
UTL_SMTP.RCPT(MAIL_CONN, '&lt;' || P_TO || '&gt;');

UTL_SMTP.open_data(MAIL_CONN);

-- Prepara o cabeçalho
UTL_SMTP.write_data(MAIL_CONN, 'From'    || ': ' || p_USUARIO || UTL_TCP.CRLF);
UTL_SMTP.write_data(MAIL_CONN, 'To'      || ': ' || p_TO      || UTL_TCP.CRLF);
UTL_SMTP.write_data(MAIL_CONN, 'Cc'      || ': ' || p_COPIA   || UTL_TCP.CRLF);
UTL_SMTP.write_data(MAIL_CONN, 'Subject' || ': ' || P_SUBJECT || UTL_TCP.CRLF);

-- Escreve a mensagem
UTL_SMTP.write_data(MAIL_CONN, UTL_TCP.CRLF || p_message);
UTL_SMTP.close_data(MAIL_CONN);
</pre>
<p>Eu preferi adotar este segundo código como o mais recomendável, mesmo assim, alguns detalhes podem ser adaptados a sua realidade, por exemplo, criar uma constante para o Mail Host, e indicando que o envio de e-mails sempre será a partir daquele servidor ou fazer a sobrecarga da procedure &#8211; a reutilização é uma benção.</p>
<p>Veja que a assinatura da procedure abaixo é um overload do que foi mostrado acima, isto é um conceito de Orientação-a-Objetos suportado pelo PLSQL, permite que um método seja escrito com diversas assinaturas diferentes, e reaproveitando o código de maneira eficaz.</p>
<pre class="brush: sql;">
PROCEDURE ENVIAR_EMAIL_AUTH(P_USUARIO IN VARCHAR2,
P_SENHA   IN VARCHAR2,
P_TO      IN VARCHAR2,
P_COPIA   IN VARCHAR2,
P_SUBJECT IN VARCHAR2,
P_MESSAGE IN VARCHAR2)
IS
V_MAILHOST CONSTANT VARCHAR2(100) := 'pop.xxxx.com.br';
BEGIN

enviar_email_auth(P_HOST    =&gt; v_mailhost,
P_USUARIO =&gt; P_USUARIO,
P_SENHA   =&gt; P_SENHA,
P_TO      =&gt; P_TO,
P_COPIA   =&gt; P_COPIA,
P_SUBJECT =&gt; P_SUBJECT,
P_MESSAGE =&gt; P_MESSAGE);
END ENVIAR_EMAIL_AUTH;
</pre>
<p>A package completa, está disponível <a href="http://www.lucianosilva.com/download/pkg_blog_util.rar">aqui </a>para download.</p>
<p>Não envie spam!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/07/05/enviando-e-mail-com-plsql/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Chamando o bash a partir do PL/SQL com Java Stored Procedure</title>
		<link>http://www.lucianosilva.com/2009/07/02/chamando-o-bash-a-partir-do-plsql-com-java-stored-procedure/</link>
		<comments>http://www.lucianosilva.com/2009/07/02/chamando-o-bash-a-partir-do-plsql-com-java-stored-procedure/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 02:53:09 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[procedure]]></category>
		<category><![CDATA[prompt]]></category>

		<guid isPermaLink="false">http://lucianosilva.com/?p=271</guid>
		<description><![CDATA[Se você sabe utilizar o recursos do Java Stored Procedure em seu banco de dados, significa que você é uma pessoa abençoada. A não tão popular JSP compartilha alguns dos recursos da plataforma Java com a linguagem estrutural PL/SQL, eu disse alguns, pois existem limitações. Muitos desenvolvedores se beneficiam do pacote java.io.* quando falamos de Java [...]]]></description>
			<content:encoded><![CDATA[<p>Se você sabe utilizar o recursos do Java Stored Procedure em seu banco de dados, significa que você é uma pessoa abençoada.</p>
<p>A não tão popular JSP compartilha alguns dos recursos da plataforma Java com a linguagem estrutural PL/SQL, eu disse alguns, pois existem limitações. Muitos desenvolvedores se beneficiam do pacote java.io.* quando falamos de Java Stored Procedure, visto que os recursos são mais amplos, quando comparado ao famoso UTL_FILE.</p>
<p>Vamos realizar passo-a-passo utilizando o banco de dados Oracle 10g em ambiente windows, para a criação de uma Procedure, que irá chamar um programa Java (Java Stored Procedure), cujo este permitirá executar comandos do prompt (os mais antigos leiam Bash).</p>
<p>É provavel que você encontre no Google diversas outras maneiras de criar a Java Stored Procedures, porém, o proposito aqui é mais amplo, ajudando a criar todo o ambiente, vamos lá!</p>
<p>Primeiramente, o usuário de banco, <em>owner </em>do objeto JSP, deve ter alguns permissões para manipular os arquivos no sistema operacional. Neste exemplo no nosso <em>schema</em> será <strong>blog</strong>.</p>
<p>Informe o usuário (schema), tipo de acesso e, opcionalmente o diretório em que será permitida a manipulação do arquivo.</p>
<pre class="brush: sql;">
EXEC DBMS_JAVA.grant_permission('BLOG', 'java.io.FilePermission', '&lt;&lt;ALL FILES&gt;&gt;', 'read ,write, execute, delete');
EXEC Dbms_Java.Grant_Permission('BLOG', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
EXEC Dbms_Java.Grant_Permission('BLOG', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
</pre>
<p>Feito isto, os objetos de banco são simples, crie o programa abaixo com o usuário blog.</p>
<pre class="brush: sql;">
create or replace and compile java source named Bash as
package com.lucianosilva.oracle;
import java.io.*;
import java.lang.*;
public class Bash {

public static void command(String command) throws Exception {
final Process process = Runtime.getRuntime().exec(command);
process.waitFor();
process.destroy();
}

public static String commandReturn(String command) throws Exception {
final Process process = Runtime.getRuntime().exec(command);
process.waitFor();

String retCode = Integer.toString( process.exitValue() );

if ( retCode.equals(&quot;0&quot;) ){
retCode = retCode + &quot; Executado com sucesso.&quot;;
}else{
retCode = retCode + &quot; Erro durante a execucao.&quot;;
}

process.destroy();
return retCode;
}

public static void executeAsynchronousCommand(String command) throws Exception {
Runtime.getRuntime().exec( command );
}
}
</pre>
<p>O método commandReturn não retorna o resultado do comando bash e sim uma mensagem informando se o comando foi bem executado ou não.</p>
<p>Agora vamos testar, ainda como blog, faça:</p>
<pre class="brush: sql;">
CREATE OR REPLACE FUNCTION EXECUTAR_COMAND_BASH(P_COMMAND IN VARCHAR2)
RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'com.lucianosilva.oracle.Bash.commandReturn(java.lang.String) return java.lang.String';
</pre>
<p>Isto é tudo! Um exemplo muito prático, sem dúvidas, já que dependendo da solução adotada a integração de procedures PLSQL com o crontab é muito comum e isto pode ajudar.</p>
<p>Sayonara</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/07/02/chamando-o-bash-a-partir-do-plsql-com-java-stored-procedure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recuperando tablespace sem backup e sem mágica!</title>
		<link>http://www.lucianosilva.com/2008/10/31/recuperando-tablespace-sem-backup-e-sem-magica/</link>
		<comments>http://www.lucianosilva.com/2008/10/31/recuperando-tablespace-sem-backup-e-sem-magica/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 18:05:13 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[recover]]></category>
		<category><![CDATA[tablespace]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=56</guid>
		<description><![CDATA[Well, faz um tempo que não passo por aqui mas, o motivo é justo, final da graduação, muita correira com o trabalho de conclusão de curso e alguns novos desafios. E&#8230; por falar em desafio, eu encarei um recentemente, não é uma coisa tão complexa, porém exigiu muita pesquisa e testes, a proposta era a [...]]]></description>
			<content:encoded><![CDATA[<p>Well, faz um tempo que não passo por aqui mas, o motivo é justo, final da graduação, muita correira com o trabalho de conclusão de curso e alguns novos desafios.<br />
E&#8230; por falar em desafio, eu encarei um recentemente, não é uma coisa tão complexa, porém exigiu muita pesquisa e testes, a proposta era a seguinte &#8220;recuperar uma tablespace sem backup&#8221;. Auto-explicativo, não?</p>
<p>Vamos ao que interessa, primeiramente vou criar o cenário, ativando o archive log, em seguida será criada uma tablespace qualquer, forçaremos uma alternância de logs para que o redo log receba o objeto.</p>
<p>Passo 1 &#8211; Inicie o banco de dados normalmente e verifique se está no modo de arquivamento automático</p>
<pre class="brush: sql;">
archive log list;
</pre>
<p>Se o banco não estiver no modo de arquivamento faça isto</p>
<pre class="brush: sql;">
alter database archivelog
alter system set log_archive_start=true scope=spfile;

alter database open;
</pre>
<p>É necessário reiniciar o banco pq o escopo da alteração foi o spfile</p>
<pre class="brush: sql;">
shutdown immediate;
startup
</pre>
<p>Passo 2 &#8211; Como SYS crie uma simples tablespace TB_CURSO</p>
<pre class="brush: sql;">
create tablespace tb_curso datafile 'c:\oracle\oradata\DBWORK2\tb_curso.dbf'
size 2m
autoextend on;
</pre>
<p>Com o usuário scott crie uma tabela qualquer, apenas para que a tablepace tenha um conteúdo.</p>
<pre class="brush: sql;">
conn scott/tiger@dbwork2

-- criando tabela OPS
create table ops (id number) tablespace tb_curso;

-- populando a tabela
insert into ops values(1);
insert into ops values(1);
insert into ops values(1);
insert into ops values(1);
insert into ops values(1);
insert into ops values(1);
insert into ops values(1);
insert into ops values(1);
insert into ops values(1);
insert into ops values(1);
commit;

select count(*) from ops;
</pre>
<p>Reconecte como SYS e force a alternância de logs</p>
<pre class="brush: sql;">
conn sys/oracle@dbwork2 as sysdba

-- alternância de log
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
</pre>
<p>Passo 4 &#8211; Apagando a tablespace, neste momento será proposital mas talvez um dia você passe por uma situação desesperadora e acidental, ou não. Enfim, apague o arquivo físico da tablespace, antes feche o banco de dados.</p>
<p>&#8211; fechando o banco</p>
<pre class="brush: sql;">
shutdown immediate;
</pre>
<p>&#8211; Apague o datafile &#8216;c:\oracle\oradata\DBWORK2\tb_curso.dbf&#8217;</p>
<p>Passo 5 &#8211; Recuperando a tablespace.</p>
<p>&#8211; Inicie o banco de dados como SYS</p>
<pre class="brush: sql;">
startup
</pre>
<p>Neste momento você irá receber uma mensagem de erro, que indicará o problema no datafile, não se desespere!<br />
Aqui está o segredo, basta você criar um novo datafile como se você o apagado, desta maneira.</p>
<pre class="brush: sql;">
alter database create datafile
'C:\ORACLE\ORADATA\DBWORK2\tb_curso.DBF' as
'C:\ORACLE\ORADATA\DBWORK2\tb_curso01.DBF';
</pre>
<p>Bem, ainda não está tudo resolvido, você deverá aplicar o recover dos dados da tablespace que estão no redo log.<br />
recover tablespace tb_curso;</p>
<p>Após aparecer a mensagem &#8220;Recuperação de mídia concluída&#8221;, abra o banco de dados e verifique a tabela OPS do usuário scott.</p>
<pre class="brush: sql;">
-- abra o banco novamente
alter database open;

-- consultando os registros
select * from scott.ops;
</pre>
<p>That&#8217;s all!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/10/31/recuperando-tablespace-sem-backup-e-sem-magica/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando um Banco de Dados Oracle Manualmente no Windows</title>
		<link>http://www.lucianosilva.com/2008/06/15/criando-um-banco-de-dados-oracle-manualmente-no-windows/</link>
		<comments>http://www.lucianosilva.com/2008/06/15/criando-um-banco-de-dados-oracle-manualmente-no-windows/#comments</comments>
		<pubDate>Sun, 15 Jun 2008 14:59:56 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://lucianosilva.wordpress.com/?p=15</guid>
		<description><![CDATA[Acredite! É fácil e vc é capaz de fazê-lo! Porém, fácil não siginifica que não seja trabalhoso! Para a criação deste tutorial foi utilizado a versão do Banco de Dados Oracle 9i distribuição gratuita e Windows XP SP2. Faça download do Oracle 9i aqui, em seguida faça a instalação. Não vamos detalhar o processo de [...]]]></description>
			<content:encoded><![CDATA[<p>Acredite! É fácil e vc é capaz de fazê-lo!<br />
Porém, fácil não siginifica que não seja trabalhoso!</p>
<p>Para a criação deste tutorial foi utilizado a versão do Banco de Dados Oracle 9i distribuição gratuita e Windows XP SP2.<br />
Faça download do Oracle 9i <a href="http://www.oracle.com/technology/software/products/oracle9i/index.html" target="_blank">aqui</a>, em seguida faça a instalação. Não vamos detalhar o processo de instalação do Oracle, mas no Windows é simples seguindo as instruções do wizard é possível concluir em alguns minutos.</p>
<p><strong>Premissas</strong><br />
ORACLE_HOME é o caminho de instalação do Oracle, normalmente no Windows é <strong>C:\oracle\ora92\</strong>.<br />
ORA_SID ou ORACLE_SID é a mesma coisa, faz referência a instância que será utilizada.<br />
Leia-se <em>DB1WORK</em> no lugar de &lt;sid&gt;.</p>
<p><strong>1º Passo &#8211; Criando o pfile</strong><br />
A partir de uma instância ativa crie um novo pfile copie e renomeie o arquivo para %ORACLE_HOME%\database\init&lt;sid&gt;.ora<br />
No novo arquivo substitua todas as referências da outra instância para o seu novo SID, ou seja, db_name, instance_name, control_files, etc. Veja <a title="BD Arquivo Ini" href="http://www.lucianosilva.com/download/initDB1WORK.ORA" target="_blank">aqui</a> um exemplo como o arquivo ficará.</p>
<p><strong>2º Passo &#8211; criando Estruturas de Diretórios</strong><br />
É necessário criar os diretórios básicos para os processos de background. Crie-os com o nome do SID nos seguintes caminhos:</p>
<p>%ORACLE_HOME%\oradata\&lt;sid&gt;<br />
%ORACLE_HOME%\admin\&lt;sid&gt;<br />
%ORACLE_HOME%\admin\&lt;sid&gt;\bdump<br />
%ORACLE_HOME%\admin\&lt;sid&gt;\cdump<br />
%ORACLE_HOME%\admin\&lt;sid&gt;\udump</p>
<p>Certifique-se que o usuário do Sistema Operacional que irá criar o banco de dados tenha permissão de escrita nesses diretórios.</p>
<p><strong>3º Passo &#8211; Criando Serviço</strong><br />
Crie um serviço para o novo banco de dados, no Windows este passo é fundamental. Vá até o prompt de comando do windows e, faça-o da seguinte maneira:</p>
<p>set oracle_sid=&lt;sid&gt;<br />
oradim -new -sid &lt;sid&gt; -intpwd nive</p>
<p>Muitos tutoriais omitem este procedimento mas, no Windows sem o Serviço Oracle relacionado a nova instância não é possível conectar a instância inativa, ou seja, impossibilitando a criação do banco.</p>
<p><strong>4º Passo &#8211; Conectando Instância Inativa</strong></p>
<blockquote><p><span style="color: #0000ff;">set oracle_sid=&lt;sid&gt;<br />
sqlplus &#8220;/ as sysdba&#8221;</span></p></blockquote>
<p>Já no SQLPlus, após conectar na instância faça o STARTUP no modo NOMOUNT.</p>
<blockquote><p><span style="color: #0000ff;">startup nomount pfile=&#8221;%ORACLE_HOME%\database\init&lt;sid&gt;.ora&#8221;</span></p></blockquote>
<p>É possível iniciar uma instância nos modos NOMOUNT, MOUNT, OPEN, RESTRICT, RECOVER e FORCE.<br />
<em>NOMOUNT </em>- Inicia a instância mas não monta o banco de dados.<br />
<em>MOUNT</em> &#8211; Inicia a instância e monta o banco de dados mas não abre.<br />
<em>OPEN</em> &#8211; Inicia a instãncia, monta e abre o banco de dados.<br />
<em>RESTRICT</em> &#8211; Inicia a instância, monta e abre o banco de dados, permitindo conexão de usuários apenas que tenham o previlégio de session restrict.<br />
<em>RECOVER</em> &#8211; Inicia a instância, deixa o banco de dados fechado para inicio de recuperação de falhas.<br />
<em>FORCE</em> &#8211; Em caso de problemas para iniciar e parar o banco de dados, esse modo força o SHUTDOWN ABORT e em seguida STARTUP OPEN.</p>
<p><strong>5º Passo &#8211; Criando o Banco de Dados</strong></p>
<blockquote><p><span style="color: #0000ff;">CREATE DATABASE DB1WORK CONTROLFILE REUSE<br />
Logfile<br />
Group 1 (&#8216;c:/oracle/admin/DB1WORK/bdump/log01a.log&#8217;,<br />
&#8216;c:/oracle/admin/DB1WORK/bdump/log01b.log&#8217;) size 50M,<br />
Group 2 (&#8216;c:/oracle/admin/DB1WORK/bdump/log02a.log&#8217;,<br />
&#8216;c:/oracle/admin/DB1WORK/bdump/log02b.log&#8217;) size 50M<br />
DATAFILE &#8216;c:/oracle/oradata/DB1WORK/system1.dbf&#8217; size 250M<br />
AUTOEXTEND ON MAXSIZE 50M<br />
UNDO TABLESPACE </span><span style="color: #0000ff;">UNDOTBS2</span><br />
<span style="color: #0000ff;">DATAFILE &#8216;c:/oracle/oradata/DB1WORK/undo1.dbf&#8217; size 50M<br />
DEFAULT TEMPORARY TABLESPACE DB1WORK1TEMP TEMPFILE &#8216;c:/oracle/oradata/DB1WORK/mydb1temp1.dbf&#8217; size 75M<br />
MAXLOGFILES 32<br />
MAXLOGHISTORY 1<br />
MAXDATAFILES 500;</span></p></blockquote>
<p><strong>6º Passo &#8211; Finalizando</strong><br />
Após criar o banco de dados basta executar os scripts abaixo:</p>
<p>Criação do dicionário de dados, views e sinonimos de sistema.<br />
@%ORACLE_HOME%/rdbms/admin/catalog.sql</p>
<p>Executa todos os scripts usados em Pl/Sql<br />
@%ORACLE_HOME%/rdbms/admin/catproc.sql</p>
<p>@%ORACLE_HOME%/sqlplus/admin/pupbld.sql</p>
<p>Eu tentei demonstrar neste post que criar o banco de dados Oracle manualmente em ambiente Windows não é nenhum bicho-de-sete-cabeças e, que com base em um passo-a-passo é possível fazê-lo. Os conceitos de tamanho de arquivos físicos e nomeclaturas não foram discutidos, visto que foi uma decisão pessoal que o autor baseou-se no seu pouco conhecimento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/06/15/criando-um-banco-de-dados-oracle-manualmente-no-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>View Materializada</title>
		<link>http://www.lucianosilva.com/2008/04/17/materialized-view/</link>
		<comments>http://www.lucianosilva.com/2008/04/17/materialized-view/#comments</comments>
		<pubDate>Fri, 18 Apr 2008 02:08:37 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://lucianosilva.wordpress.com/?p=14</guid>
		<description><![CDATA[As View Materialized assim conhecidas desde a versão 9i, são nada mais que objetos do banco de dados Oracle que contém dados locais de tabelas remotas ou são usadas pra criar uma agregação de tabelas em um determinado intervalo de tempo. Uma curiosidade nas versões precedentes à 9i as Views Materializadas eram conhecidas como Snapshots. [...]]]></description>
			<content:encoded><![CDATA[<p>As View Materialized assim conhecidas desde a versão 9i, são nada mais que objetos do banco de dados Oracle que contém dados locais de tabelas remotas ou são usadas pra criar uma agregação de tabelas em um determinado intervalo de tempo.</p>
<p><span style="text-decoration:line-through;">Uma curiosidade nas versões precedentes à 9i as Views Materializadas eram conhecidas como Snapshots.</span></p>
<p>Como meu professor Milton Goya já comentou, Snapshot é o nome utilizado na versão 7 do Oracle.<br />
O comando abaixo demonstra como podemos criar uma View Materializada:</p>
<blockquote><p>CREATE MATERIALIZED VIEW vm_employees<br />
REFRESH FAST<br />
START WITH SYSDATE + 1<br />
NEXT SYSDATE + 1/24<br />
WIDTH PRIMARY KEY<br />
AS<br />
SELECT empno, ename, job, salary<br />
FROM emp;</p></blockquote>
<p>Na sequência será detalhada cada linha do comando demonstrado acima.</p>
<blockquote><p>CREATE MATERIALIZED VIEW vm_employees</p></blockquote>
<p>Inicio da sintaxe para criar a visão chamada de vm_employees.</p>
<blockquote><p>REFRESH FAST</p></blockquote>
<p>O REFRESH indica o tipo de atualização que sofrerão os dados contidos na visão.<br />
Existem três estados ou métodos sendo FAST, COMPLETE e FORCE.</p>
<p><strong>FAST:</strong> Atualiza somente as linhas da tabela original que sofreram atualizações.</p>
<p><strong>COMPLETE</strong>: Recria toda a estrutura da view materializada mesmo que não seja necessário.</p>
<p><strong>FORCE</strong>: Se não for específicado o método de atualização, o padrão é FORCE, que tentará fazer uma atualização FAST se não for possível irá fazer a COMPLETE.</p>
<blockquote><p>START WITH SYSDATE + 1</p></blockquote>
<p>Indica que quando o banco irá fazer a primeira replicação.</p>
<blockquote><p>NEXT SYSDATE + 1/24</p></blockquote>
<p>Determina o intervalo entre a próxima replicação.</p>
<blockquote><p>WIDTH PRIMARY KEY</p></blockquote>
<p>É utilizado para criar a Chave-Primária, que é baseada na chave-primária da tabela master.</p>
<p>Concluí-se com esses post-tutorial que view materializadas são extremamente uteís no dia-a-dia de uma companhia que trabalha com centenas de milhares de tuplas e, o acesso à elas acaba ficando custoso. Este tipo de objeto ajuda a diminuir acesso as tabelas master de uma maneira segura e íntegra.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/04/17/materialized-view/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
