Oracle Cursor从每行获取数据

时间:2016-05-19 19:54:10

标签: oracle cursor procedure

我是编程新手。我想使用程序获取所有子地址并将其放入我的新列' 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;

感谢您帮助我!!

1 个答案:

答案 0 :(得分:1)

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

至于你的具体问题 - 是的 - 你需要循环遍历游标中的每一条记录,然后更新表格中的SINGLE对应行。

这是一个更新的例子:

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现在仅限于一条记录,因此循环中的每次迭代都会更新您正在运行SUBSTR的相同记录 - 而不是整张桌子。

或者,这可以用一个语句完成:

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

请确保您正确限制UPDATE