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中的存储过程,用于根据行获取记录的主要内容,如果未能解决你的问题,请参考以下文章

如果记录存在,Oracle 存储过程会更新行

oracle 存储过程中如何用ROWID

Oracle过程增加字符串数据类型并将其存储为表中的列之一

oracle的存储过程

赵强老师Oracle存储过程中的out参数

赵强老师Oracle存储过程中的out参数