#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 и сравнивается с числом. Это было основной причиной