Sql DB-Oracle新手
我对Oracle和数据库相当陌生 我正在尝试用游标编写一个存储过程。如何在游标循环内编写select语句,以及如何循环通过从游标循环内的select获取的结果集 例如: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
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;
/