<?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>glufke.net &#187; SQL</title>
	<atom:link href="http://glufke.net/tag/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://glufke.net</link>
	<description></description>
	<lastBuildDate>Fri, 10 Sep 2010 14:51:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Melhorias nos EXTERNAL TABLES do 10g</title>
		<link>http://glufke.net/2009/01/13/melhorias-nos-external-tables-do-10g/</link>
		<comments>http://glufke.net/2009/01/13/melhorias-nos-external-tables-do-10g/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 23:48:10 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[External Table]]></category>
		<category><![CDATA[Oracle 10g]]></category>

		<guid isPermaLink="false">http://glufke.net/?p=37</guid>
		<description><![CDATA[A partir do Oracle 9i foi criado o conceito de EXTERNAL TABLES, ou seja, você cria uma tabela baseado num arquivo texto no sistema operacional e pode fazer consultas SQL nessa tabela (ou seja, diretamente no arquivo texto como se fosse uma tabela)
Agora a partir do oracle 10g é possível também criar um arquivo texto [...]]]></description>
			<content:encoded><![CDATA[<p>A partir do Oracle 9i foi criado o conceito de EXTERNAL TABLES, ou seja, você cria uma tabela baseado num arquivo texto no sistema operacional e pode fazer consultas SQL nessa tabela (ou seja, diretamente no arquivo texto como se fosse uma tabela)<br />
Agora a partir do oracle 10g é possível também criar um arquivo texto baseado numa tabela do banco usando o novo driver de Data Pump existente.<span id="more-37"></span> </p>
<p>A possibilidade de gravar um arquivo texto se limita ao CREATE TABLE AS SELECT apenas. Não é permitido fazer UPDATE, DELETE ou INSERT numa external table.</p>
<p>Vamos a um exemplo:</p>
<pre class="brush: sql;">SQL> CREATE DIRECTORY external_directory AS
'c:\oracle\admin\betatwo\directory';

SQL> GRANT READ, WRITE ON DIRECTORY external_directory
TO scott;
SQL> CREATE TABLE emp_history_ext
(ename, retire_date,
last_retirement_pay_date, pay_amount)
ORGANIZATION EXTERNAL
( TYPE oracle_datapump
  DEFAULT DIRECTORY external_directory
LOCATION ('emp_history_01.exp', 'emp_history_02.exp') )
parallel
AS
SELECT a.ename, b.retire_date,
b.last_retirement_pay_date, b.pay_amount
FROM emp a, retire_pay b
WHERE a.empno=b.empno;</pre>
<p>Primeiramente, criamos um DIRECTORY e damos permissão de leitura e escrita. Isso apenas é requerido caso o usuário que criou o diretório não é o usuário que vai criar a external table. Após isso, criamos uma external table que será populada com o SELECT informado!</p>
<div id="ads_336x280"><script type="text/javascript"><!--
google_ad_client = "pub-8964513116661040";
google_alternate_color = "ffffFF";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-09-07: wp_quadrado_gra
google_ad_channel = "0247072216";
google_color_border = "FFFFFF";
google_color_bg = "FFFFff";
google_color_link = "4F82CB";
google_color_text = "000000";
google_color_url = "4F82CB";
//--></script><script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p>Após a criação, basta fazer a consulta diretamente no arquivo texto:</p>
<pre class="brush: sql;">SQL> SELECT * FROM emp_history_ext;

ENAME      RETIRE_DA LAST_RETI PAY_AMOUNT
---------- --------- --------- ----------
SMITH      25-NOV-03 15-DEC-03       1000</pre>
<p>A criação dessa external table resulta na criação de um arquivo texto no sistema operacional com os dados informados no SELECT. Também é gerado um arquivo de LOG no mesmo diretório:</p>
<pre class="brush: plain;">C:\> dir c:\oracle\admin\betatwo\directory
 Volume in drive C has no label.
 Volume Serial Number is 3CE9-7321
 Directory of c:\oracle\admin\betatwo\directory
12/15/2003 07:52  PM      90    EMP_HISTORY_EXT_2528_1760.log
12/15/2003 07:52  PM   1,808    emp_history.exp</pre>
<p>Outras informações:<br />
Quando você dropa uma external table os arquivos textos continuam no sistema operacional! Isso pode ser um problema pois caso você execute novamente o comando pra recriar a external table, os arquivos já existirão e ocasionará um ERRO. Você deve excluir esses arquivos manualmente.</p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2009/01/13/melhorias-nos-external-tables-do-10g/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Novas funcionalidades com CONNECT BY</title>
		<link>http://glufke.net/2009/01/12/novas-funcionalidades-com-connect-by/</link>
		<comments>http://glufke.net/2009/01/12/novas-funcionalidades-com-connect-by/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 11:23:42 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Connect By]]></category>
		<category><![CDATA[Oracle 10g]]></category>

		<guid isPermaLink="false">http://glufke.net/?p=38</guid>
		<description><![CDATA[A partir do Oracle 10g temos mais algumas funcionalidades no uso da cláusula CONNECT BY dentro dos comandos SELECT. Essas mudanças se aplicam a queries hiearquicas permitindo o retorno de não apenas PAIS, FILHOS mas também &#8220;ancestrais&#8221;. São 3 as novas cláusulas disponíveis com CONNECT BY. 



connect_by_iscycle
Determina se a linha corrente tem uma linha filha [...]]]></description>
			<content:encoded><![CDATA[<p>A partir do Oracle 10g temos mais algumas funcionalidades no uso da cláusula CONNECT BY dentro dos comandos SELECT. Essas mudanças se aplicam a queries hiearquicas permitindo o retorno de não apenas PAIS, FILHOS mas também &#8220;ancestrais&#8221;. São 3 as novas cláusulas disponíveis com CONNECT BY.<span id="more-38"></span> </p>
<div id="ads_336x280"><script type="text/javascript"><!--
google_ad_client = "pub-8964513116661040";
google_alternate_color = "ffffFF";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-09-07: wp_quadrado_gra
google_ad_channel = "0247072216";
google_color_border = "FFFFFF";
google_color_bg = "FFFFff";
google_color_link = "4F82CB";
google_color_text = "000000";
google_color_url = "4F82CB";
//-->
</script><script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p><strong>connect_by_iscycle</strong><br />
Determina se a linha corrente tem uma linha filha que também é seu ancestral.</p>
<pre class="brush: sql;">SQL>  SELECT ename Emp, CONNECT_BY_ISCYCLE leaf, mgr "Manager",
  2     LEVEL-1 "Pathlen", SYS_CONNECT_BY_PATH(empno, '/') "Path"
  3     FROM emp
  4     Where level-1 < 3
  5     CONNECT BY NOCYCLE PRIOR empno = mgr;

EMP              LEAF Manager    Pathlen Path
---------- ---------- ------- ---------- ------------------------------
SCOTT               0    7566          0 /7788
ADAMS               0    7788          1 /7788/7876
FORD                0    7566          0 /7902
SMITH               0    7902          1 /7902/7369
ALLEN               0    7698          0 /7499
WARD                0    7698          0 /7521
MARTIN              0    7698          0 /7654
TURNER              0    7698          0 /7844
JAMES               0    7698          0 /7900
MILLER              0    7782          0 /7934
ADAMS               0    7788          0 /7876
JONES               0    7839          0 /7566
SCOTT               0    7566          1 /7566/7788
ADAMS               0    7788          2 /7566/7788/7876
FORD                0    7566          1 /7566/7902
SMITH               0    7902          2 /7566/7902/7369
BLAKE               0    7839          0 /7698
ALLEN               0    7698          1 /7698/7499
WARD                0    7698          1 /7698/7521
MARTIN              0    7698          1 /7698/7654
TURNER              0    7698          1 /7698/7844
JAMES               0    7698          1 /7698/7900
CLARK               0    7839          0 /7782
MILLER              0    7782          1 /7782/7934
SMITH               0    7902          0 /7369
KING                0                  0 /7839
JONES               0    7839          1 /7839/7566
SCOTT               0    7566          2 /7839/7566/7788
FORD                0    7566          2 /7839/7566/7902
BLAKE               0    7839          1 /7839/7698
ALLEN               0    7698          2 /7839/7698/7499
WARD                0    7698          2 /7839/7698/7521
MARTIN              0    7698          2 /7839/7698/7654
TURNER              0    7698          2 /7839/7698/7844
JAMES               0    7698          2 /7839/7698/7900
CLARK               0    7839          1 /7839/7782
MILLER              0    7782          2 /7839/7782/7934

37 rows selected

SQL> </pre>
<p><strong>connect_by_isleaf</strong><br />
Determina se a linha corrente é uma FOLHA na árvore definida pela operação connect by.</p>
<pre class="brush: sql;">SQL> SELECT ename "Emp", CONNECT_BY_ISLEAF leaf, mgr "Manager",
  2     LEVEL-1 "Pathlen", SYS_CONNECT_BY_PATH(empno, '/') "Path"
  3     FROM emp
  4     Where level-1 < 3
  5     CONNECT BY NOCYCLE PRIOR empno = mgr;

Emp              LEAF Manager    Pathlen Path
---------- ---------- ------- ---------- ------------------------------
SCOTT               0    7566          0 /7788
ADAMS               1    7788          1 /7788/7876
FORD                0    7566          0 /7902
SMITH               1    7902          1 /7902/7369
ALLEN               1    7698          0 /7499
WARD                1    7698          0 /7521
MARTIN              1    7698          0 /7654
TURNER              1    7698          0 /7844
JAMES               1    7698          0 /7900
MILLER              1    7782          0 /7934
ADAMS               1    7788          0 /7876
JONES               0    7839          0 /7566
SCOTT               0    7566          1 /7566/7788
ADAMS               1    7788          2 /7566/7788/7876
FORD                0    7566          1 /7566/7902
SMITH               1    7902          2 /7566/7902/7369
BLAKE               0    7839          0 /7698
ALLEN               1    7698          1 /7698/7499
WARD                1    7698          1 /7698/7521
MARTIN              1    7698          1 /7698/7654
TURNER              1    7698          1 /7698/7844
JAMES               1    7698          1 /7698/7900
CLARK               0    7839          0 /7782
MILLER              1    7782          1 /7782/7934
SMITH               1    7902          0 /7369
KING                0                  0 /7839
JONES               0    7839          1 /7839/7566
SCOTT               0    7566          2 /7839/7566/7788
FORD                0    7566          2 /7839/7566/7902
BLAKE               0    7839          1 /7839/7698
ALLEN               1    7698          2 /7839/7698/7499
WARD                1    7698          2 /7839/7698/7521
MARTIN              1    7698          2 /7839/7698/7654
TURNER              1    7698          2 /7839/7698/7844
JAMES               1    7698          2 /7839/7698/7900
CLARK               0    7839          1 /7839/7782
MILLER              1    7782          2 /7839/7782/7934

37 rows selected

SQL> </pre>
<p><strong>connect_by_root</strong><br />
Retorna o valor da coluna da linha Raíz.</p>
<pre class="brush: sql;">SQL> SELECT ename "Emp", CONNECT_BY_ROOT mgr "Manager",
  2     LEVEL-1 "Pathlen", SYS_CONNECT_BY_PATH(empno, '/') "Path"
  3     FROM emp
  4     Where level-1 < 3
  5     CONNECT BY NOCYCLE PRIOR empno = mgr;

Emp           Manager    Pathlen Path
---------- ---------- ---------- ------------------------------
SCOTT            7566          0 /7788
ADAMS            7566          1 /7788/7876
FORD             7566          0 /7902
SMITH            7566          1 /7902/7369
ALLEN            7698          0 /7499
WARD             7698          0 /7521
MARTIN           7698          0 /7654
TURNER           7698          0 /7844
JAMES            7698          0 /7900
MILLER           7782          0 /7934
ADAMS            7788          0 /7876
JONES            7839          0 /7566
SCOTT            7839          1 /7566/7788
ADAMS            7839          2 /7566/7788/7876
FORD             7839          1 /7566/7902
SMITH            7839          2 /7566/7902/7369
BLAKE            7839          0 /7698
ALLEN            7839          1 /7698/7499
WARD             7839          1 /7698/7521
MARTIN           7839          1 /7698/7654
TURNER           7839          1 /7698/7844
JAMES            7839          1 /7698/7900
CLARK            7839          0 /7782
MILLER           7839          1 /7782/7934
SMITH            7902          0 /7369
KING                           0 /7839
JONES                          1 /7839/7566
SCOTT                          2 /7839/7566/7788
FORD                           2 /7839/7566/7902
BLAKE                          1 /7839/7698
ALLEN                          2 /7839/7698/7499
WARD                           2 /7839/7698/7521
MARTIN                         2 /7839/7698/7654
TURNER                         2 /7839/7698/7844
JAMES                          2 /7839/7698/7900
CLARK                          1 /7839/7782
MILLER                         2 /7839/7782/7934

37 rows selected

SQL> </pre>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2009/01/12/novas-funcionalidades-com-connect-by/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cláusula RETURNING com funções somatórias</title>
		<link>http://glufke.net/2009/01/09/clausula-returning-com-funcoes-somatorias/</link>
		<comments>http://glufke.net/2009/01/09/clausula-returning-com-funcoes-somatorias/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 12:57:54 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Oracle 10g]]></category>

		<guid isPermaLink="false">http://glufke.net/?p=39</guid>
		<description><![CDATA[Oracle 10g agora permite o uso de funções somatórias na cláusula RETURNING. O seguinte exemplo faz um UPDATE no salário de todos empregados e retorna a média salarial resultante para as linhas afetadas. 
SQL> VARIABLE a NUMBER
SQL> UPDATE employee
  2  SET sal=sal*1.10 RETURNING AVG(sal) INTO :a;
SQL> PRINT a
      [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle 10g agora permite o uso de funções somatórias na cláusula RETURNING. O seguinte exemplo faz um UPDATE no salário de todos empregados e retorna a média salarial resultante para as linhas afetadas.<span id="more-39"></span> </p>
<pre class="brush: sql;">SQL> VARIABLE a NUMBER
SQL> UPDATE employee
  2  SET sal=sal*1.10 RETURNING AVG(sal) INTO :a;
SQL> PRINT a
           a
    --------
      655.22</pre>
<div id="ads_336x280"><script type="text/javascript"><!--
google_ad_client = "pub-8964513116661040";
google_alternate_color = "ffffFF";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-09-07: wp_quadrado_gra
google_ad_channel = "0247072216";
google_color_border = "FFFFFF";
google_color_bg = "FFFFff";
google_color_link = "4F82CB";
google_color_text = "000000";
google_color_url = "4F82CB";
//-->
</script><script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p>O mesmo exemplo acima mostrado dentro de um bloco PL/SQL:</p>
<pre class="brush: sql;">Declare
     a   number;
begin
     update employee set sal=sal*1.10 returning avg(sal) into a;
     dbms_output.put_line(a);
end;</pre>
<p>Lembre-se que essa média é apenas das linhas afetadas pelo UPDATE!</p>
<p>Também é possível utilizar em comandos DELETE:</p>
<pre class="brush: sql;">Declare
     a   number;
begin
     delete from employee where sal > 1000 returning avg(sal) into a;
     dbms_output.put_line(a);
end;</pre>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2009/01/09/clausula-returning-com-funcoes-somatorias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ignorando Acentos e Maiúsculas/Minúsculas no 10g</title>
		<link>http://glufke.net/2009/01/08/ignorando-acentos-e-maiusculasminusculas-no-10g/</link>
		<comments>http://glufke.net/2009/01/08/ignorando-acentos-e-maiusculasminusculas-no-10g/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 12:19:12 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Acentuação]]></category>
		<category><![CDATA[Oracle 10g]]></category>

		<guid isPermaLink="false">http://glufke.net/?p=36</guid>
		<description><![CDATA[O Oracle 10g agora permite fazer consultas considerando ou não acentos e maiúsculas/minúsculas. Isso é feito pelo uso do parâmetro NLS_SORT. Vamos aos exemplos.
Temos que adicionar o prefixo _ai para &#8220;accent insensitive&#8221; (ignora os acentos). Ou _ci para &#8220;case insensitive&#8221; (ignora se é maiúsculo ou minúsculo).
O nls_sort afeta uma série de funções SQL e operações, [...]]]></description>
			<content:encoded><![CDATA[<p>O Oracle 10g agora permite fazer consultas considerando ou não acentos e maiúsculas/minúsculas. Isso é feito pelo uso do parâmetro <strong>NLS_SORT</strong>. Vamos aos exemplos.<span id="more-36"></span></p>
<p>Temos que adicionar o prefixo <strong>_ai</strong> para &#8220;accent insensitive&#8221; (ignora os acentos). Ou <strong>_ci</strong> para &#8220;case insensitive&#8221; (ignora se é maiúsculo ou minúsculo).</p>
<p>O nls_sort afeta uma série de funções SQL e operações, incluindo essas:<br />
* WHERE<br />
* ORDER BY<br />
* START WITH<br />
* HAVING<br />
* IN / NOT IN<br />
* BETWEEN<br />
* CASE-WHEN</p>
<p>Algumas funções entretanto, não são afetadas pelo nls_sort. (Como LIKE, TRIM, INSTR).</p>
<div id="ads_336x280"><script type="text/javascript">// <![CDATA[
google_ad_client = "pub-8964513116661040";
google_alternate_color = "ffffFF";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-09-07: wp_quadrado_gra
google_ad_channel = "0247072216";
google_color_border = "FFFFFF";
google_color_bg = "FFFFff";
google_color_link = "4F82CB";
google_color_text = "000000";
google_color_url = "4F82CB";
// ]]&gt;</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script></div>
<p>Observe o comportamento normal do ORDER BY:</p>
<pre class="brush: sql;">SQL&gt; select * from thomas_teste order by 1;

NOME
-------------------------------------------
THOMAS 2
Thomas 3
thomas 1

SQL&gt; </pre>
<p>Agora, a mesma consulta, mas antes mudamos o NLS_SORT para ignorar os maiúsculos e minúsculos:</p>
<pre class="brush: sql;">SQL&gt; ALTER SESSION SET NLS_SORT=generic_m_ci;

Session altered.

SQL&gt; select * from thomas_teste order by 1;

NOME
-----------------------------------------------
thomas 1
THOMAS 2
Thomas 3

SQL&gt; </pre>
<p>Agora, o mesmo resultado acima SEM mudar a sessão:</p>
<pre class="brush: sql;">SQL&gt; select * from thomas_teste
2  order by nlssort( nome, 'NLS_SORT=generic_m_ci');

NOME
-------------------------------------------------------
thomas 1
THOMAS 2
Thomas 3

SQL&gt; </pre>
<p>E é claro, também pode usar o <strong>_ai</strong> para ignorar os acentos.<br />
NOTA: o <strong>_ai</strong> inclui a funcionalidade do CASE INSENSITIVE também!</p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2009/01/08/ignorando-acentos-e-maiusculasminusculas-no-10g/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Select que retorna os Números Primos</title>
		<link>http://glufke.net/2007/10/11/select-que-retorna-os-numeros-primos/</link>
		<comments>http://glufke.net/2007/10/11/select-que-retorna-os-numeros-primos/#comments</comments>
		<pubDate>Thu, 11 Oct 2007 22:40:31 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Curiosidade]]></category>
		<category><![CDATA[Matemática]]></category>

		<guid isPermaLink="false">http://glufke.net/2007/10/11/select-que-retorna-os-numeros-primos/</guid>
		<description><![CDATA[Esse post vai mais a título de curiosidade. Sabemos que os números primos são números naturais que podem ser divididos apenas por dois números naturais, o 1 (um) e ele mesmo. Pois a tempos que eu queria um SQL que retornasse esses números! 
Após um pouco de tentativas, saiu o SQL abaixo:
select z.zz PRIMOS
from
 (select [...]]]></description>
			<content:encoded><![CDATA[<p>Esse post vai mais a título de curiosidade. Sabemos que os <a href="http://pt.wikipedia.org/wiki/N%C3%BAmero_primo">números primos</a> são números naturais que podem ser divididos apenas por dois números naturais, o 1 (um) e ele mesmo. Pois a tempos que eu queria um SQL que retornasse esses números! <span id="more-20"></span></p>
<p>Após um pouco de tentativas, saiu o SQL abaixo:</p>
<pre class="brush: sql;">select z.zz PRIMOS
from
 (select rownum+1 zz
  from user_tables
  where rownum < 100
 ) z
where zz not in (
                select y.bb
                from (select rownum+1 aa from user_tables a where rownum < 100) x
                ,    (select rownum+1 bb from user_tables b where rownum < 100) y
                where bb<>aa
                  and mod(bb, aa)=0
                  and aa<=bb
                )
/</pre>
<div id="ads_336x280"><script type="text/javascript"><!--
google_ad_client = "pub-8964513116661040";
google_alternate_color = "ffffFF";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-09-07: wp_quadrado_gra
google_ad_channel = "0247072216";
google_color_border = "FFFFFF";
google_color_bg = "FFFFff";
google_color_link = "4F82CB";
google_color_text = "000000";
google_color_url = "4F82CB";
//-->
</script><script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p>Abaixo, colocaremos uma amostra dos resultados:</p>
<pre class="brush: sql;">SQL> select z.zz PRIMOS
  2  from
  3   (select rownum+1 zz
  4    from user_tables
  5    where rownum < 100
  6   ) z
  7  where zz not in (
  8                  select y.bb
  9                  from (select rownum+1 aa from user_tables a where rownum < 100) x
 10                  ,    (select rownum+1 bb from user_tables b where rownum < 100) y
 11                  where bb<>aa
 12                    and mod(bb, aa)=0
 13                    and aa<=bb
 14                  )
 15  /

   PRIMOS
---------
        2
        3
        5
        7
       11
       13
       17
       19
       23
       29
       31
       37
       41
       43
       47
       53
       59
       61
       67
       71
       73
       79
       83
       89
       97

25 rows selected.
SQL></pre>
<p>Talvez essa não seja a melhor forma de fazer isso (obviamente, que usar SQL pra calcular isso não é a melhor saída). Mesmo assim, fica como um "desafio vencido". </p>
<p>Comentários <a href="http://glufke.net/oracle/viewtopic.php?t=637">aqui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2007/10/11/select-que-retorna-os-numeros-primos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como usar Índices Virtuais &#8211; NOSEGMENT INDEXES</title>
		<link>http://glufke.net/2007/09/25/como-usar-indices-virtuais-nosegment-indexes/</link>
		<comments>http://glufke.net/2007/09/25/como-usar-indices-virtuais-nosegment-indexes/#comments</comments>
		<pubDate>Tue, 25 Sep 2007 22:49:51 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[DBA]]></category>
		<category><![CDATA[Tuning]]></category>

		<guid isPermaLink="false">http://glufke.net/2007/09/25/como-usar-indices-virtuais-nosegment-indexes/</guid>
		<description><![CDATA[Essa é para quem faz tunning de SQL. Digamos que você quer verificar se a criação de um novo í­ndice vai ser realmente usada pelo otimizador. Antes de criá-lo, você pode testar se ele resolverá seu problema atraves de INDICE VIRTUAL.
O Oracle vai criar o í­ndice no dicionário de dados mas não vai criar o [...]]]></description>
			<content:encoded><![CDATA[<p>Essa é para quem faz tunning de SQL. Digamos que você quer verificar se a criação de um novo í­ndice vai ser realmente usada pelo otimizador. Antes de criá-lo, você pode testar se ele resolverá seu problema atraves de INDICE VIRTUAL.<span id="more-17"></span></p>
<p>O Oracle vai criar o í­ndice no dicionário de dados mas não vai criar o í­ndice fisicamente. Nada será armazenado nem acessado!</p>
<pre class="brush: sql;">SQL> set autotrace traceonly explain

SQL> select name from emp where name = 'Alex';

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=164 Card=1 Bytes=500)
   1    0   TABLE ACCESS (FULL) OF 'EMP' (Cost=164 Card=1 Bytes=500)</pre>
<p><strong>Criando o Í­ndice</strong></p>
<pre class="brush: sql;">
SQL> create index emp_vir_idx1 on emp(name) nosegment;

Index created.</pre>
<div id="ads_336x280"><script type="text/javascript"><!--
google_ad_client = "pub-8964513116661040";
google_alternate_color = "ffffFF";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-09-07: wp_quadrado_gra
google_ad_channel = "0247072216";
google_color_border = "FFFFFF";
google_color_bg = "FFFFff";
google_color_link = "4F82CB";
google_color_text = "000000";
google_color_url = "4F82CB";
//-->
</script><script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p>Agora, vamos ver se ele vai usar:</p>
<pre class="brush: sql;">
SQL> set autotrace traceonly explain

SQL> select name from emp where name = 'Alex';

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=164 Card=1 Bytes=500)
   1    0   TABLE ACCESS (FULL) OF 'EMP' (Cost=164 Card=1 Bytes=500)</pre>
<p>Hei! Acesso FULL? Porque o oracle não está usando meu novo í­ndice?<br />
Você deve primeiro alterar sua sessão com o parâmetro oculto &#8220;_use_nosegment_indexes&#8221;.</p>
<pre class="brush: sql;">
SQL> alter session set "_use_nosegment_indexes" = true;

Session altered.

SQL> select name from emp where name = 'Alex';

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=500)
   1    0   INDEX (RANGE SCAN) OF 'EMP_VIR_IDX1' (NON-UNIQUE) (Cost=1 Card=1 Bytes=500) </pre>
<p>Comente <a href="http://glufke.net/oracle/viewtopic.php?t=417">aqui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2007/09/25/como-usar-indices-virtuais-nosegment-indexes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ver Plano de execução de um SQL rodando</title>
		<link>http://glufke.net/2007/09/25/ver-plano-de-execucao-de-um-sql-rodando/</link>
		<comments>http://glufke.net/2007/09/25/ver-plano-de-execucao-de-um-sql-rodando/#comments</comments>
		<pubDate>Tue, 25 Sep 2007 14:36:31 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Trace]]></category>
		<category><![CDATA[Tuning]]></category>

		<guid isPermaLink="false">http://glufke.net/2007/09/25/ver-plano-de-execucao-de-um-sql-rodando/</guid>
		<description><![CDATA[Imagine que você rodou um SQL que está demorando muito. O Trace está desligado e você quer saber o que pode estar errado com o SQL. Com essa dica, você enxerga o plano de execução deste SQL.
1. Escolha o SQL que está rodando
select address, hash_value, child_number, sql_text
from v$sql
where users_executing  0
/



2. Rode o sql abaixo, [...]]]></description>
			<content:encoded><![CDATA[<p>Imagine que você rodou um SQL que está demorando muito. O Trace está desligado e você quer saber o que pode estar errado com o SQL. Com essa dica, você enxerga o plano de execução deste SQL.<span id="more-18"></span></p>
<p><strong>1. Escolha o SQL que está rodando</strong></p>
<pre class="brush: sql;">select address, hash_value, child_number, sql_text
from v$sql
where users_executing <> 0
/</pre>
<div id="ads_336x280"><script type="text/javascript"><!--
google_ad_client = "pub-8964513116661040";
google_alternate_color = "ffffFF";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-09-07: wp_quadrado_gra
google_ad_channel = "0247072216";
google_color_border = "FFFFFF";
google_color_bg = "FFFFff";
google_color_link = "4F82CB";
google_color_text = "000000";
google_color_url = "4F82CB";
//-->
</script><script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p><strong>2. Rode o sql abaixo, informando o address, hash_value, child_number retornado do Primeiro SQL.</strong></p>
<pre class="brush: sql;">SET VERIFY OFF
COL id          FORMAT 999
COL parent_id   FORMAT 999 HEADING "PARENT"
COL operation   FORMAT a35 TRUNCATE
COL object_name FORMAT a30
SELECT  id, parent_id, LPAD (' ', LEVEL - 1) ||
        operation || ' ' || options operation, object_name
FROM    (
        SELECT id, parent_id, operation, options, object_name
        FROM   v$sql_plan
        WHERE  address = '&#038;address'
        AND    hash_value = &#038;hash_value
        AND    child_number = &#038;child_number
        )
START WITH id = 0
CONNECT BY PRIOR id = parent_id; </pre>
<p>Obrigado a Roger Schrag que é o autor dessa dica!<br />
Comente <a href="http://glufke.net/oracle/viewtopic.php?t=538">aqui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2007/09/25/ver-plano-de-execucao-de-um-sql-rodando/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CASE WHEN versus DECODE</title>
		<link>http://glufke.net/2007/09/07/12/</link>
		<comments>http://glufke.net/2007/09/07/12/#comments</comments>
		<pubDate>Fri, 07 Sep 2007 10:14:20 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Funções]]></category>

		<guid isPermaLink="false">http://glufke.net/2007/09/07/12/</guid>
		<description><![CDATA[As vezes o CASE WHEN quebra o galho quando temos que usar condições mais complexas&#8230; Mas o que fazer quando não é possí­vel usá-lo? (como nas versões anteriores ao 8i, e no PL*SQL anterior ao 9i). É muito simples! 
Eis o nosso query:
SQL> select
  2    empno
  3  , sal
 [...]]]></description>
			<content:encoded><![CDATA[<p>As vezes o CASE WHEN quebra o galho quando temos que usar condições mais complexas&#8230; Mas o que fazer quando não é possí­vel usá-lo? (como nas versões anteriores ao 8i, e no PL*SQL anterior ao 9i). É muito simples! <span id="more-12"></span></p>
<p>Eis o nosso query:</p>
<pre class="brush: sql;">SQL> select
  2    empno
  3  , sal
  4  , case
  5      when sal<1000  then 'SALARIO BAIXO'
  6      when sal>=1000 then 'SALARIO ALTO'
  7    end comentario
  8  from emp
  9  /

     EMPNO        SAL COMENTARIO
---------- ---------- -------------
      7369        800 SALARIO BAIXO
      7499       1600 SALARIO ALTO
      7521       1250 SALARIO ALTO
      7566       2975 SALARIO ALTO
      7654       1250 SALARIO ALTO
      7698       2850 SALARIO ALTO
      7782       2450 SALARIO ALTO
      7788       3000 SALARIO ALTO
      7839       5000 SALARIO ALTO
      7844       1500 SALARIO ALTO
      7876       1100 SALARIO ALTO
      7900        999 SALARIO BAIXO
      7902       3000 SALARIO ALTO
      7934       1000 SALARIO ALTO
</pre>
<div id="ads_336x280"><script type="text/javascript"><!--
google_ad_client = "pub-8964513116661040";
google_alternate_color = "ffffFF";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-09-07: wp_quadrado_gra
google_ad_channel = "0247072216";
google_color_border = "FFFFFF";
google_color_bg = "FFFFff";
google_color_link = "4F82CB";
google_color_text = "000000";
google_color_url = "4F82CB";
//-->
</script><script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p>E agora um query exatamente IGUAL sem o tal case-when&#8230; </p>
<pre class="brush: sql;">SQL> select
  2    empno
  3  , sal
  4  , decode(sign(sal-1000), -1, 'SALARIO BAIXO', 'SALARIO ALTO')
  5  from emp
  6  /

     EMPNO        SAL DECODE(SIGN(S
---------- ---------- -------------
      7369        800 SALARIO BAIXO
      7499       1600 SALARIO ALTO
      7521       1250 SALARIO ALTO
      7566       2975 SALARIO ALTO
      7654       1250 SALARIO ALTO
      7698       2850 SALARIO ALTO
      7782       2450 SALARIO ALTO
      7788       3000 SALARIO ALTO
      7839       5000 SALARIO ALTO
      7844       1500 SALARIO ALTO
      7876       1100 SALARIO ALTO
      7900        999 SALARIO BAIXO
      7902       3000 SALARIO ALTO
      7934       1000 SALARIO ALTO
SQL> </pre>
<p>Mais uma forma de se fazer isso SEM case-when:</p>
<pre class="brush: sql;">select
  empno
, sal
, decode(greatest(sal,1000), 1000, 'SALARIO BAIXO', 'SALARIO ALTO')
from emp
/
</pre>
<p>Comente <a href="http://glufke.net/oracle/viewtopic.php?t=12">aqui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2007/09/07/12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;IN&#8221; pode concatenar espaços em branco</title>
		<link>http://glufke.net/2007/08/24/in-pode-concatenar-espacos-em-branco/</link>
		<comments>http://glufke.net/2007/08/24/in-pode-concatenar-espacos-em-branco/#comments</comments>
		<pubDate>Fri, 24 Aug 2007 18:40:32 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Curiosidade]]></category>
		<category><![CDATA[Funções]]></category>

		<guid isPermaLink="false">http://glufke.net/2007/08/24/in-pode-concatenar-espacos-em-branco/</guid>
		<description><![CDATA[Este caso é no mí­nimo curioso! É bem comum usarmos &#8220;IN&#8221; quando queremos que o banco considere várias opções para um determinado campo. Neste exemplo, vamos demonstrar que o ORACLE concatena espaços em branco em comparações com IN. Vamos aos exemplos:
Sabemos que o otimizador substitui todas opções do IN pra vários &#8220;OR&#8221; no SQL. No [...]]]></description>
			<content:encoded><![CDATA[<p>Este caso é no mí­nimo curioso! É bem comum usarmos &#8220;IN&#8221; quando queremos que o banco considere várias opções para um determinado campo. Neste exemplo, vamos demonstrar que o ORACLE concatena espaços em branco em comparações com IN. Vamos aos exemplos:<span id="more-7"></span></p>
<p>Sabemos que o otimizador substitui todas opções do IN pra vários &#8220;OR&#8221; no SQL. No exemplo abaixo, vamos deixar o primeiro &#8220;SP&#8221; com um espaço em branco na direita! Não deveria retornar nenhuma linha:</p>
<p><code lang="sql">SQL> SELECT 'SQL IN contatena espaços em branco!' CAMPO<br />
  2  FROM DUAL<br />
  3  WHERE 'SP ' IN ( 'SP', 'RJ' )<br />
  4  /</p>
<p>CAMPO<br />
-----------------------------------<br />
SQL IN contatena espaços em branco!</p>
<p>SQL> </code></p>
<p>Agora, o mesmo teste com o TAB:<br />
<code lang="sql">SQL> SELECT 'SQL IN contatena TAB!' CAMPO<br />
  2  FROM DUAL<br />
  3  WHERE 'SP ' IN ( 'SP', 'RJ' )<br />
  4  /</p>
<p>CAMPO<br />
---------------------<br />
SQL IN contatena TAB!</p>
<p>SQL> </code></p>
<p>Agora, tentamos o mesmo com espaço em branco na esquerda:<br />
<code lang="sql">SQL> SELECT 'SQL IN não concatena espaços na esquerda!' CAMPO<br />
  2  FROM DUAL<br />
  3  WHERE ' SP' IN ( 'SP', 'RJ' )<br />
  4  /</p>
<p>no rows selected</p>
<p>SQL> </code></p>
<p>Agora, dentro de um bloco PL/SQL<br />
<code lang="sql">SQL> DECLARE<br />
  2    VTEMP VARCHAR2(100);<br />
  3  BEGIN<br />
  4    SELECT 'SQL IN contatena espaços em branco!' CAMPO<br />
  5    INTO VTEMP<br />
  6    FROM DUAL<br />
  7    WHERE 'SP ' IN ( 'SP', 'RJ' );<br />
  8<br />
  9    DBMS_OUTPUT.PUT_LINE('Concatenou');<br />
 10<br />
 11  EXCEPTION WHEN NO_DATA_FOUND THEN<br />
 12    DBMS_OUTPUT.PUT_LINE('Nao concatenou');<br />
 13  END;<br />
 14  /<br />
Concatenou</p>
<p>PL/SQL procedure successfully completed.</p>
<p>SQL> </code></p>
<p>Interessante: Usando variável, ele não faz isso!<br />
<code lang="sql">SQL> DECLARE<br />
  2    VTEMP VARCHAR2(100);<br />
  3    VALOR VARCHAR2(10) :='SP ';<br />
  4  BEGIN<br />
  5    SELECT 'SQL IN contatena espaços em branco!' CAMPO<br />
  6    INTO VTEMP<br />
  7    FROM DUAL<br />
  8    WHERE valor IN ( 'SP', 'RJ' );<br />
  9<br />
 10    DBMS_OUTPUT.PUT_LINE('Concatenou');<br />
 11<br />
 12  EXCEPTION WHEN NO_DATA_FOUND THEN<br />
 13    DBMS_OUTPUT.PUT_LINE('Nao concatenou');<br />
 14  END;<br />
 15  /<br />
Nao concatenou</p>
<p>PL/SQL procedure successfully completed.</p>
<p>SQL> </code></p>
<div id="ads_336x280"><script type="text/javascript"><!--
google_ad_client = "pub-8964513116661040";
google_alternate_color = "ffffFF";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-09-07: wp_quadrado_gra
google_ad_channel = "0247072216";
google_color_border = "FFFFFF";
google_color_bg = "FFFFff";
google_color_link = "4F82CB";
google_color_text = "000000";
google_color_url = "4F82CB";
//--></script><script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p><strong>CONCLUSÃO</strong><br />
Mais uma prova que usar BINDS é sempre uma boa. &#8220;Montar&#8221; comandos SQL dinamicamente pode acarretar essa concatenação acima.</p>
<p><strong>EXPLICAÇÃO PARA O CASO</strong></p>
<p>Após uma pesquisa na internet sobre o assunto, verificamos um texto de Chip Dawes que diz o seguinte:</p>
<blockquote><p>Blank-Padded and Nonpadded Comparison Semantics</p>
<p>With blank-padded semantics, if the two values have different lengths, then Oracle first adds blanks to the end of the shorter one so their lengths are equal. Oracle then compares the values character by character up to the first character that differs. The value with the greater character in the first differing position is considered greater. If two values have no differing characters, then they are considered equal. This rule means that two values are equal if they differ only in the number of trailing blanks. Oracle uses blank-padded comparison semantics only when both values in the comparison are either expressions of datatype CHAR, NCHAR, text literals, or values returned by the USER function.</p></blockquote>
<p>OU seja, o Oracle concatena espaços em branco na string menor para que tenham o mesmo tamanho. Após isso, ele faz a comparação das strings. Se nenhuma letra é diferente, então são iguais.</p>
<p>Caso encerrado!</p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2007/08/24/in-pode-concatenar-espacos-em-branco/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como descobrir a versão do Oracle</title>
		<link>http://glufke.net/2007/08/22/como-descobrir-a-versao-do-oracle/</link>
		<comments>http://glufke.net/2007/08/22/como-descobrir-a-versao-do-oracle/#comments</comments>
		<pubDate>Wed, 22 Aug 2007 23:34:43 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[DBA]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Utilidade]]></category>

		<guid isPermaLink="false">http://glufke.net/2007/08/22/como-descobrir-a-versao-do-oracle/</guid>
		<description><![CDATA[Existem várias formas de descobrir a versão do Oracle sem olhar a &#8220;telinha inicial&#8221; do SQL*Plus. Neste artigo, debateremos 4 maneiras de se descobrir isso. Algumas são bem conhecidas e outra bem &#8220;raras&#8221; de se ver.
Usar a V$Version
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.0.1.4.0 - Production
PL/SQL Release 9.0.1.4.0 - Production
CORE    [...]]]></description>
			<content:encoded><![CDATA[<p>Existem várias formas de descobrir a versão do Oracle sem olhar a &#8220;telinha inicial&#8221; do SQL*Plus. Neste artigo, debateremos 4 maneiras de se descobrir isso. Algumas são bem conhecidas e outra bem &#8220;raras&#8221; de se ver.<span id="more-6"></span></p>
<p><strong>Usar a V$Version</strong></p>
<pre class="brush: sql;">SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.0.1.4.0 - Production
PL/SQL Release 9.0.1.4.0 - Production
CORE    9.0.1.2.0       Production
TNS for Linux: Version 9.0.1.4.0 - Production
NLSRTL Version 9.0.1.4.0 - Production

5 rows selected.</pre>
<p><strong>SQL que mostra versão</strong></p>
<pre class="brush: sql;">SQL> select trunc( (&#038;_O_RELEASE/100000000)) || '.' ||
  2    trunc( mod((&#038;_O_RELEASE/1000000),100)) || '.' ||
  3    trunc( mod((&#038;_O_RELEASE/10000),100)) || '.' ||
  4    trunc( mod((&#038;_O_RELEASE/100),100))
  5    from dual;

TRUNC((
-------
9.0.1.4

1 row selected.

SQL></pre>
<p><strong>Mais um script interessante</strong></p>
<pre class="brush: sql;">rem -----------------------------------------------------------------------
rem Filename:   ver.sql
rem Purpose:    Show database version with options intalled
rem             (handy for your HELP/ABOUT menu)
rem Date:       12-Nov-1999
rem Author:     Frank Naude (frank@ibi.co.za)
rem -----------------------------------------------------------------------

set head off feed off pages 0 serveroutput on

col banner format a72 wrap

select banner
from   sys.v_$version;

select '   With the '||parameter||' option'
from   sys.v_$option
where  value = 'TRUE';

select '   The '||parameter||' option is not installed'
from   sys.v_$option
where  value <> 'TRUE';

begin
    dbms_output.put_line('Port String: '||dbms_utility.port_string);
end;
/</pre>
<div id="ads_336x280"><script type="text/javascript"><!--
google_ad_client = "pub-8964513116661040";
google_alternate_color = "ffffFF";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-09-07: wp_quadrado_gra
google_ad_channel = "0247072216";
google_color_border = "FFFFFF";
google_color_bg = "FFFFff";
google_color_link = "4F82CB";
google_color_text = "000000";
google_color_url = "4F82CB";
//--></script><script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p>Este script gera uma saída como essa:</p>
<pre class="brush: sql;">SQL> @ver
Oracle9i Enterprise Edition Release 9.2.0.5.0 - Production
PL/SQL Release 9.2.0.5.0 - Production
CORE    9.2.0.6.0       Production
TNS for 32-bit Windows: Version 9.2.0.5.0 - Production
NLSRTL Version 9.2.0.5.0 - Production
   With the Partitioning option
   With the Objects option
   With the Advanced replication option
   With the Bit-mapped indexes option
   With the Connection multiplexing option
   With the Connection pooling option
   With the Database queuing option
   With the Incremental backup and recovery option
   With the Instead-of triggers option
   With the Parallel backup and recovery option
   With the Parallel execution option
   With the Parallel load option
   With the Point-in-time tablespace recovery option
   With the Fine-grained access control option
   With the Proxy authentication/authorization option
   With the Change Data Capture option
   With the Plan Stability option
   With the Online Index Build option
   With the Coalesce Index option
   With the Managed Standby option
   With the Materialized view rewrite option
   With the Materialized view warehouse refresh option
   With the Database resource manager option
   With the Spatial option
   With the Visual Information Retrieval option
   With the Export transportable tablespaces option
   With the Transparent Application Failover option
   With the Fast-Start Fault Recovery option
   With the Sample Scan option
   With the Duplexed backups option
   With the Java option
   With the OLAP Window Functions option
   With the Block Media Recovery option
   With the Fine-grained Auditing option
   With the Application Role option
   With the Enterprise User Security option
   With the Oracle Data Guard option
   With the OLAP option
   With the Heap segment compression option
   With the Join index option
   With the Trial Recovery option
   With the Oracle Data Mining option
   With the Online Redefinition option
   With the Streams option
   With the File Mapping option
   The Real Application Clusters option is not installed
   The Oracle Label Security option is not installed
Port String: IBMPC/WIN_NT-8.1.0
SQL></pre>
<p><strong>Usar a DBMS_UTILITY</strong></p>
<pre class="brush: sql;">SQL> DESC DBMS_OUTPUT

PROCEDURE DB_VERSION
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 VERSION                        VARCHAR2                OUT
 COMPATIBILITY                  VARCHAR2                OUT

SQL>
SQL>
SQL> declare
  2  a1 varchar2(1000);
  3  a2 varchar2(1000);
  4  begin
  5    dbms_utility.db_version(a1, a2);
  6    dbms_output.put_line('VERSAO: '||A1||'   COMPATIBILTY: '||A2);
  7  end;
  8  /
VERSAO: 9.2.0.5.0   COMPATIBILTY: 9.2.0.0.0
SQL> </pre>
<p>Comente <a href="http://glufke.net/oracle/viewtopic.php?t=248">aqui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2007/08/22/como-descobrir-a-versao-do-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
