我是编程新手。我想使用程序获取所有子地址并将其放入我的新列' 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;
感谢您帮助我!!
答案 0 :(得分:1)
一个主要问题是您没有限制UPDATE
声明。您实际上正在更新整个表中的每一行。每当您撰写UPDATE
和DELETE
语句时,请注意这一点,否则您将导致重大问题,而您的同事也不会感谢您。我建议您将所有这些类型的语句都写为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;
您可以使用当前正在使用的OPEN
,FETCH
,CLOSE
方法,但我个人认为FOR ... IN
语法更易读,更容易写,并为你处理打开和关闭游标,所以我在这里使用它。
需要注意的是,UPDATE
现在仅限于一条记录,因此循环中的每次迭代都会更新您正在运行SUBSTR
的相同记录 - 而不是整张桌子。
或者,这可以用一个语句完成:
UPDATE table_1 t
SET t.info = SUBSTR(t.address, 3, 4)
WHERE t.age > 21;
请确保您正确限制UPDATE
。