Sql DB-Oracle新手

Sql DB-Oracle新手,sql,oracle,plsql,Sql,Oracle,Plsql,我对Oracle和数据库相当陌生 我正在尝试用游标编写一个存储过程。如何在游标循环内编写select语句,以及如何循环通过从游标循环内的select获取的结果集 例如: Open Curs1; Exit When Curs1%NotFound; Loop Select column1,column2 from table -- Returns multiple records. How to loop through this record set and

我对Oracle和数据库相当陌生

我正在尝试用游标编写一个存储过程。如何在游标循环内编写select语句,以及如何循环通过从游标循环内的select获取的结果集

例如:

    Open Curs1;
    Exit When Curs1%NotFound;
    Loop
       Select column1,column2  from table -- Returns multiple records. How to loop through this record set and perform CRUD operations.
    End loop;
    Close Curs1;

您需要声明
光标
获取
循环中的记录

DECLARE
CURSOR  curs1
IS
  SELECT column1,
         column2
  FROM   yourtable;

  v_column1 yourtable.column1%TYPE;
  v_column2 yourtable.column2%TYPE;
BEGIN
 OPEN curs1;
  LOOP

    FETCH curs1
    INTO  v_column1,
          v_column2;
  EXIT
  WHEN curs1%NOTFOUND;

    INSERT INTO yourtable2(col1)VALUES( '000'||v_column1  ); 
    -- A sample DML operation.

    --Do other operations on individual records here.
  END LOOP;
  CLOSE curs1; 
END;
尝试使用以下示例,从光标变量emp_cv一次提取一行到用户定义的记录emp_rec中:

BULK COLLECT子句允许您从结果集中获取整个列,或者一次获取整个结果集。以下示例将列从游标检索到集合中:

下面的示例使用LIMIT子句。在循环的每次迭代中,FETCH语句按表acct_ID将100行(或更少)提取到索引中。以前的值将被覆盖


使用FOR循环游标-它们比open/fetch/close语法更快、更简单

begin
    for results1 in
    (
        select ...
    ) loop
        --Do something here
        for results2 in
        (
            select ...
            where some_table.some_column = results1.some_column
        ) loop
            --Do something here
        end loop;
    end loop;
end;
/

虽然这从字面上回答了这个问题,但您通常不希望在这样的循环中有循环。如果可能,最好将两条SQL语句与join结合起来,然后循环遍历结果。

您缺少“open curs1”,应该先获取,然后在curs1%未找到时使用exit。谢谢!这是编辑错误,未经测试…:)
declare
   type NameList IS table of emp.ename%type;
   names NameList;
   cursor c1 is select ename from emp where job = 'CLERK';
begin
   open c1;
   fetch c1 bulk collect into names;
   ...
   close c1;
end;
declare
   type NumList is table of number index by binary_integer;
   cursor c1 is select acct_id from accounts;
   acct_ids NumList;
   rows natural := 100;  -- set limit
begin
   open c1;
   loop
      /* The following statement fetches 100 rows (or less). */
      fetch c1 bulk collect into acct_ids limit rows;
      exit when c1%notfound;
      ...
   end loop;
   close c1;
end;
begin
    for results1 in
    (
        select ...
    ) loop
        --Do something here
        for results2 in
        (
            select ...
            where some_table.some_column = results1.some_column
        ) loop
            --Do something here
        end loop;
    end loop;
end;
/