从每一行获取数据的 Oracle Cursor

Oracle Cursor with getting data from each row

我是编程新手。我想使用过程获取地址中的所有子字符串并将其放入我的新列 'info'。我的程序现在只从地址获取字符串的第一行并将其放在 'info' 列中。我是否需要一个循环或其他东西来让我的程序从每一行中获取正确的数据?

create or replace PROCEDURE update_data
IS

   data_1 VARCHAR2(13 CHAR);

   CURSOR c1 IS
     SELECT substr(t.address, 3, 4)
     FROM table_1 t
     WHERE t.age > 21

BEGIN

   OPEN c1;  

   fetch c1 INTO data_1;

   Update table_1 t
   SET t.info = data_1;

   CLOSE c1;

END;

谢谢你帮助我!!

一个主要问题是您没有限制您的 UPDATE 声明。您实际上是在更新整个 table 中的每一行。每当您编写 UPDATEDELETE 语句时都要当心,否则您将导致重大问题,您的同事也不会感谢您。我建议您将所有这些类型的语句都写成 SELECT 语句,以确保您正确地限制了 WHERE 子句,然后将其转换为更危险的语句。

至于您的具体问题 - 是的 - 您需要遍历游标中的每条记录,然后更新 table.

中的单个对应行

这是一个更新的例子:

CREATE OR REPLACE PROCEDURE update_data
IS
    CURSOR c1
    IS
        SELECT primary_key_column, /* SELECT THIS SO THAT YOU CAN IDENTIFY THE SINGLE ROW TO UPDATE */
               SUBSTR(t.address, 3, 4) AS info /*NAME THIS SO IT CAN BE REFERENCED IN THE LOOP */
        FROM   table_1 t
        WHERE  t.age > 21;
BEGIN
    FOR r /* NAME THE ROW */ IN c1 LOOP /* ORACLE AUTMOATICALLY OPENS THE CURSOR HERE */
        UPDATE table_1 t
        SET    t.info = r.info
        WHERE  t.primary_key_column = r.primary_key_column; /* LIMIT THE UPDATE TO THIS ROW ONLY */
    END LOOP; /* ORACLE AUTOMATICALLY CLOSES THE CURSOR HERE */
END;

你可以使用循环使用的OPENFETCHCLOSE方法,但我个人认为FOR ... IN语法更具可读性,更容易编写,并为您处理打开和关闭游标,所以我在这里使用它。

要注意的主要事情是 UPDATE 现在仅限于一条记录,因此循环中的每次迭代都会更新您 运行 [=22] 的同一记录=] on - 而不是整个 table.

或者,这一切都可以用一条语句完成:

UPDATE table_1 t
SET    t.info = SUBSTR(t.address, 3, 4)
WHERE  t.age > 21;

只要确保您正确限制了 UPDATE