基本上,我需要创建一个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;
编辑:添加了两个表格,希望使我的问题/任务更容易理解。
再次感谢您的宝贵时间!
答案 0 :(得分:1)
在您的示例中,我看到了一些错误。
在此过程中,您不需要Declare
。声明块在as
和begin
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);