PLSQL:IF使用循环时存储过程中的EXISTS

时间:2016-06-06 16:42:01

标签: arrays loops plsql

我是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;

3 个答案:

答案 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;
/