使Oracle SQL Developer每次循环都执行SELECT语句

时间:2017-03-12 10:56:58

标签: sql oracle loops select plsql

我需要创建一个包含来自另一个表的随机值的表。为此,我尝试使用LOOP从其他表中收集随机FIRST_NAMELAST_NAME并将其放入我的表格中。

但是使用LOOP不起作用,因为SELECT语句不会执行多次。

BEGIN
LOOP
v_counter:=v_counter+1;
SELECT fname INTO v_fname FROM users SAMPLE (5) WHERE some_condition AND ROWNUM=1;
SELECT lname INTO v_lname FROM users SAMPLE (5) WHERE some_condition AND ROWNUM=1;
DBMS_OUTPUT.PUT_LINE(v_fname2);
EXIT WHEN (v_counter > 50);
END LOOP;
END;

我打印了50次相同的名字。

2 个答案:

答案 0 :(得分:1)

OP中的代码:

BEGIN
LOOP
v_counter:=v_counter+1;
SELECT fname INTO v_fname FROM users SAMPLE (5) WHERE some_condition AND ROWNUM=1;  --Line_no a
SELECT lname INTO v_lname FROM users SAMPLE (5) WHERE some_condition AND ROWNUM=1;  --Line_no b
DBMS_OUTPUT.PUT_LINE(v_fname2); --Line_no c
EXIT WHEN (v_counter > 50);
END LOOP;
END;

的问题:

如果我们看到,Line_No a正在选择变量v_fnameLine_no c中正在打印的数据正在打印另一个变量v_fname2。我不明白,你没有改变价值的变量,为什么你期望看到印刷品的结果发生变化?您看,v_fnamev_fname2是两个不同的变量。在打印v_fname而不是v_fname2时,您将值分配给v_fname2而不是v_fname

答案 1 :(得分:0)

而是使用隐式FOR LOOP

BEGIN
  FOR x in (
     SELECT a.fname, b.lname FROM users SAMPLE (5) a, users SAMPLE (5) b  WHERE some_condition AND ROWNUM < 51
  ) LOOP
    DBMS_OUTPUT.PUT_LINE(x.fname||' - '||x.lname);
  END LOOP;
END;