将select语句放入for循环-SQL

时间:2019-04-10 09:16:50

标签: sql oracle loops select plsql

我在表上有一条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; 
/

3 个答案:

答案 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文档中找到更多信息。

Documentation

答案 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; 
       /