Получить ошибку ORA-01722: недопустимый номер при тестировании функции

#oracle #plsql

#Oracle #plsql

Вопрос:

Я немного запутался в этой проблеме и понятия не имею, что здесь не так. У меня есть такая функция

 FUNCTION GET_ARTICLES_ADDIOTION_WORK(p_ataID IN INT)
  RETURN SYS_REFCURSOR IS 
  rc  SYS_REFCURSOR;
  /*getArticlesAdditionalWork*/
BEGIN
 OPEN rc FOR
       SELECT  
              aa.ID,
              aa.Name,
              aa.Quantity,
              aa.Unit,
              aa.Price,
              aa.Deduct,
              aa.Account,
              aa.Created
            FROM 
               ata_articles aa
            LEFT JOIN
               weekly_report wr
            ON
               aa.wrId = wr.id
            WHERE 
               aa.AtaId = p_ataID
            AND 
               aa.type = 1
            AND
                (aa.wrId = 0 OR (wr.status = 2 OR wr.status = 5))
            ORDER BY Name;          
RETURN rc;
END GET_ARTICLES_ADDIOTION_WORK;
  

Каким-то образом, когда я хочу проверить, работает ли эта функция нормально, я следую сообщению

 SELECT ATA_PACKAGE.GET_ARTICLES_ADDIOTION_WORK(2014) from dual
  

Я получаю ошибку

 ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.
  

Хотя я также пытаюсь выполнить запрос без функции, возникает та же ошибка.

 SELECT  
  aa.ID,
  aa.Name,
  aa.Quantity,
  aa.Unit,
  aa.Price,
  aa.Deduct,
  aa.Account,
  aa.Created
FROM 
   ata_articles aa
LEFT JOIN
   weekly_report wr
ON
   aa.wrId = wr.id
WHERE 
   aa.AtaId = 2116
AND 
   aa.type = 1
AND
    (aa.wrId = 0 OR (wr.status = 2 OR wr.status = 5))
ORDER BY Name;

     
  

Пока я проверяю таблицу, и ataId — это ЧИСЛО, это не строка. Я понятия не имею, что здесь не так?
В чем причина этой проблемы? Чего мне не хватает? Откуда берется ошибка?

Определение таблицы Ata_Article

 ACCOUNT VARCHAR2(255 CHAR)
ARTICLEPAYMENTTYPE  NUMBER(10,0)
ATAID   NUMBER(10,0)
CLIENTCOMMENT   VARCHAR2(255 CHAR)
CLIENTEMAIL VARCHAR2(255 CHAR)
CLIENTFINALSTATUS   NUMBER(10,0)
CLIENTSTATUS    NUMBER(10,0)
CREATED DATE
DEDUCT  NUMBER(10,0)
EXTERNAL    NUMBER(10,0)
ID  NUMBER(10,0)
NAME    VARCHAR2(255 CHAR)
PRICE   FLOAT
PROJECTID   NUMBER(10,0)
QUANTITY    VARCHAR2(255 CHAR)
SUPPLIERINVOICEID   NUMBER(10,0)
TABLETYPE   VARCHAR2(50 CHAR)
TOTAL   FLOAT
TYPE    VARCHAR2(4000 CHAR)
UNIT    VARCHAR2(255 CHAR)
WRID    NUMBER(10,0)
  

Определение таблицы Weekly_Report

 ANSWERDATE  DATE
ANSWEREMAIL VARCHAR2(50 CHAR)
ANSWERIP    VARCHAR2(50 CHAR)
ATAID   NUMBER(10,0)
COMMENT_    VARCHAR2(2000 CHAR)
CREATED DATE
DUEDATE DATE
EXTERNAL    NUMBER(10,0)
FINANCEID   NUMBER(10,0)
ID  NUMBER(10,0)
NAME    VARCHAR2(45 CHAR)
PARENT  NUMBER(10,0)
PDF_URL VARCHAR2(255 CHAR)
PROJECTID   NUMBER(10,0)
SEEN    DATE
STATUS  NUMBER(10,0)
TOKEN   VARCHAR2(50 CHAR)
WEEK    NUMBER(10,0)
YEAR    NUMBER(10,0)
  

Комментарии:

1. Проверьте определение для столбца aa. AtaId. Это varchar2? Такие проблемы возникают при сравнении числа со столбцом varchar2, который имеет нецифровые значения.

2. Нет, это сейчас. Я уже проверил. Это число

3. Затем я бы проверил определение для всех столбцов, перечисленных в предложениях join и where. Просто попробуйте прокомментировать предложение «ГДЕ» для начала, и давайте посмотрим, что произойдет. Я не видел определение таблицы, которое вы прикрепили. Можете ли вы добавить определение и для другой таблицы?

4. Я добавляю определение таблицы для одной таблицы, и я добавлю также для второй.

5. Спасибо за предложение. Конечно, у меня уже есть отметка в качестве ответа 🙂

Ответ №1:

Итак, после обсуждения сортировки мы выяснили, что столбец aa.type был определен как varchar2 и сравнивается с числом. Это было основной причиной