我在表上有一条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;
/
答案 0 :(得分:0)
您正在照顾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文档中找到更多信息。
答案 1 :(得分:0)
假定数据库是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是根据选择游标获取的结果动态生成的,因此像rownum = 2这样的直接获取操作将失败,您可以将rownum <= 2设置为可以解决... 我建议使用循环功能按记录操作进行记录...
答案 2 :(得分:0)
我希望您可以使用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;
/