Validação do conteudo de um conjunto de um select

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Pode parecer meio estranho e é! Pois não sei se isto é viavel e possível. Mas gostaria de saber se tem como dentro de um select validar o conteúdo de um conjunto, exemplo:

Se em determinado script eu colocar uma condição que me traga os registros que pertencerem a um conjunto ou contenha determinada cadeia de caracteres (IN ou LIKE) e querer saber se isto é falso ou verdadeiro ou seja se me trouxer registro ou não?

Gostaria de aproveitar o tópico também para sanar uma dúvida "básica", em determinado SELECT seu eu quiser saber a quantidade de registros e ainda saber quais registros são repetidos é possível?

Att.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

Selecionar tudo

SELECT table_name,  COUNT(*)
FROM all_indexes
GROUP BY table_name
HAVING COUNT(*) = 2;
esse select so trara o nome das tabelas que se repetem
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Você pode usar case expression para atribuir os valores que você quer de acordo com uma avaliação booleana de predicado. Por exemplo:

Selecionar tudo

SQL> create table emp as
  2  select 'KOBE BEAN BRYANT' emp_name from dual union all
  3  select 'LEBRON JAMES' emp_name from dual union all
  4  select 'STEVE NASH' emp_name from dual union all
  5  select 'BARON DAVIS' emp_name from dual union all
  6  select 'JEROME JAMES' emp_name from dual union all
  7  select 'TIM DUNCAN' emp_name from dual union all
  8  select 'MARK BRYANT' emp_name from dual union all
  9  select 'KEVIN DURANT' emp_name from dual;
 
Table created
 
SQL> 
SQL> select e.*,
  2         case when e.emp_name like '%BRYANT' then 1
  3              else 0 end acha_bryant
  4    from emp e
  5  /
 
EMP_NAME         ACHA_BRYANT
---------------- -----------
KOBE BEAN BRYANT           1
LEBRON JAMES               0
STEVE NASH                 0
BARON DAVIS                0
JEROME JAMES               0
TIM DUNCAN                 0
MARK BRYANT                1
KEVIN DURANT               0
 
8 rows selected
 
SQL> 
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Cara vocês são feras mesmo!

Vou estudar estes scripts, qualquer dúvida volto a postar.

Muito obirgado.
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Mais uma...

Existe ainda a possibilidade trabalhar com "variavel" em um select (s/ cursor)? Assim:

Selecionar tudo


select 
length('1234567') as "tamanho",
lpad('1234567', tamanho, ' ') 
from dual       

(Erro)

Grato.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

assim não pode?

Selecionar tudo

select
length('1234567') as "tamanho",
lpad('1234567', length('1234567'), ' ')
from dual
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Serve, serve sim, você me deu uma ideia!

Mas além disso, a seguinte situação pode gerar um erro de incompatiblidade de tipos?

Selecionar tudo


LPAD( vTST_CURSOR2.MATRICULA, 6, 0)   ||

Quando o que eu acho que seria certo:

Selecionar tudo


LPAD( vTST_CURSOR2.MATRICULA, 6, '0')   ||

Supondo que Matricula seja VARCHAR2?
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Na pergunta da variavel consegui fazer da seguinte maneira:

Selecionar tudo


SELECT
LPAD('1234567',  decode(length('1234567'), 7, 15, 20), ' ')
FROM DUAL


Grato.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Realmente o estritamente correto é como você falou ali com o '0'. Se você usar 0 o Oracle converte implicitamente por você.
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Entendi, porém não gera nenhum erro ou "warning" !?

Att.
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Bem, coincidência ou não após eu ter alterado

Selecionar tudo

De: LPAD( vTST_CURSOR2.MATRICULA, 6, 0)   || 

Para: LPAD( vTST_CURSOR2.MATRICULA, 6, '0')   || 
O seguinte erro parou de ocorrer:

Selecionar tudo

ORA-06502: PL/SQL: numeric or value error: character to number conversion error -6502
O que acontecia era que, ao gerar este erro a execução da proc era interrompida e o arquivo texto era gerado incompleto.

Gostaria de saber se tem como identificar precisamente em qual linha que está ocorrendo o erro?

Att.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Bom, coincidência ou não, o erro não era no LPAD pois o que o Oracle faz implicitamente para você é o seguinte:

Selecionar tudo

SQL> SELECT lpad(1, 6, 0) col1 FROM dual;
 
COL1
------
000001
 
SQL> SELECT lpad(to_char(1), 6, to_char(0)) col1 FROM dual;
 
COL1
------
000001
São equivalentes, se um der erro o outro vai dar também.

E a mensagem está dizendo que o erro era de PL/SQL e não SQL, na conversão de caractere para número em vez de número para caractere.

Poderia ser por conta daquele concatenamento que há na direita do LPAD, por exemplo:

Selecionar tudo

SQL> DECLARE
  2    v_char VARCHAR2(100);
  3    v_num  NUMBER;
  4  BEGIN
  5    v_char := to_number(lpad(to_char(1), 6, to_char(0)) || '-1');
  6    v_num := to_number(v_char);
  7  END;
  8  /
 
DECLARE
  v_char VARCHAR2(100);
  v_num  NUMBER;
BEGIN
  v_char := to_number(lpad(to_char(1), 6, to_char(0)) || '-1');
  v_num := to_number(v_char);
END;
 
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 6
 
SQL> 
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Então posso entender que todo o retorno de uma função LPAD ou similares será uma string?

Att.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Sim, será sempre uma string, e nem sempre será possível convertê-la para um número, principalmente se houver concatenamentos com outros elementos de varchar.
Responder
  • Informação