oracle中的存储过程,用于根据行获取记录
Posted
技术标签:
【中文标题】oracle中的存储过程,用于根据行获取记录【英文标题】:Stored procedure in oracle for fetching records based on rows 【发布时间】:2015-06-29 01:46:10 【问题描述】:我想根据行(行号)获取记录。我已经使用 sql 查询本身完成了。
select * from (select m.*,rownum r from employees m) where r between 80 and 100
但现在我想在存储过程(oracle)中使用游标来获取 80 到 100 之间的类似记录(基于 rownum 伪列)。有人可以帮我吗?
【问题讨论】:
你能至少显示你的 SQL 查询吗? @Hawk select * from (select m.*,rownum r from employees m) where r 在 80 到 100 之间 【参考方案1】:您可能需要查看Stored Procedures 和Cursors 以了解基础知识。除此之外,您的查询可以很容易地包含在游标和过程中。如果你打算使用显式游标,它可能是这样的:
CREATE OR REPLACE stored_procedure_name AS
CURSOR IS
select * from (select rownum r,salary from employees) where r between 80 and 100;
BEGIN
open c1;
loop
fetch c1
into a,b;
dbms_output.put_line(a || b);
exit when c1%notfound;
end loop;
close c1;
END;
【讨论】:
我知道游标的基础知识,但我对使用游标的哪些属性(找到、未找到、行数、已打开)来打破循环语句有疑问 声明一个数字; b 号码;光标 c1 是 select rownum,salary from employees;开始打开c1;循环获取 c1 到 a,b; dbms_output.put_line(a || b);当 c1%rowcount 当我这样给出时,我没有得到我真正期望的结果。它只是显示为 124000 @senthilleon 您应该在问题陈述中提到这一点,并指出您的问题到底是什么。为了打破循环,这取决于你想如何打破它。如果你想在整个游标上运行循环,那么notfound
就是条件。【参考方案2】:
您可以使用简化的语法,避免直接处理游标。我认为这种方式不太容易出错。
例子:
begin
for rec in (
select rn, salary
from (
select rownum as rn, salary
from employees
) where rn between 80 and 100
) loop
dbms_output.put_line(to_char(rec.rn) || rec.salary);
end loop;
end;
/
文档:Query Result Set Processing With Cursor FOR LOOP Statements
编辑:
这个结构的一般形式是:
begin
for rec in (
select * from employees -- write any SQL you want here
) loop
-- do whatever you need to do inside the loop...
-- you can access the results of the query through the "rec" variable.
dbms_output.put_line(rec.column1);
dbms_output.put_line(rec.column2);
dbms_output.put_line(rec.column3);
end loop;
end;
/
【讨论】:
@hawk 如果我想打印所有记录怎么办。如何对 select * from 使用相同的语句 只需编写您需要的 SQL 并将其插入for rec in (sql) loop ... end loop;
。如果要选择所有记录,请插入select * from employees
。看看我发布的文档链接。应该够清楚了。
这真的帮了我很多@sstan。【参考方案3】:
你可以使用像下面这样的简单结构
declare
v_e_row employees%rowtype; --employees table row type
v_rownum number;
begin
for emp in (select * from (select m.* , rownum r from employees m) where r between 80 and 100)
loop
v_e_row.emp_id := emp.emp_id; -- sample value ( you will get all value including rownum)
v_rownum := emp.r;
dbms_output.put_line(v_e_row.emp_id||v_rownum);
end loop;
end;
【讨论】:
以上是关于oracle中的存储过程,用于根据行获取记录的主要内容,如果未能解决你的问题,请参考以下文章