我在表上有一个select语句,但我想在for循环中逐行运行它。尝试绑定变量等,但它没有解决问题。有什么建议?
这是我的代码:
假设我需要逐行从表中打印column1。但我得到错误 - 绑定变量行未定义。什么是正确的方法?
DECLARE
A NUMBER (2);
R1 NUMBER(2);
LINE VARCHAR(1000);
BEGIN
SELECT MAX(ROWNUM)
INTO R1
FROM TABLE1
<<R_LOOP>>
FOR I IN 1...R1 LOOP
INSERT INTO LINE
SELECT COLUMN1
FROM TABLE1
WHERE ROWNUN=I
DBMS_OUTPUT.PUT_LINE(LINE)
END LOOP R_LOOP
END;
/
你正在寻找CURSOR,这是一个逐行浏览你的表格的对象。
cursor c1 IS
SELECT column1, column2 FROM ... ;
OPEN c1;
LOOP
FETCH c1 INTO column1_c, column2_c;
...
EXIT WHEN c1%NOTFOUND;
END LOOP;
我不确定你的RDBMS的语法是100%。也许您可以在SQL Developer文档中找到更多信息。
假设数据库是oracle ...根据循环函数,它只是逐行执行。无需单独初始化以逐行获取。你可以有以下参考......
declare
cursor c1 is <select column1 statement>;
...
begin
...
for rec in c1
loop
.......
insert into LINE values (rec.column1);
......
end loop;
commit;
end;
所有循环语句仅按记录执行。
你在问题中说过,如果你喜欢的话
SELECT COLUMN1
FROM TABLE1
WHERE ROWNUN=I
这将仅在rownum = 1时返回值....当我们有其他条件如rownum = 2,rownum = 3 .....它不会返回任何结果,除非表有列名'ROWNUM'.. Rownum是基于select光标获取的结果动态生成的,因此像rownum = 2这样的直接获取失败,你可以使用rownum <= 2并且有解决方法...我建议使用循环功能来记录记录操作......
我希望你能用returning
子句实现它,如下所示。希望这可以帮助。
DECLARE
A NUMBER (2);
R1 NUMBER(2);
TYPE t_tab IS TABLE OF LINE.COLUMN1%TYPE;
l_tab t_tab;
BEGIN
SELECT MAX(ROWNUM)+1
INTO R1
FROM TABLE1;
INSERT INTO LINE
SELECT COLUMN1
FROM TABLE1
WHERE ROWNUM < R1
RETURNING COLUMN1 BULK COLLECT INTO l_tab;
FOR i IN l_tab.first .. l_tab.last LOOP
DBMS_OUTPUT.put_line(l_tab(i));
END LOOP;
END;
/