我写这个存储过程来更新一行时,从多个表检索日期.运行每个查询在自己的作品,但当编译我得到一个不合适的进入,我不明白为什么选择进入是在查询的最外层.我相信它的东西很简单,我错过了,但会欣赏它的手.
所有的查询工作在自己的,但只是有一个问题,与第四次选择到,我想也许我不能选择到,而使用串联或可能与数据库链接?不确定任何一种方式。
/* Formatted on 4/1/2023 7:00:25 PM (QP5 v5.360) */
CREATE PROCEDURE UPDATE_CLAIM (V_CLAIM_ID IN PTSADMIN.CLAIM.CLAIMID%TYPE)
IS
V_CREW_ID NUMBER;
V_PERSONID NUMBER;
V_LIRRNUM VARCHAR2 (10);
V_CNAME VARCHAR2 (10);
V_START_DATE DATE;
V_NEXT_DAY DATE;
V_JOBNAME VARCHAR2 (20);
V_JOBGRADEID NUMBER;
BEGIN
BEGIN
SELECT CREWID,
PERSONID,
CLAIMDTM,
CLAIMDTM + 1
INTO V_CREW_ID,
V_PERSONID,
V_START_DATE,
V_NEXT_DAY
FROM PTSADMIN.CLAIM CM
WHERE CM.CLAIMID = V_CLAIM_ID;
END;
BEGIN
SELECT NAME
INTO V_CNAME
FROM PTSADMIN.CREW CW
WHERE CW.CREWID = V_CREW_ID;
END;
BEGIN
SELECT LIRRNUM
INTO V_LIRRNUM
FROM PTSADMIN.PERSON PR
WHERE PR.PERSONID = PERSONID;
END;
BEGIN
SELECT tm.OCCUP_CODE || td.RATE_CODE
INTO V_JOBNAME
FROM ewm.TIMESLIP_MSTR@TEAMS_DBLINK tm,
ewm.TIMESLIP_DETAIL@TEAMS_DBLINK td,
ewm.EMP_MSTR@TEAMS_DBLINK em
WHERE tm.TIMESLIP_MSTR_SID = td.TIMESLIP_MSTR_SID(+)
AND tm.EMP_MSTR_SID = em.EMP_MSTR_SID
AND em.EMP_NBR = V_LIRRNUM
AND tm.EFF_DATE_TIME BETWEEN TO_DATE (V_START_DATE,
'MM/DD/YYYY')
AND TO_DATE (V_NEXT_DAY,
'MM/DD/YYYY')
AND td.VERSION = 1
AND ROWNUM <= 1;
END;
BEGIN
SELECT JOBGRADEID
INTO V_JOBGRADEID
FROM PTSADMIN.JOBGRADE JB
WHERE JB.NAME = V_JOBNAME;
END;
UPDATE PTSADMIN.CLAIM CL
SET CL.JOBGRADEID = V_JOBGRADEID
WHERE CL.CLAIMID = V_CLAIM_ID;
END UPDATE_CLAIM;
2条答案
按热度按时间ie3xauqp1#
我注意到两个明显的错误:
personid
而不是v_personid
DATE
s的变量不应该是TO_DATE
d。看起来你实际上想TRUNC
它们。另外(虽然这并没有错),将每个
select
封装到它自己的begin-end
块中是没有用的。如果你想用这种方式处理异常,这是有意义的,但是-你没有。修复后(无法编译,因为我没有你的表,你没有提供测试用例,我不想自己创建那么多):
ac1kyiln2#
您似乎可以将其全部重写为单个查询:
这是未经测试的,因为我没有你的表。
注意事项:
V_CNAME
,所以获取它的值是没有意义的。一旦它没有被使用,那么V_CREW_ID
就永远不会被使用。td
别名表的查询中有一个LEFT OUTER JOIN
,但也过滤了td.VERSION = 1
,这要求td
行存在,并将有效地将OUTER JOIN
转换为INNER JOIN
。ROWNUM = 1
上进行筛选。虽然这将返回单行,但查询的顺序不一定,因此您实际上是随机返回任何一行。如果您想要基于排序的特定行,请使用ORDER BY something FETCH FIRST ROW ONLY
(可从Oracle 12获得)。