我是PLSQL的新手。我正在尝试创建一个迭代数组的过程。
我的要求是如果在表中找不到其中一个值,它应该添加到FAILARRAY中,否则它应该添加到PASSARRAY中。
我发现没有数据发现异常,即使它被处理,它也会退出循环并且循环中的下一个值不再被迭代。
我们有什么方法可以使用if exists命令。请帮忙。
CREATE OR REPLACE PROCEDURE SCHEMA.PR_VALIDATE
(
FILEARRAY IN STRARRAY,
PASSARRAY OUT STRARRAY,
FAILARRAY OUT STRARRAY,
)
IS
--DECLARE
fileName VARCHAR2 (50);
fileId NUMBER;
BEGIN
for i in 1 .. FILEARRAY.count
loop
fileName := FILEARRAY(i);
DBMS_OUTPUT.put_line (FILEARRAY (i));
SELECT FILEID into fileId FROM TABLE_NAME WHERE FILENAME=fileName;
end loop
END;
答案 0 :(得分:2)
我怀疑你没有意识到你可以在一个循环中拥有一个PL / SQL BEGIN
... END
块,包括一个异常处理程序。实际上,在任何可以拥有PL / SQL语句的地方都可以有一个块。
您提到了一个异常处理程序,尽管您的代码不包含异常处理程序。正如你所说你的代码“循环”,我只能假设它在for
循环之外。但是您可以在for
循环中轻松添加带有异常处理程序的块,例如:
BEGIN
for i in 1 .. FILEARRAY.count
loop
fileName := FILEARRAY(i);
DBMS_OUTPUT.put_line (FILEARRAY (i));
-- Inner block starts at the line below:
BEGIN
SELECT FILEID into fileId FROM TABLE_NAME WHERE FILENAME=fileName;
-- TODO add to PASSARRAY
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- TODO add to FAILARRAY
END;
end loop
END;
这样,如果FILEARRAY
中有8个值,并且表中没有找到第三个值的数据,则会在不退出循环的情况下捕获NO_DATA_FOUND
异常,然后循环进入FILEARRAY
中的第四个值。
答案 1 :(得分:1)
您正在处理异常,但您需要避免异常。尝试:
SELECT NVL(FILEID, "<Put Something here or leave it empty") FROM TABLE_NAME WHERE FILENAME=fileName;
这样,如果它在select中找到一个空值,它只会拉“”。然后你可以检查你的SELECT是否返回“”,如果是,则填充你的FAILARRAY,否则填充PASSARRAY。
答案 2 :(得分:1)
CREATE OR REPLACE PROCEDURE SCHEMA.PR_VALIDATE(
FILEARRAY IN STRARRAY,
PASSARRAY OUT STRARRAY,
FAILARRAY OUT STRARRAY )
IS
fileName VARCHAR2 (50);
l_n_count NUMBER;
l_n_file_id NUMBER;
BEGIN
FOR i IN 1 .. FILEARRAY.count
LOOP
fileName := FILEARRAY(i);
DBMS_OUTPUT.put_line (FILEARRAY(i));
SELECT COUNT(FILEID) INTO l_n_count FROM TABLE_NAME WHERE FILENAME=fileName;
IF l_n_count =0 THEN
failarray(i):='No Value Found';
elsif l_n_count=1 THEN
SELECT FILEID INTO l_n_file_id FROM TABLE_NAME WHERE FILENAME=fileName;
Passarray(i):=l_n_file_id;
END IF;
END LOOP;
END;
/