将select语句放在for循环中--sql

问题描述 投票:0回答:3

我在表上有一个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; 
/
sql oracle loops select plsql
3个回答
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


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是基于select光标获取的结果动态生成的,因此像rownum = 2这样的直接获取失败,你可以使用rownum <= 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; 
       /
© www.soinside.com 2019 - 2024. All rights reserved.