Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays PLSQL:IF在使用循环时存在于存储过程中_Arrays_Loops_Plsql - Fatal编程技术网

Arrays PLSQL:IF在使用循环时存在于存储过程中

Arrays PLSQL:IF在使用循环时存在于存储过程中,arrays,loops,plsql,Arrays,Loops,Plsql,我是PLSQL的新手。我试图创建一个迭代数组的过程 我的要求是,若在表中找不到其中一个值,则应将其添加到FAILARRAY中,否则应将其添加到PASSARRAY中 我没有发现任何数据异常,即使它被处理,它也会退出循环,循环中的下一个值不会再次被迭代 这里有没有什么方法可以使用if exists命令。请帮忙 CREATE OR REPLACE PROCEDURE SCHEMA.PR_VALIDATE ( FILEARRAY IN STRARRAY, PASSARRAY OUT STRARRAY,

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

您正在处理异常,但需要避免异常。尝试:

SELECT NVL(FILEID, "<Put Something here or leave it empty") FROM TABLE_NAME WHERE FILENAME=fileName;

选择NVL(FILEID),您正在处理异常,但需要避免异常。请尝试:

SELECT NVL(FILEID, "<Put Something here or leave it empty") FROM TABLE_NAME WHERE FILENAME=fileName;

SELECT NVL(FILEID),我怀疑您还没有意识到在循环中可以有一个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\u data\u found
异常,然后循环前进到
FILEARRAY

中的第四个值,我怀疑您没有意识到可以使用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\u data\u found
异常,然后循环前进到
FILEARRAY
中的第四个值。如果FILEARRAY.exists(i),是否可以不使用
然后
end if;
?此方法的Oracle文档是。实际上,我不想检查文件数组是否包含值,我需要检查数据库表中是否有该值的条目。在一般情况下,它是使用异常处理来处理的,未找到数据。但是在我的示例中,我有8个值数组..对于第三个值,在表中找不到数据。它将进入异常块。现在我将无法迭代第四到第八个值。如果FILEARRAY.exists(i),您不能使用
然后
end if;
?此方法的Oracle文档是。实际上,我不想检查文件数组是否包含值,我需要检查数据库表中是否有该值的条目。在一般情况下,它是使用异常处理来处理的,未找到数据。但是在我的示例中,我有8个值数组..对于第三个值,在表中找不到数据。它将进入异常块。现在我将无法迭代第四到第八个值。谢谢..让我检查这个值,如果有效,将进行更新。谢谢..让我检查这个值,如果有效,将进行更新。是的,我想到了这一点,但似乎需要再次运行相同的查询,一次检查计数和once获取值。对吗?如果这是要求,您必须:)是的,我想到了这一点,但似乎我需要再次运行相同的查询,一次检查计数,一次获取值。对吗?如果这是要求,您必须:)