【发布时间】:2020-10-14 11:56:32
【问题描述】:
我在使用 SELECT 查询时遇到问题。不幸的是,ID 存储为VARCHAR,这是一个很大的错误,现在我在以下功能中遇到问题
FUNCTION GET_SUB_PROJECTS(p_currentUserId IN VARCHAR,p_projectId IN INT)
RETURN SYS_REFCURSOR IS
rc SYS_REFCURSOR;
-- getSubProject
BEGIN
OPEN rc FOR
SELECT
p.*,
a.number_ AS activityNumber,
a.description AS activityDescription
FROM
projects p
LEFT JOIN
project_users_schedule_dates pusd
ON
pusd.ProjectID = p.ProjectID AND pusd.UserID = p_currentUserId
LEFT JOIN
activities a
ON
a.id = p.activity
LEFT JOIN
responsible_persons rp
ON
rp.ProjectID = p.ProjectID AND rp.UserID = p_currentUserId
LEFT JOIN
users u
ON
u.UserID = p_currentUserId
WHERE
(u.User_roleID = 1 AND
p.CustomName LIKE CONCAT((SELECT CustomName FROM projects pr WHERE pr.ProjectID = p_projectId), '%') AND p.ProjectID <> p_projectId)
OR
((
(p.Responsible_person_id = p_currentUserId OR p.Delivery_contact = p_currentUserId OR rp.UserID = p_currentUserId OR (pusd.UserID = p_currentUserId AND SYSTIMESTAMP BETWEEN TO_DATE(pusd.StartDate,'YYYY-MM-DD') AND TO_DATE(pusd.EndDate,'YYYY-MM-DD') + INTERVAL '1' DAY AND
SYSTIMESTAMP BETWEEN TO_DATE(p.StartDate,'YYYY-MM-DD') AND TO_DATE(p.EndDate,'YYYY-MM-DD') + INTERVAL '1' DAY))
)
AND
p.CustomName LIKE CONCAT((SELECT CustomName FROM projects pr WHERE pr.ProjectID = p_projectId), '%') AND p.ProjectID <> p_projectId)
ORDER BY p.CustomName;
RETURN rc;
END GET_SUB_PROJECTS;
当我调用函数时,它需要返回数据,但它没有。不知何故,这里 p.Responsible_person_id 和 p.Delivery_contact 需要是 NUMBER 但不知何故它是 VARCHAR
当我调用函数时,我使用
SELECT PROJECT_PACKAGE.GET_SUB_PROJECTS('199',141) FROM DUAL
我找到了一种可以修改的解决方案,但它给我带来了类似的错误
Error report -
ORA-01439: column to be modified must be empty to change datatype
01439. 00000 - "column to be modified must be empty to change datatype"
在这种情况下该怎么办?解决此问题的最佳方法是什么?
【问题讨论】:
-
只需使用 CTAS 语句重新创建表:
CREATE TABLE t2 AS SELECT TO_NUMBER(ID) AS ID, <other cols> FROM t,然后是RENAME TABLE t2 TO t,如果您确定ID列完全包含数值。 -
对不起,我不明白你的意思。你能不能描述得更好。 Tnx
-
你想要的是改变ID列的数据类型,不是吗?这种建议的方式,您可以更改为数字数据类型而不会出现
ORA-01439错误。顺便说一句,将重命名语法替换为RENAME t2 TO t -
是的,从 VARCHAR 更改为 NUMBER
-
@BarbarosÖzhan 您能否根据我的问题发布答案。因此,Responsible_person_Id 也必须是 number(10,0) 和 Delivery_contact。非常感谢。