Como colocar valores de um campo de texto dentro de um in

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
renatotn7
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 30 Jun 2009 11:31 am
Localização: RJ

caros,

Como posso fazer isso?
exemplo

Selecionar tudo

Select * from nnnn where nnnn.campo1 in (:txt1);
isso não funciona, pois se eu coloco no campo texto: 2501, 2502

vem:

Selecionar tudo

Select * from nnnn where nnnn.campo1 in ('2501,2502');
com isso obtendo uma resposta errada

eu queria saber como faço para vir:

Selecionar tudo

Select * from nnnn where nnnn.campo1 in ('2501','2502');
Abs
renatotn7
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 30 Jun 2009 11:31 am
Localização: RJ

obs, considerando apenas um campo texto
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Opa..
Isso não dá certo porque o :txt1 pertence a um PL/SQL.
No momento que tu executa um comando SQL, ele não entende o conteúdo de :txt1.

Alternativas:
1) DBMS_SQL

2) Tu pode criar uma pl/table pra receber esse conteúdo, inserir numa tabela temporária e executar a tua consulta baseada nela.

3) Se tu jogar pro banco, tem mais N maneiras de fazer :D
ronaldofla
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Sex, 18 Jun 2010 9:46 am
Localização: santos-sp
Ronaldo Silva

segue um exemplo.

Selecionar tudo

prompt especificação da PACK
create or replace package pack_teste_SQLdinamic is

procedure p_executar_sql_vilacidade(p_string_sql     in   varchar2,
                                    p_nm_municipio   in   varchar2) ;

procedure p_obter_vilacidade_ibge (p_nm_municipio   in   varchar2    );

end pack_teste_SQLdinamic;
/
show err
/
prompt corpo da PACK
create or replace package body pack_teste_SQLdinamic is


procedure p_executar_sql_vilacidade(p_string_sql     in   varchar2,
                                    p_nm_municipio   in   varchar2) is
-- variaveis
   v_vilacidade                varchar2(50);
   v_cd_ibge                   number;
   v_cursorid                  integer;
   v_rows                      integer;
   v_string_sql                varchar2(2000);
--
begin
   --
   
   v_string_sql := 'select a.nm_vila_cidade, '||
                       'a.cd_ibge '||
                        'from tam_vilacidade a '||
                    'where a.nm_municipio = '||''''||p_nm_municipio||'''';
                    
   if p_string_sql is null then
      raise_application_error(-20791, 'não foi passada nenhum select. Procedure abortada. ');
   else
      v_cursorid := dbms_sql.open_cursor;
      dbms_sql.parse(v_cursorid, p_string_sql, dbms_sql.v7);
      dbms_sql.define_column(v_cursorid, 1, v_vilacidade,50);
      dbms_sql.define_column(v_cursorid, 2, v_cd_ibge);
      v_rows := dbms_sql.execute(v_cursorid);
      loop
      --
         if dbms_sql.fetch_rows(v_cursorid) = 0 then
            exit;
         end if;
         dbms_sql.column_value(v_cursorid, 1, v_vilacidade);
         dbms_sql.column_value(v_cursorid, 2, v_cd_ibge);
      --
      end loop;
      dbms_sql.close_cursor(v_cursorid);
   end if;
   --
--exception  when no_data_found then
   --dbms_sql.close_cursor(v_cursorid);
end p_executar_sql_vilacidade;
--
-- ---------------------------------------------------------------------------------------------------------
--
procedure p_obter_vilacidade_ibge (p_nm_municipio   in   varchar2    ) is
   --
   v_string_sql            varchar2(2000);
   --
begin
   v_string_sql := 'select a.nm_vila_cidade, '||
                    'a.cd_ibge '||
                     'from tam_vilacidade a '||
                    'where a.nm_municipio = '||''''||p_nm_municipio||'''';
    --
    p_executar_sql_vilacidade(v_string_sql,p_nm_municipio);
    --
end p_obter_vilacidade_ibge;
end pack_teste_SQLdinamic;
/
show err
/
tiago.steil
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qui, 01 Jul 2010 3:22 pm
Localização: RS
Oracle Developer

Eae,

Não sei se entendi direito, mas se atraves de uma informação da tela você quer pegar algo que esteja na tabela não teria como usar assim...

Selecionar tudo

Select * from nnnn where nnnn.campo1 
exists (select campo1 
           from tabela t
           where t.campo1 =:parametro);
Não sei tambem mas pelo que entendi é algo assim
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Pois é, Tiago..
No teu exemplo até dá certo, mas no caso do Renato é IN.

Selecionar tudo

SELECT *
  FROM dual
 WHERE 1 IN (:x)
O SQL não entende.
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

A partir da versão 9i:

Selecionar tudo

create or replace type tab_number as table of number;

Selecionar tudo

create or replace
function  f_virgulas_em_linhas
( p_string in varchar2
)  return tab_number pipelined as
  v_str varchar2(4000);
  v_num number;
begin
  v_str := p_string || ',';
  while ( v_str is not null ) loop

    v_num := to_number( substr( v_str, 1, instr( v_str, ',', 1 ) - 1 ) );
    pipe row ( v_num );
    v_str := substr( v_str, instr( v_str, ',', 1) + 1 );

  end loop;

  return;
end;

Selecionar tudo

select column_value 
from   table( f_virgulas_em_linhas('4,8,15,16,23,42') )
;

COLUMN_VALUE
4
8
15
16
23
42
Responder
  • Informação