I have three tables:
CUSTOMER Columns (Tracking)
Reference Columns (Ref_Tracking, Project)
PROJECT Columns(Project)
我需要检查参考以查看参考(Ref_Tracking)中是否存在来自CUSTOMER的列(跟踪)中的记录。然后检查参考(项目)中的相关记录是否存在于PROJECT(项目)中。
If they exist UPDATE PROJECT
SET PROJECT.NAME = CURSOR VARIABLES
ETC
ETC
If they do not exist
INSERT INTO REFERENCE
VALUES (CURSOR VALUES)
我有一个游标正在循环使用Customer Table的所有变量。
我在下面尝试但没有填充数据我不确定我做错了什么,或者是否有更好的方法来做到这一点。我正在学习pl / sql,所以不确定我是否在正确的轨道上。
CREATE OR REPLACE PROCEDURE P1
AS
V_NAME CUSTOMER.NAME%TYPE;
V_TRACKING CUSTOMER.TRACKING%TYPE;
V_ADDRESS CUSTOMER.ADDRESS%TYPE;
V_CITY CUSTOMER.CITY%TYPE;
V_STATE CUSTOMER.STATE%TYPE;
V_NUMBER CUSTOMER.NUMBER%TYPE;
V_ Ref Reference.REF_TRACKING%TYPE := NULL;
V_Project REFERENCE.PROJECT%TYPE := NULL;
V_Project_2 PROJECT.PROJECT%TYPE := NULL;
CURSOR C01
IS
SELECT C.Name,
C.Tracking,
C.Address,
C.City,
C.State,
C.Number
FROM Customer
WHERE C.Number = Another_Table;
BEGIN
FOR fetchc01 IN C01
LOOP
BEGIN
Select Ref_Tracking, R.Project, P.Project
Into V_ Ref, V_Project, V_Project_2
From Customer C, Reference R, Project P
Where R.Project = P.Project
AND Tracking = Ref_Tracking;
EXCEPTION
WHEN TOO_MANY_ROWS
THEN
NULL;
WHEN NO_DATA_FOUND
THEN
NULL;
END;
BEGIN
IF V_Ref = fetch01.Tracking
Then
Insert Into Sample_Project
VALUES (V_Name, V_Tracking, V_Location)
END
END LOOP;
END;
答案 0 :(得分:0)
此查询
Select Ref_Tracking, R.Project, P.Project
Into V_ Ref, V_Project, V_Project_2
From Customer C, Reference R, Project P
Where R.Project = P.Project
AND Tracking = Ref_Tracking;
在循环内部,但它不依赖于从循环的一次迭代到另一次迭代的任何变化。这对我来说似乎不太可能。要么将查询移到循环之外,要么更有可能缺少某些谓词。也许你想要像
这样的东西Select Ref_Tracking, R.Project, P.Project
Into V_ Ref, V_Project, V_Project_2
From Customer C, Reference R, Project P
Where R.Project = P.Project
AND Tracking = Ref_Tracking
AND tracking = fetchc01.tracking;
此外,您的异常处理程序
EXCEPTION
WHEN TOO_MANY_ROWS
THEN
NULL;
WHEN NO_DATA_FOUND
THEN
NULL;
如果您的查询返回0或大于1的结果,则表示您非常高兴您的本地变量V_Ref
,V_Project
和V_Project_2
的值未定义或NULL。这似乎也不太可能。我打赌写入的查询总是返回多行,这实际上是你所期望的,所以你的异常处理程序吞噬了你的异常。反过来,这意味着您的代码运行,没有按预期执行,并且不会抛出任何错误。在这种情况下,您可能会更好地删除异常处理程序并让代码在遇到错误时抛出异常。至少在这种情况下,您可以使用一些信息来调试问题。只有当你可以对它们做一些有用的事情,或者如果你真的很高兴忽略这个错误时,才能捕获异常。