Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как обмануть Oracle  [new]
Droll
Guest
Есть таблица
Create table TEST(RR varchar2(12));
В ней записи
INSERT INTO TEST VALUES(123);
INSERT INTO TEST VALUES(123F);
INSERT INTO TEST VALUES(1234);
INSERT INTO TEST VALUES(12356W);
INSERT INTO TEST VALUES(12345);
и т.д. То есть часть может быть приведена к типу NUMBER, а часть нет.

Надо получить запросом или PL/SQL блоком те записи, которые не могут быть приведены к типу NUMBER.
Пробовал ударом в лоб
declare
dd number;
begin
for r1 in (select * from TEST) loop
begin
dd:= to_number(r1.RR);
end;
exception when others then dbms_output.put_line(r1.RR); end;
end loop;
end;
Ругается страшно. Видимо на этапе компиляции Oracle видит грабли.
Мне бы принцип.
27 июл 06, 09:14    [2931185]     Ответить | Цитировать Сообщить модератору
 Re: Как обмануть Oracle  [new]
aZm
Member

Откуда: 3й рим
Сообщений: 2355
а внести фразу ексепшн в операторные скопки не пробовали ;)?
27 июл 06, 09:17    [2931193]     Ответить | Цитировать Сообщить модератору
 Re: Как обмануть Oracle  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
Зачем писать код там, где всё может может быть сделано одним запросом?

SQL> select *
  2   from test
  3   where replace(translate(v, '01234567890', '000000000'), 0) is not null;

V
--------------------------------------------------------------------------------
123F
12356W
27 июл 06, 09:26    [2931212]     Ответить | Цитировать Сообщить модератору
 Re: Как обмануть Oracle  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18483
Ну это уж слишком просто ;-)
tst> create table t1(a) as
  2  select '1' from dual union all
  3  select '1.2' from dual union all
  4  select '1E2' from dual;

Table created.

tst> select * from t1 where replace(translate(a, '01234567890', '000000000'), 0) is not null;

A
---
1.2
1E2

tst> select to_number(a) from t1;

TO_NUMBER(A)
------------
           1
         1.2
         100
27 июл 06, 09:30    [2931225]     Ответить | Цитировать Сообщить модератору
 Re: Как обмануть Oracle  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
А у него там тока целые числа :)

Или пусть уточняет требования.
27 июл 06, 09:32    [2931232]     Ответить | Цитировать Сообщить модератору
 Re: Как обмануть Oracle  [new]
strelets12
Guest
Если предполагаются только целые числа то:
select * from test
where regexp_replace(rr,'\d')is not null
27 июл 06, 09:43    [2931283]     Ответить | Цитировать Сообщить модератору
 Re: Как обмануть Oracle  [new]
Dmitry A. Los
Member

Откуда: Kiev
Сообщений: 31
DECLARE
   dd   NUMBER;
BEGIN
   FOR r1 IN (SELECT *
                FROM test)
   LOOP
      BEGIN
         dd := TO_NUMBER (r1.rr);
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.put_line (r1.rr);
      END;
   END LOOP;
END;
27 июл 06, 09:46    [2931306]     Ответить | Цитировать Сообщить модератору
 Re: Как обмануть Oracle  [new]
Dmitry A. Los
Member

Откуда: Kiev
Сообщений: 31
Тоже самое, только END у тебя лишний был
27 июл 06, 09:47    [2931314]     Ответить | Цитировать Сообщить модератору
 Re: Как обмануть Oracle  [new]
va_kochnev
Member

Откуда:
Сообщений: 498
А по мне так проще написать один раз функцию навроде
create function check_number(p_str varchar2) return varchar2 is
v_number number;
begin
v_number:=p_str;
return 'Y';
excpetion
when others then return 'N';
end;

и использовать ее в самых разных запросах к разным таблицам.
В данном случае
select*from test where check_number(rr)='Y'
27 июл 06, 10:53    [2931637]     Ответить | Цитировать Сообщить модератору
 Re: Как обмануть Oracle  [new]
Elic
Member

Откуда:
Сообщений: 29976
Droll
Мне бы принцип.
STFF Есть ли SQL-функция проверки символьного поля,является ли оно "числом"?

______________________________________________________________________

2 Q u a d r o - слишком мудрёно :)

2 va_kochnev - функция будет работать намного медленней
27 июл 06, 11:29    [2931920]     Ответить | Цитировать Сообщить модератору
 Re: Как обмануть Oracle  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10040
This type of question keeps popping up and every time I try to point out we are comparing apples and oranges. TRANSLATE solution simply checks for non-digits, so if Droll meant exactly what he wrote - "которые не могут быть приведены к типу NUMBER", such approach is incorrect (e.g. +16, -21, 12E-3, etc. могут быть приведены к типу NUMBER). If Dron meant column RR is not a sequence of digits, TO_NUMBER+exception handler approach is incorrect.

SY.
27 июл 06, 17:22    [2934308]     Ответить | Цитировать Сообщить модератору
 Re: Как обмануть Oracle  [new]
Elic
Member

Откуда:
Сообщений: 29976
SY
we are comparing apples and oranges.
Зачем кидать камень в огород отвечающих, когда его заслуживает пропавший вопрошавший ?!
И, кстати, по крайней мере у меня указана область применения решения. А совпадает ли она с авторской? - автору виднее.
27 июл 06, 17:58    [2934521]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить