Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 LENGTHB???  [new]
Jensid
Member

Откуда:
Сообщений: 130
Есть база ORacle 8.1.5 (Solaris 8) и база Oracle 10g (solaris 10).
Пытаюсь выполнить следующий скрипт на обоих серверах. Получаю разный результат: на 8.1.5 получаю "YES", а на 10g не получаю.
Declare
	   CURSOR r_sal  IS
 SELECT     S.ENDDATE
                FROM SALE  S
 WHERE S.CUS_C=925;
      sal_rec   r_sal%ROWTYPE;
	         vv_enddate    VARCHAR2(20);
      
     BEGIN  
 OPEN r_sal;
LOOP

FETCH  r_sal INTO sal_rec;

     EXIT WHEN r_sal%NOTFOUND;

vv_enddate:=TO_CHAR(TRUNC(sal_rec.enddate),'DD.MM.YYYY');

IF LENGTHB(vv_enddate)=0 then dbms_output.put_line('YES'); end if;
END IF;

END LOOP;
close r_sal;
END;
С чем это связано?
15 янв 07, 16:49    [3643435]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Jensid
С чем это связано?
С разными данными?
15 янв 07, 16:51    [3643463]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
RA\/EN
Member

Откуда:
Сообщений: 3658
Выбери на обеих базах это:
SELECT LENGTHB(SYSDATE) LB_DT, LENGTHB(to_date(NULL)) LB_NULL FROM dual
15 янв 07, 16:54    [3643483]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Олег_Сл
Member

Откуда: Санкт-Петербург
Сообщений: 123
Пример SALE для ORacle 8.1.5 и Oracle 10g
где
 S.CUS_C=925; 
покажи !
15 янв 07, 16:54    [3643484]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
А попроще пример сделать?

set serveroutput on

Declare
  vv_enddate    VARCHAR2(20);
begin
    vv_enddate:='';
    IF LENGTHB(vv_enddate)=0 then
        dbms_output.put_line('YES');
    else
        dbms_output.put_line('NO');
   end if;
END;
/


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bit Production
With the Partitioning, OLAP and Data Mining Scoring Engine options

...

11 /
NO

PL/SQL procedure successfully completed.

SQL>

На 8.1.5 видимо ошибка. Строка длины 0, это пустая строка (NULL). Выражение LENGTHB(vv_enddate)=0 должно всегда возвращать FALSE или NULL.
15 янв 07, 17:01    [3643569]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jensid
Member

Откуда:
Сообщений: 130
Тип столбца ENDDATE DATE. Данные в обеих базах в этом столбце одинаковые: 01.01.2007.
SELECT LENGTHB(SYSDATE) LB_DT, LENGTHB(to_date(NULL)) LB_NULL FROM dual
даёт одинаковый результат
8	
15 янв 07, 17:01    [3643574]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jensid
Member

Откуда:
Сообщений: 130
ой, извинюсь!!! Значения в обеих базах в этом столбце: NULL
15 янв 07, 17:03    [3643588]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Может быть на 8.1.5 создана пользовательская функция LENGTHB?
15 янв 07, 17:03    [3643589]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jensid
Member

Откуда:
Сообщений: 130
При попытке написать
IF LENGTH(vv_enddate)=false
получаю ошибку, а при замене =0 на =NULL, на обеих базах не выводися 'YES'.
Внутри функции, код которой я тестирую, нет пользовательской функции LENGTHB и функция не является функцией пакета.
Помогите, пожалуста. Сейчас увидел, что во многих функциях на 8.1.5 используется такая проверка. Надо понять почему не работает она на 10g.
15 янв 07, 17:12    [3643690]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Jensid
Тип столбца ENDDATE DATE. Данные в обеих базах в этом столбце одинаковые: 01.01.2007.
SELECT LENGTHB(SYSDATE) LB_DT, LENGTHB(to_date(NULL)) LB_NULL FROM dual
даёт одинаковый результат
8	
В смысле? Длина null - 8? Это на которой версии?
15 янв 07, 17:13    [3643694]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Jensid
при замене =0 на =NULL, на обеих базах не выводися 'YES'.
Ну это как раз нормально :)

Jensid
Внутри функции, код которой я тестирую, нет пользовательской функции LENGTHB и функция не является функцией пакета.
Она не обязательно может быть внутри функции.

Выведите (в put_line) собственно длину на обоих версиях.
15 янв 07, 17:15    [3643717]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Олег_Сл
Member

Откуда: Санкт-Петербург
Сообщений: 123
Jannny
В смысле? Длина null - 8? Это на которой версии?


Выборка скорее всего

8      null
15 янв 07, 17:16    [3643731]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jensid
Member

Откуда:
Сообщений: 130
LENGTHB(SYSDATE)=8
LENGTHB(to_date(NULL))=NULL на обеих версиях
15 янв 07, 17:18    [3643752]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Олег_Сл
Member

Откуда: Санкт-Петербург
Сообщений: 123
To Jensid :
перепишите и посмотрим

dbms_output.put_line(vv_enddate); 
IF LENGTHB(vv_enddate)=0 then dbms_output.put_line('YES'); 
else dbms_output.put_line('NO'); 
END IF;
15 янв 07, 17:20    [3643783]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Jensid
Помогите, пожалуста. Сейчас увидел, что во многих функциях на 8.1.5 используется такая проверка. Надо понять почему не работает она на 10g.


Скорее наоборот. Надо понять, почему на 8.1.5 работало, ибо:

Oracle Database SQL Reference
Nulls in SQL Functions
All scalar functions (except REPLACE, NVL, and CONCAT) return null when given a null
argument.
15 янв 07, 17:21    [3643798]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jensid
Member

Откуда:
Сообщений: 130
Переписал
dbms_output.put_line(vv_enddate); 
IF LENGTHB(vv_enddate)=0 then dbms_output.put_line('YES'); 
else dbms_output.put_line('NO'); 
END IF;
Результат на 8.1.5:
YES

YES

YES
(Результат выборки с данным условием содержит три строки, поэтому YES повторяется три раза.)
Скажите, если вдруг есть пользовательская функция такая, то она должна быть в списке функций (например, я пользуюсь TOAD)? Но, там такой нет :(
15 янв 07, 17:36    [3643932]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Олег_Сл
Member

Откуда: Санкт-Петербург
Сообщений: 123
А самое главное забыли!
dbms_output.put_line(vv_enddate);
15 янв 07, 17:38    [3643945]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Олег_Сл
А самое главное забыли!
dbms_output.put_line(vv_enddate);
А ещё более интересно:
dbms_output.put_line(LENGTHB(vv_enddate));
15 янв 07, 17:43    [3643991]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jensid
Member

Откуда:
Сообщений: 130
почему забыл? Не забыл. Как написано, так и вставил в код.
15 янв 07, 17:43    [3643992]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Олег_Сл
Member

Откуда: Санкт-Петербург
Сообщений: 123
Jensid
почему забыл? Не забыл. Как написано, так и вставил в код.


Свою ошибку понял .
Лучше так :

dbms_output.put_line(nvl(vv_enddat,'null'));
Ну и по просьбе Jannny :


dbms_output.put_line(LENGTHB(vv_enddate));
15 янв 07, 17:46    [3644025]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Jensid
почему забыл? Не забыл. Как написано, так и вставил в код.
выполните отдельно:
begin 
dbms_output.put_line('length='||LENGTHB(to_date(NULL)));
end;
У Вас получается, что sql и plsql разное возвращает, давайте это подтвердим
15 янв 07, 17:48    [3644042]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jensid
Member

Откуда:
Сообщений: 130
dbms_output.put_line(vv_enddate); 
dbms_output.put_line(LENGTHB(vv_enddate));
IF LENGTHB(vv_enddate)=0 then dbms_output.put_line('YES'); 
else dbms_output.put_line('NO'); 
END IF;
Результат очень интересный!
На 8:
0
YES

0
YES

0
YES
А, на 10:
NO


NO


NO
15 янв 07, 17:51    [3644068]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jensid
Member

Откуда:
Сообщений: 130
Ха, ха, я скоро сойду с ума. В чём же может быть дело????
На 8:

begin 
dbms_output.put_line('length='||LENGTHB(to_date(NULL)));
end;

length=0
На 10:
begin 
dbms_output.put_line('length='||LENGTHB(to_date(NULL)));
end;

length=
15 янв 07, 17:58    [3644144]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Функции типа LENGTH, INSTR что возвращают?
15 янв 07, 18:01    [3644171]     Ответить | Цитировать Сообщить модератору
 Re: LENGTHB???  [new]
Jensid
Member

Откуда:
Сообщений: 130
На всякий случай вопрос. Можно ли написать пользовательскую функцию LENGTHB, которая возвращала бы 0, в случае с NULL?
15 янв 07, 18:01    [3644179]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить