<?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; Curiosidade</title>
	<atom:link href="http://glufke.net/tag/curiosidade/feed/" rel="self" type="application/rss+xml" />
	<link>http://glufke.net</link>
	<description></description>
	<lastBuildDate>Mon, 16 Apr 2012 19:33:42 +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>PLAN_TABLE faz aniversário de 21 anos em 19-out-2009</title>
		<link>http://glufke.net/2009/10/13/plan_table-faz-aniversario-de-21-anos-em-19-out-2009/</link>
		<comments>http://glufke.net/2009/10/13/plan_table-faz-aniversario-de-21-anos-em-19-out-2009/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 17:00:35 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Curiosidade]]></category>

		<guid isPermaLink="false">http://glufke.net/?p=40</guid>
		<description><![CDATA[
			
			
			
			
			
			
			
						
			Pois é isso mesmo! A querida tabela do ORACLE que nos mostra o plano de execução dos SQLs hoje completa 21 anos!
Hoje eu fui olhar um plano de execução e me deparei com a seguinte mensagem:
SET AUTOTRACE ON
SELECT bla bla bla...

Execution Plan
----------------------------------------------------------

--------------------------------------------------------------
&#124; Id  &#124; Operation          [...]]]></description>
			<content:encoded><![CDATA[<div class="bottomcontainerBox" style="">
			<div style="float:left; width:50px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fglufke.net%2F2009%2F10%2F13%2Fplan_table-faz-aniversario-de-21-anos-em-19-out-2009%2F&amp;layout=button_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:50px; height:21px;"></iframe></div>
			<div style="float:left; width:60px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://glufke.net/2009/10/13/plan_table-faz-aniversario-de-21-anos-em-19-out-2009/"></g:plusone>
			</div>
			<div style="float:left; width:70px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://glufke.net/2009/10/13/plan_table-faz-aniversario-de-21-anos-em-19-out-2009/"  data-text="PLAN_TABLE faz aniversário de 21 anos em 19-out-2009" data-count="horizontal" data-via="glufke"></a>
			</div><div style="float:left; width:110px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script type="in/share" data-url="http://glufke.net/2009/10/13/plan_table-faz-aniversario-de-21-anos-em-19-out-2009/" data-counter="right"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div><p>Pois é isso mesmo! A querida tabela do ORACLE que nos mostra o plano de execução dos SQLs hoje completa 21 anos!<br />
Hoje eu fui olhar um plano de execução e me deparei com a seguinte mensagem:</p>
<pre class="brush: plain;">SET AUTOTRACE ON
SELECT bla bla bla...

Execution Plan
----------------------------------------------------------

--------------------------------------------------------------
| Id  | Operation          | Name       | Rows  | Cost (%CPU)|
--------------------------------------------------------------
|   0 | SELECT STATEMENT   |            |     1 |   102   (0)|
|   1 |  SORT AGGREGATE    |            |     1 |            |
|   2 |   TABLE ACCESS FULL| TABELA     |  4322 |   102   (0)|
--------------------------------------------------------------

Note
-----
   - 'PLAN_TABLE' is old version</pre>
<p>PLAN_TABLE is old version ???<span id="more-40"></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>Olhei no script de criação da nova PLAN_TABLE e descobri nos comentários a data de cada modificação: 19 de Outubro de 1988 !</p>
<pre class="brush: plain;">
rem
rem $Header: utlxplan.sql 29-oct-2001.20:28:58 mzait Exp $ xplainpl.sql
rem
Rem Copyright (c) 1988, 2001, Oracle Corporation.  All rights reserved.
Rem NAME
REM    UTLXPLAN.SQL
Rem  FUNCTION
Rem  NOTES
Rem  MODIFIED
Rem     mzait      10/26/01  - add keys and filter predicates to the plan table
Rem     ddas       05/05/00  - increase length of options column
Rem     ddas       04/17/00  - add CPU, I/O cost, temp_space columns
Rem     mzait      02/19/98 -  add distribution method column
Rem     ddas       05/17/96 -  change search_columns to number
Rem     achaudhr   07/23/95 -  PTI: Add columns partition_{start, stop, id}
Rem     glumpkin   08/25/94 -  new optimizer fields
Rem     jcohen     11/05/93 -  merge changes from branch 1.1.710.1 - 9/24
Rem     jcohen     09/24/93 - #163783 add optimizer column
Rem     glumpkin   10/25/92 -  Renamed from XPLAINPL.SQL
Rem     jcohen     05/22/92 - #79645 - set node width to 128 (M_XDBI in gendef)
Rem     rlim       04/29/91 -         change char to varchar2
Rem   Peeler     10/19/88 - Creation
Rem
Rem This is the format for the table that is used by the EXPLAIN PLAN
Rem statement.  The explain statement requires the presence of this
Rem table in order to store the descriptions of the row sources.

create table PLAN_TABLE (
	statement_id 	varchar2(30),
	timestamp    	date,
	remarks      	varchar2(80),
	operation    	varchar2(30),
	options       	varchar2(255),
	object_node  	varchar2(128),
	object_owner 	varchar2(30),
	object_name  	varchar2(30),
	object_instance numeric,
	object_type     varchar2(30),
	optimizer       varchar2(255),
	search_columns  number,
	id		numeric,
	parent_id	numeric,
	position	numeric,
	cost		numeric,
	cardinality	numeric,
	bytes		numeric,
	other_tag       varchar2(255),
	partition_start varchar2(255),
        partition_stop  varchar2(255),
        partition_id    numeric,
	other		long,
	distribution    varchar2(30),
	cpu_cost	numeric,
	io_cost		numeric,
	temp_space	numeric,
        access_predicates varchar2(4000),
        filter_predicates varchar2(4000));
</pre>
<p>Atingiu a maioridade! <img src='http://glufke.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />   Feliz aniversário PLAN_TABLE!</p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2009/10/13/plan_table-faz-aniversario-de-21-anos-em-19-out-2009/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[<div class="bottomcontainerBox" style="">
			<div style="float:left; width:50px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fglufke.net%2F2007%2F10%2F11%2Fselect-que-retorna-os-numeros-primos%2F&amp;layout=button_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:50px; height:21px;"></iframe></div>
			<div style="float:left; width:60px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://glufke.net/2007/10/11/select-que-retorna-os-numeros-primos/"></g:plusone>
			</div>
			<div style="float:left; width:70px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://glufke.net/2007/10/11/select-que-retorna-os-numeros-primos/"  data-text="Select que retorna os Números Primos" data-count="horizontal" data-via="glufke"></a>
			</div><div style="float:left; width:110px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script type="in/share" data-url="http://glufke.net/2007/10/11/select-que-retorna-os-numeros-primos/" data-counter="right"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div><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>Potência em PL/SQL sem usar função POWER</title>
		<link>http://glufke.net/2007/09/25/potencia-em-plsql-sem-usar-funcao-power/</link>
		<comments>http://glufke.net/2007/09/25/potencia-em-plsql-sem-usar-funcao-power/#comments</comments>
		<pubDate>Tue, 25 Sep 2007 22:41:51 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[Curiosidade]]></category>
		<category><![CDATA[Matemática]]></category>

		<guid isPermaLink="false">http://glufke.net/2007/09/25/potencia-em-plsql-sem-usar-funcao-power/</guid>
		<description><![CDATA[
			
			
			
			
			
			
			
						
			Todos conhecem a função do Oracle que faz a potêcia: o POWER. Abaixo, vamos demonstrar como elevar números sem usar essa função.
select power(2,3)
from dual
Além dessa função é possível usar o ** para potência:
SQL> set serveroutput on
SQL> declare
  2    vtemp number;
  3  begin
  4    vtemp := [...]]]></description>
			<content:encoded><![CDATA[<div class="bottomcontainerBox" style="">
			<div style="float:left; width:50px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fglufke.net%2F2007%2F09%2F25%2Fpotencia-em-plsql-sem-usar-funcao-power%2F&amp;layout=button_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:50px; height:21px;"></iframe></div>
			<div style="float:left; width:60px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://glufke.net/2007/09/25/potencia-em-plsql-sem-usar-funcao-power/"></g:plusone>
			</div>
			<div style="float:left; width:70px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://glufke.net/2007/09/25/potencia-em-plsql-sem-usar-funcao-power/"  data-text="Potência em PL/SQL sem usar função POWER" data-count="horizontal" data-via="glufke"></a>
			</div><div style="float:left; width:110px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script type="in/share" data-url="http://glufke.net/2007/09/25/potencia-em-plsql-sem-usar-funcao-power/" data-counter="right"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div><p>Todos conhecem a função do Oracle que faz a potêcia: o POWER. Abaixo, vamos demonstrar como elevar números sem usar essa função.<span id="more-16"></span></p>
<pre class="brush: sql;">select power(2,3)
from dual</pre>
<p>Além dessa função é possível usar o ** para potência:</p>
<pre class="brush: sql;">SQL> set serveroutput on
SQL> declare
  2    vtemp number;
  3  begin
  4    vtemp := 2**3;   -- Equivalente a POWER(2,3)
  5    dbms_output.put_line ( 'Resultado: '||vtemp );
  6  end;
  7  /
Resultado: 8

PL/SQL procedure successfully completed.

SQL>
</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>Verificamos que o uso do ** equivale a função POWER do Oracle. Infelizmente o uso não é permitido dentro de blocos PL/SQL. Não funciona direto num SQL.</p>
<p>Comente <a href="http://glufke.net/oracle/viewtopic.php?t=662">aqui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2007/09/25/potencia-em-plsql-sem-usar-funcao-power/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Order By muda em diferentes NLS_LANG</title>
		<link>http://glufke.net/2007/09/06/order-by-muda-em-diferentes-nls_lang/</link>
		<comments>http://glufke.net/2007/09/06/order-by-muda-em-diferentes-nls_lang/#comments</comments>
		<pubDate>Thu, 06 Sep 2007 17:50:30 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Curiosidade]]></category>
		<category><![CDATA[Order By]]></category>

		<guid isPermaLink="false">http://glufke.net/2007/09/06/order-by-muda-em-diferentes-nls_lang/</guid>
		<description><![CDATA[
			
			
			
			
			
			
			
						
			Sabemos que mudando o NLS_LANG do oracle, ele assume comportamentos diferentes. (Por exemplo, muda o formato da Data, muda o Ponto Decimal ou Vírgula Decimal, etc.) Mas uma coisa que as vezes passa despercebido é que o NLS_LANG também pode mudar a ORDEM das colunas: 
Exemplo: (Note a diferença)

SQL> SELECT * FROM A ORDER BY [...]]]></description>
			<content:encoded><![CDATA[<div class="bottomcontainerBox" style="">
			<div style="float:left; width:50px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fglufke.net%2F2007%2F09%2F06%2Forder-by-muda-em-diferentes-nls_lang%2F&amp;layout=button_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:50px; height:21px;"></iframe></div>
			<div style="float:left; width:60px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://glufke.net/2007/09/06/order-by-muda-em-diferentes-nls_lang/"></g:plusone>
			</div>
			<div style="float:left; width:70px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://glufke.net/2007/09/06/order-by-muda-em-diferentes-nls_lang/"  data-text="Order By muda em diferentes NLS_LANG" data-count="horizontal" data-via="glufke"></a>
			</div><div style="float:left; width:110px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script type="in/share" data-url="http://glufke.net/2007/09/06/order-by-muda-em-diferentes-nls_lang/" data-counter="right"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div><p>Sabemos que mudando o NLS_LANG do oracle, ele assume comportamentos diferentes. (Por exemplo, muda o formato da Data, muda o Ponto Decimal ou Vírgula Decimal, etc.) Mas uma coisa que as vezes passa despercebido é que o NLS_LANG também pode mudar a ORDEM das colunas: <span id="more-11"></span></p>
<p>Exemplo: (Note a diferença)</p>
<pre class="brush: sql;">
SQL> SELECT * FROM A ORDER BY 1;

F
-
1
5
A
B
C

SQL> ALTER SESSION SET NLS_LANGUAGE = 'PORTUGUESE';

Session altered.

SQL> SELECT * FROM A ORDER BY 1;

F
-
A
B
C
1
5
</pre>
<p>Como se pode ver, mudei de AMERICAN para PORTUGUESE e a ordem mudou! No primeiro caso, os números vieram primeiro. No segundo, os números ficaram por último. Como podemos nos certificar que uma coluna SEMPRE vai obedecer a mesma ordem, mesmo se o NLS_LANG for diferente ?</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>Solução 1</strong><br />
Pode se criar uma pequena função que indica se o campo é numérico ou não. Daí­, ordenamos primeiro pelo resultado dessa função. Lá vai:</p>
<pre class="brush: sql;">
SQL> create or replace Function f_nro ( p_numero in varchar2 ) return number
  2  as
  3    l_numero number;
  4  begin
  5    l_numero := to_number(p_numero);
  6    return 1;
  7  exception when others then return 0;
  8  end;
  9
 10
 11  /

Function created.

SQL> select f_nro('1234') from dual;

F_NRO('1234')
-------------
              1

SQL> select f_nro('1234a') from dual;

F_NRO('1234A')
--------------
             0

SQL>
</pre>
<p>Veja&#8230; ela retorna ZERO se não é um número! Daí­ podemos ordenar desta forma:</p>
<pre class="brush: sql;">
SQL> ALTER SESSION SET NLS_LANGUAGE = 'PORTUGUESE';

Session altered.

SQL>  SELECT * FROM A ORDER BY 1;

F
-
A
B
C
1
5

SQL> SELECT * FROM A ORDER BY f_nro(FIELD) desc, field;

F
-
5
1
A
B
C

SQL>
</pre>
<p>Voalá!!!</p>
<p><strong>Solução 2</strong><br />
É possí­vel usar a função DUMP. Exemplo:</p>
<pre class="brush: sql;">
SQL> select dump('A') from dual;

DUMP('A')
----------------
Typ=96 Len=1: 65

SQL> SELECT * FROM A ORDER BY dump(FIELD);

F
-
1
5
A
B
C
</pre>
<p>Se tiver outras maneiraas, fique a vontade de postá-las <a href="http://glufke.net/oracle/viewtopic.php?p=7">aqui</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2007/09/06/order-by-muda-em-diferentes-nls_lang/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comparação de Campos com NULL</title>
		<link>http://glufke.net/2007/09/06/comparacao-de-campos-com-null/</link>
		<comments>http://glufke.net/2007/09/06/comparacao-de-campos-com-null/#comments</comments>
		<pubDate>Thu, 06 Sep 2007 13:34:52 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[Curiosidade]]></category>
		<category><![CDATA[NULL]]></category>

		<guid isPermaLink="false">http://glufke.net/2007/09/06/comparacao-de-campos-com-null/</guid>
		<description><![CDATA[
			
			
			
			
			
			
			
						
			Sabemos que quando um variável ou um campo no Oracle está NULL, ele não pode ser simplesmente comparado a um outro valor, pois o resultado da compração também será false!

declare
  a number:=null;
  b number:=null;
begin
  if a=b
  then dbms_output.put_line('SIM');
  else  dbms_output.put_line('nao');
  end if;
end;

SQL> /
nao



POUCO EFICIENTE
Para &#8220;sanar&#8221; este problema, é [...]]]></description>
			<content:encoded><![CDATA[<div class="bottomcontainerBox" style="">
			<div style="float:left; width:50px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fglufke.net%2F2007%2F09%2F06%2Fcomparacao-de-campos-com-null%2F&amp;layout=button_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:50px; height:21px;"></iframe></div>
			<div style="float:left; width:60px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://glufke.net/2007/09/06/comparacao-de-campos-com-null/"></g:plusone>
			</div>
			<div style="float:left; width:70px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://glufke.net/2007/09/06/comparacao-de-campos-com-null/"  data-text="Comparação de Campos com NULL" data-count="horizontal" data-via="glufke"></a>
			</div><div style="float:left; width:110px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script type="in/share" data-url="http://glufke.net/2007/09/06/comparacao-de-campos-com-null/" data-counter="right"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div><p>Sabemos que quando um variável ou um campo no Oracle está NULL, ele não pode ser simplesmente comparado a um outro valor, pois o resultado da compração também será false!<span id="more-10"></span></p>
<pre class="brush: sql;">
declare
  a number:=null;
  b number:=null;
begin
  if a=b
  then dbms_output.put_line('SIM');
  else  dbms_output.put_line('nao');
  end if;
end;

SQL> /
nao
</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>POUCO EFICIENTE</strong><br />
Para &#8220;sanar&#8221; este problema, é possivel usar NVL, que não é uma boa prática. Veremos porque:</p>
<pre class="brush: sql;">
if nvl(a, 123456789) = nvl(b, 123456789)
then --seu código
</pre>
<p>O exemplo acima até funciona se o valor for diferente de 123456789. Se o valor for igual, ferra a comparação!</p>
<p><strong>MUITO EFICIENTE</strong><br />
A melhor prática possível<br />
É um pouco trabalhosa, mas sempre funcionará:</p>
<pre class="brush: sql;">
if a<>b
or (a is null and b is not null)
or (a is not null and b is null)
then --seu codigo
</pre>
<p>Comente <a href="http://glufke.net/oracle/viewtopic.php?p=343">aqui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2007/09/06/comparacao-de-campos-com-null/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[<div class="bottomcontainerBox" style="">
			<div style="float:left; width:50px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fglufke.net%2F2007%2F08%2F24%2Fin-pode-concatenar-espacos-em-branco%2F&amp;layout=button_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:50px; height:21px;"></iframe></div>
			<div style="float:left; width:60px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://glufke.net/2007/08/24/in-pode-concatenar-espacos-em-branco/"></g:plusone>
			</div>
			<div style="float:left; width:70px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://glufke.net/2007/08/24/in-pode-concatenar-espacos-em-branco/"  data-text="&#8220;IN&#8221; pode concatenar espaços em branco" data-count="horizontal" data-via="glufke"></a>
			</div><div style="float:left; width:110px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script type="in/share" data-url="http://glufke.net/2007/08/24/in-pode-concatenar-espacos-em-branco/" data-counter="right"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div><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>
	</channel>
</rss>

