我有一个正在尝试编写的存储过程,我想使用游标作为工作表,以便可以使用结果来更新表。它引发了一些错误。谁能帮助我解决这些问题?
create or replace PROCEDURE SP_POPULATE_STUDENT_STOPTEMPID
AS
CURSOR c_workTable IS
SELECT
stdnt.STUDENT_ID,
stdnt.route_code,
stdnt.DISPATCH_TYPE,
stdnt.RUN_CODE,
stdnt.STOP_ADDRESS,
stdnt.STOP_TIME,
ST.STOP_TEMPLATE_ID
FROM
STOP_TEMPLATE ST
JOIN TASK_TEMPLATE TT
ON ST.TASK_TEMPLATE_ID = TT.TASK_TEMPLATE_ID
JOIN RUN_TEMPLATE RT
ON ST.RUN_TEMPLATE_ID = RT.RUN_TEMPLATE_ID,
STUDENT stdnt
WHERE
TT.TASK_NAME = stdnt.route_code
AND TT.DISPATCH_TYPE = stdnt.DISPATCH_TYPE
AND RT.RUN_CODE = stdnt.RUN_CODE
AND ST.STOP_DESCRIPTION = stdnt.STOP_ADDRESS
AND CAST(ST.EXPECTED_ARRIVAL_TIME AS TIME(7)) = stdnt.STOP_TIME ;
BEGIN
UPDATE STUDENT stdnt
SET stdnt.STOP_TEMPLATE_ID = c_workTable .STOP_TEMPLATE_ID
FROM
c_workTable
WHERE
stdnt.STUDENT_ID = c_workTable .STUDENT_ID
AND stdnt.route_code = c_workTable .route_code
AND stdnt.DISPATCH_TYPE = c_workTable .DISPATCH_TYPE
AND stdnt.RUN_CODE = c_workTable .RUN_CODE
AND stdnt.STOP_ADDRESS = c_workTable .STOP_ADDRESS
AND stdnt.STOP_TIME = c_workTable .STOP_TIME
END SP_POPULATE_STUDENT_STOPTEMPID;
ETA:更改了查询中的某些变量名
我已经基于sql server存储过程编写了此代码,但在update语句中却遇到了一些错误。
关于UPDATE STUDENT stdnt
错误(30,5):PL / SQL:SQL语句已忽略
然后在from子句中出现此错误
错误(32,5):PL / SQL:ORA-00933:SQL命令未正确结束
最后在END子句上
错误(42,35):PLS-00103:遇到符号“文件结尾” 预期以下情况之一:(开始情况声明结束异常 如果循环模式为null,则退出goto,返回编译更新 在
<<继续关闭当前删除删除锁
插入打开回滚保存点集sql执行落实所有合并 管道吹扫
--new code
UPDATE(
SELECT stdnt.STOP_TEMPLATE_ID as old_val,
ST.STOP_TEMPLATE_ID as new_val
FROM STUDENT stdnt
JOIN STOP_TEMPLATE ST
JOIN TASK_TEMPLATE TT
ON ST.TASK_TEMPLATE_ID = TT.TASK_TEMPLATE_ID
JOIN RUN_TEMPLATE RT
ON ST.RUN_TEMPLATE_ID = RT.RUN_TEMPLATE_ID
JOIN STUDENT stdnt
ON (TT.TASK_NAME = stdnt.route_code
AND TT.DISPATCH_TYPE = stdnt.DISPATCH_TYPE
AND RT.RUN_CODE = stdnt.RUN_CODE
AND ST.STOP_DESCRIPTION = stdnt.STOP_ADDRESS
AND CAST(ST.EXPECTED_ARRIVAL_TIME AS TIMESTAMP(7)) =
stdnt.STOP_TIME)
) t
SET t.old_val = t.new_val;
答案 0 :(得分:1)
另一种更好的方法是使用ORACLE中的MERGE语句从2个或更多表中更新表-
MERGE INTO STUDENT stdnt
USING (SELECT SRM.STUDENT_ID,
SRM.route_code,
SRM.DISPATCH_TYPE,
SRM.RUN_CODE,
SRM.STOP_ADDRESS,
SRM.STOP_TIME,
ST.STOP_TEMPLATE_ID
FROM STOP_TEMPLATE ST
JOIN TASK_TEMPLATE TT ON ST.TASK_TEMPLATE_ID = TT.TASK_TEMPLATE_ID
JOIN RUN_TEMPLATE RT ON ST.RUN_TEMPLATE_ID = RT.RUN_TEMPLATE_ID,
STUDENT_ROUTE_MAPPING SRM
WHERE TT.TASK_NAME = SRM.route_code
AND TT.DISPATCH_TYPE = SRM.DISPATCH_TYPE
AND RT.RUN_CODE = SRM.RUN_CODE
AND ST.STOP_DESCRIPTION = SRM.STOP_ADDRESS
AND CAST(ST.EXPECTED_ARRIVAL_TIME AS TIME(7)) = SRM.STOP_TIME) I
ON (stdnt.STUDENT_ID = I.STUDENT_ID
AND stdnt.route_code = I.route_code
AND stdnt.DISPATCH_TYPE = I.DISPATCH_TYPE
AND stdnt.RUN_CODE = I.RUN_CODE
AND stdnt.STOP_ADDRESS = I.STOP_ADDRESS
AND stdnt.STOP_TIME = I.STOP_TIME)
WHEN MATCHED THEN UPDATE
SET stdnt.STOP_TEMPLATE_ID = I.STOP_TEMPLATE_ID
答案 1 :(得分:0)
您可以通过使用一个UPDATE
语句来实现此目的:
JOIN
链接到另一个可能有帮助的问题和答案:Update statement with inner join on Oracle。
另一种但类似的解决方案是从子查询获取更新值:
UPDATE(
SELECT
stdnt.STOP_TEMPLATE_ID as old_val
, ST.STOP_TEMPLATE_ID as new_val
FROM
STOP_TEMPLATE ST
JOIN TASK_TEMPLATE TT
ON ST.TASK_TEMPLATE_ID = TT.TASK_TEMPLATE_ID
JOIN RUN_TEMPLATE RT
ON ST.RUN_TEMPLATE_ID = RT.RUN_TEMPLATE_ID
JOIN STUDENT stdnt
ON ( TT.TASK_NAME = stdnt.route_code
AND TT.DISPATCH_TYPE = stdnt.DISPATCH_TYPE
AND RT.RUN_CODE = stdnt.RUN_CODE
AND ST.STOP_DESCRIPTION = stdnt.STOP_ADDRESS
AND CAST(ST.EXPECTED_ARRIVAL_TIME AS TIME(7)) = stdnt.STOP_TIME)
) t
SET t.old_val = t.new_val;
链接到具有类似解决方案的相关问题的答案: ORA-00933: SQL command not properly ended error on update statement