ORA-01861: значение не соответствует строке формата - PullRequest
0 голосов
/ 10 июля 2020

У меня есть эта внешняя таблица:

CREATE TABLE PFun ( 
  idF   VARCHAR(255),
  dt   DATE
)
ORGANIZATION EXTERNAL
  (
    TYPE oracle_loader
  DEFAULT DIRECTORY ext_dep    
  ACCESS PARAMETERS
  ( 
    RECORDS DELIMITED BY '\n' 
    BADFILE     CHARACTER
      DISCARDFILE CHARACTER
      LOGFILE     CHARACTER
      FIELDS TERMINATED BY ','
      OPTIONALLY ENCLOSED BY "'"
      MISSING FIELD VALUES ARE NULL     
      (
        idF     CHAR(255),
        dt      CHAR(255) date_format DATE mask 'YYYY/MM/DD'
      )  
  )
  LOCATION ('prfun.csv')
)
REJECT LIMIT UNLIMITED;

Я создал эту функцию, чтобы возвращать номер недели в году

/
CREATE OR REPLACE FUNCTION TestFunction(dtIn IN DATE)  
RETURN NUMBER   
IS res NUMBER;
BEGIN  
    SELECT CEIL((TO_DATE(dtIn, 'yyyy/mm/dd') - TO_DATE('2020/12/31', 'yyyy/mm/dd'))/7)
    INTO res
    FROM PFun
    WHERE dtIn >= '2020-01-01';
    RETURN res;
END;
/
SELECT idF, TestFunction(dt)
FROM PFun;

Если я запускаю только функция сообщает мне, что все было скомпилировано. Но , когда я запускаю SELECT, появляется следующая ошибка:

ORA-29913: Error executing ODCIEXTTABLEFETCH callout
ORA-01861: the value does not match the format string
ORA-06512: a "SYSTEM.TESTFUNCTION", line 5
29913.0000 - "error in executing% s callout"
* Cause: The execution of the specified callout caused an error.
* Action: Examine the error messages take appropriate action.

[Я ввожу такие даты: '2020/01/01', но sql -developer on контрольный запрос показывает мне их как это «01-ЯНВ-20». Не знаю, важна ли эта информация ]

Как это исправить?

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Вы снова конвертируете поле даты в дату, которая, кажется, вызывает ошибку.

Кроме того, вы пытаетесь сравнить date поле dtIn с string. string следует преобразовать в date перед сравнением с датой заполнения (dtIn >= '2020-01-01')

Попробуйте выполнить следующий запрос в своей функции:

SELECT CEIL(dtIn - TO_DATE('2020/12/31', 'yyyy/mm/dd'))/7) -- to_Date is not needed for dtIn
    INTO res
    FROM PFun
    WHERE dtIn >= date '2020-01-01' -- this should be date so made it date using date literal
0 голосов
/ 10 июля 2020

Просто используйте TO_CHAR( your_date, 'WW' ), чтобы вернуть номер недели:

CREATE FUNCTION TestFunction(dtIn IN DATE) RETURN NUMBER   
IS
BEGIN  
    RETURN TO_NUMBER(TO_CHAR(dtIn, 'WW'));
END;
/

(И вам, вероятно, не нужно писать функцию для чего-то настолько простого, и вы можете просто использовать TO_NUMBER(TO_CHAR(your_column, 'WW')) в место вызова функции.)

Тогда для этого года:

SELECT DATE '2019-12-31' + LEVEL AS dtIn,
       TestFunction( DATE '2019-12-31' + LEVEL ) AS week_num
FROM   DUAL
CONNECT BY LEVEL <= 366

Будет выведено:

DTIN      | WEEK_NUM
:-------- | -------:
01-JAN-20 |        1
02-JAN-20 |        1
03-JAN-20 |        1
04-JAN-20 |        1
05-JAN-20 |        1
06-JAN-20 |        1
07-JAN-20 |        1
08-JAN-20 |        2
09-JAN-20 |        2
...
21-DEC-20 |       51
22-DEC-20 |       51
23-DEC-20 |       52
24-DEC-20 |       52
25-DEC-20 |       52
26-DEC-20 |       52
27-DEC-20 |       52
28-DEC-20 |       52
29-DEC-20 |       52
30-DEC-20 |       53
31-DEC-20 |       53

db <> fiddle здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...