powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по ошибке ORA-01858
6 сообщений из 6, страница 1 из 1
Вопрос по ошибке ORA-01858
    #39301463
Horek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Знающие люди, помогите!

Имею следующую функцию:

function KADRI.get_pens_sotr1 return KADRI.SOTRUD_TBL1 PIPELINED as


begin

for cur in

(SELECT count(tabnomer) AS schet
FROM pol_tbl, sotrud_tbl
WHERE ((pol_tbl.sex = sotrud_tbl.link_pol))
and (((months_between (to_char(sysdate,('DD MONTH YYYY')),to_char(DATA_ROGDENIYA,('DD MONTH YYYY'))) )>720 and pol_tbl.sex='м') or
((months_between (to_char(sysdate,('DD MONTH YYYY')),to_char(DATA_ROGDENIYA,('DD MONTH YYYY'))) )>660 and pol_tbl.sex='ж')) )
loop

pipe row (KADRI.SOTRUD_OBJ1(cur.schet));
end loop;
return;

end get_pens_sotr1;
-----------------------------------------------------
Запускаю в Toad:
select * from table (KADRI.get_pens_sotr1)
Все работает нормально.

Затем в Delphi создаю запрос при помощи ADOQuery. После запуска выдает программа ошибку

ORA-01858: a non-numeric character was found where a numeric was expected
ORA-06512: at "KADRI.GET_PENS_SOTR1", line 6

В чем тут дело-то?
...
Рейтинг: 0 / 0
Вопрос по ошибке ORA-01858
    #39301490
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HorekВ чем тут дело-то?
Быть может в древнем ADO, который не понимает "table()"?
Попробуйте создать
Код: plsql
1.
create view get_pens_sotr_v as select * from table (KADRI.get_pens_sotr1);


и скормить его ADO
...
Рейтинг: 0 / 0
Вопрос по ошибке ORA-01858
    #39301505
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousБыть может в древнем ADO, который не понимает "table()"?


ADO мжет и древний, а вот конструкции типа months_between (to_char(sysdate,('DD MONTH YYYY')),to_char(DATA_ROGDENIYA,('DD MONTH YYYY'))) ) и приводит к этой ситуевине. Товарищь Horek похоже с датами очень на Bы и пал жертвой default NLS_DATE_FORMAT.

Horek:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
create or replace
  function KADRI.get_pens_sotr1
    return KADRI.SOTRUD_TBL1
    PIPELINED
    as 
    begin
    for cur in (
                SELECT  count(tabnomer) AS schet 
                  FROM  pol_tbl,
                        sotrud_tbl
                  WHERE pol_tbl.sex = sotrud_tbl.link_pol
                    and (
                            (
                                 months_between(trunc(sysdate),trunc(DATA_ROGDENIYA)) > 720
                             and
                                 pol_tbl.sex='м'
                            )
                         or
                            (
                                 months_between(trunc(sysdate),trunc(DATA_ROGDENIYA)) > 660
                             and
                                 pol_tbl.sex='ж'
                            )
                        )
      loop 
        pipe row (KADRI.SOTRUD_OBJ1(cur.schet));
     end loop;
     return;
end get_pens_sotr1;
/



Ну и переменную типа record называть cur показывает ты и в курсорах не силен. А pipelined функция возвращающая одну строку это вообще пипец.

SY.
...
Рейтинг: 0 / 0
Вопрос по ошибке ORA-01858
    #39301541
Horek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY, я и не претендую на звание гуру. Иначе вопросов бы у меня не возникало. Что до pipelined функций-то это единственный способ, который позволил мне вывести результат в приложении, написанном на Delphi. Функции с использованием REF CURSOR "не виделись в упор". Хотя в Toad было все ОК :-(
Насколько правильно я использую pipe-это уже другой вопрос. Зато данные хоть выводятся. :-)

А вот что неверного в строке months_between (to_char(sysdate,('DD MONTH YYYY')),to_char(DATA_ROGDENIYA,('DD MONTH YYYY'))) ?
Если я to_char не использовал, то сразу выдавалась ошибка
...
Рейтинг: 0 / 0
Вопрос по ошибке ORA-01858
    #39301557
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HorekНасколько правильно я использую pipe-это уже другой вопрос. Зато данные хоть выводятся. :-)

А вот что неверного в строке months_between (to_char(sysdate,('DD MONTH YYYY')),to_char(DATA_ROGDENIYA,('DD MONTH YYYY'))) ?
Если я to_char не использовал, то сразу выдавалась ошибка

Что неправильно? Функция months_between требует две даты. TO_CHAR преобразует дату в сроку, так-что months_between получает две строки и вынужден неяно преобразовывать их обратно в даты исользуя формат пo умолчанию NLS_DATE_FORMAT из NLS_SESSION_PARAMETERS. То еcть результат завист от настоек клиeнта. Если у клиeнта NLS_DATE_FORMAT = 'DD MONTH YYYY' то клиент получит правильный результат а если нет, то в лучшем cлучае получит ошибку (как ты в ADO) а в худшем случае может получить неправильный и незамеченный результат.

SY.
P.S. Какая ошибка выдавалась без to_char? Приведи запрос и ошибку. Так-же, надеюсь DATA_ROGDENIYA это DATE а не VARCHAR2/CHAR, иначе у тебя ещё и проблемы дизайна.
...
Рейтинг: 0 / 0
Вопрос по ошибке ORA-01858
    #39302262
Horek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY, спасибо большое.Заработало
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по ошибке ORA-01858
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]