用于遍历表并更改值的PL / SQL过程

时间:2018-08-22 19:30:46

标签: oracle for-loop plsql rows

基本上,我需要创建一个for循环,该循环将遍历行数。在每一行中,我需要检查一个值并在满足要求时对其进行更改。

我是Oracle的新手,所以我一次只开始一步构建它,而我一直在遍历表行。我首先需要获取将布尔标志设置为0(假)的行数。因此,我可以只遍历表中的那些行,而不是遍历表中的每一行。一旦我完成了该行中需要更改的所有操作,就将标志设置为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;

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

再次感谢您的宝贵时间!

1 个答案:

答案 0 :(得分:1)

在您的示例中,我看到了一些错误。

在此过程中,您不需要Declare。声明块在asbegin

之间
create or replace PROCEDURE proc
AS
  -- here variable declaration or local function or procedures
BEGIN
 -- here you can write a business logic
END proc;

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

FOR record IN (cursor)
LOOP
   {...statements...}
END LOOP;

我不太明白为什么您在循环中使用了另一个循环。 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);