Oracle 通过表进行循环并更改值的PL/SQL过程

Oracle 通过表进行循环并更改值的PL/SQL过程,oracle,for-loop,plsql,rows,Oracle,For Loop,Plsql,Rows,基本上,我需要做一个for循环,它将循环通过行的数量。在每一行中,我需要检查一个值,如果它符合要求,则对其进行更改 我是Oracle的新手,所以我刚开始一步一步地构建它,我一直在循环表行。我需要首先获得布尔标志设置为0 false的行数。因此,我可以只循环那些行,而不是表中的每一行,一旦我完成了该行中需要更改的内容,请将标志设置为1 true,这样当我再次运行该过程时,它就不会包括该行 以下是我目前掌握的情况: 我的桌子: CREATE TABLE test_table_results (

基本上,我需要做一个for循环,它将循环通过行的数量。在每一行中,我需要检查一个值,如果它符合要求,则对其进行更改

我是Oracle的新手,所以我刚开始一步一步地构建它,我一直在循环表行。我需要首先获得布尔标志设置为0 false的行数。因此,我可以只循环那些行,而不是表中的每一行,一旦我完成了该行中需要更改的内容,请将标志设置为1 true,这样当我再次运行该过程时,它就不会包括该行

以下是我目前掌握的情况:

我的桌子:

CREATE TABLE test_table_results (
  name  varchar,
  account number, 
  address varchar, 
  database_search NUMBER(1) DEFAULT 0 NOT NULL

 CONSTRAINT searched_in_database CHECK (database_search IN (0,1))
);
我的数据库中的表:

CREATE TABLE test_table_accounts (
  name  varchar,
  account number, 
  address varchar, 
);
现在,该过程将遍历结果表并查看地址是否匹配,如果匹配,则会将数据库表中的帐号复制到结果帐号中,然后将标志从0更改为1,因此下次搜索该表时,它将不包括它,因为它已被搜索过

create or replace PROCEDURE FIND_MATCH_ADDRESS AS
BEGIN

DECLARE

   v_cnt NUMBER;

BEGIN

   FOR i IN (SELECT rowid, r.* FROM test_table
           WHERE database_searched = 0)
   LOOP
     LOOP
        SELECT COUNT(1) INTO v_cnt
        FROM test_table
        WHERE database_searched = 0;

        DBMS_OUTPUT.PUT_LINE(v_cnt);
     END LOOP;
   END LOOP;
END;

END FIND_MATCH_ADDRESS;
编辑:添加了两个表格,希望使我的问题/任务更容易理解


再次感谢您抽出时间

在你的例子中,我看到了一些错误

在这个过程中,您不需要声明。声明块位于as和begin之间

可以使用For循环迭代表的记录。在您的示例中,您还尝试使用它们。可以使用For循环迭代表的记录。在您的示例中,您还尝试使用它们

FOR record IN (cursor)
LOOP
   {...statements...}
END LOOP;
我不太明白你为什么在循环中使用另一个循环。循环语句是一个无止境的循环

loop
  ...
end loop;
在循环中,您现在可以实现您的逻辑。如果您真的想使用循环,那么您的解决方案可能如下所示

create or replace PROCEDURE FIND_MATCH_ADDRESS 
AS
   v_cnt NUMBER;
BEGIN

   FOR rec IN (SELECT r.name
                   ,r.address
                   ,r.account
                   ,a.account as new_account
               FROM test_table_results  r
               join test_table_accounts  a on a.address = r.address 
              WHERE r.database_searched = 0)
   LOOP


     update test_table_results 
        set account = rec.new_account 
          , database_searched = true
      where account = rec.account
        and name = rec.name
        and adress = rec.adress;

   END LOOP;

END FIND_MATCH_ADDRESS;
或者,您也可以通过更新来实现这一点。因为我不知道您的表,所以您应该优化where条件

update test_table_results t
set database_searched = true
  , account = (select account 
                from test_table_accounts a
                where a.account = t.account
                  and a.name = t.name
                  and a.adress = t.adress)
where database_searched = false
and exists(select 1 
             from test_table_accounts  a
            where a.account = t.account
            and a.name = t.name
            and a.adress = t.adress);

您确定需要使用PL/SQL吗?这是:在每一行中,我需要检查一个值,如果它符合要求,则对其进行更改听起来好像所有事情都可以使用一个UPDATE语句来完成,但是——为了提出一些建议,您应该提供一个测试用例——创建表,插入示例行,解释从您所拥有的到您想要的算法,以及期望的结果。就您编写的代码而言:就您描述的内容而言,它包含的内容不多。那个布尔值在哪里?内环是用来做什么的?更新声明在哪里?基本上,我不知道如何改进它。我在我的中添加了表,用于从test_表中选择rowid,r.*,其中database_searched=0,这给了我一个错误。将for循环计数设置为表中的行数的正确方法是选择rowid,r.*吗?@JacobLoncar错误是什么?表中的行数是什么意思。在循环中,您将遍历光标返回的所有记录。如果您只想查看某些条目,那么您必须调整您的选择,使其只提供您需要的条目。我在问题中添加了更多内容,对不起,这可能是我的错,因为我不知道如何提问我需要回答的问题。谢谢您,我的好先生!!我之所以想做循环,是因为我需要有目的地放慢速度。循环将遍历每一行,并一次执行一行,速度较慢。谢谢你也包括更新声明,这有助于我的理解
update test_table_results t
set database_searched = true
  , account = (select account 
                from test_table_accounts a
                where a.account = t.account
                  and a.name = t.name
                  and a.adress = t.adress)
where database_searched = false
and exists(select 1 
             from test_table_accounts  a
            where a.account = t.account
            and a.name = t.name
            and a.adress = t.adress);