0

我有以下脚本,我在 oracle 中运行以返回一些数据,但是我想将其存储为存储过程,因此我不必在运行时重新运行这整段代码。如果有人可以让我知道如何做到这一点,我将不胜感激。我已经在尝试了,但运气不佳。

下面是我想从存储过程运行的代码。

SET SERVEROUTPUT ON;
declare 
cursor c_emp is
select *
from train;
r_emp c_emp%ROWTYPE;
begin
open c_emp;
loop
fetch c_emp into r_emp;
exit when c_emp%NOTFOUND;
DBMS_OUTPUT.put_line(r_emp.trainid);
end loop;
close c_emp;
end;
4

3 回答 3

1
create or replace procedure procedure_name
is
begin
declare 
cursor c_emp is
select *
from train;
r_emp c_emp%ROWTYPE;
begin
open c_emp;
loop
fetch c_emp into r_emp;
exit when c_emp%NOTFOUND;
DBMS_OUTPUT.put_line(r_emp.trainid);
end loop;
close c_emp;
end;
end procedure_name;
/

然后只需执行以下程序:-

execute procedure_name;
于 2013-04-08T11:59:41.457 回答
1

作为 ref 游标的替代方案,您可以使用流水线函数(在某些 SQL 客户端中更容易使用):

create type id_list as table of integer
/

CREATE OR REPLACE function get_trains
  return id_list
  pipelined
as
begin  
  for train_rec in (select trainid from train) loop
    pipe row (train_rec.trainid);
  end loop;
  return;
end;
/

这可以通过以下方式使用:

select *
from table(get_trains());
于 2013-04-08T12:15:21.620 回答
0

您需要光标来选择 oracle 中的数据。有关详细信息,请参阅链接Oracle – 从存储过程返回记录集

-- Create package
CREATE OR REPLACE PACKAGE types
AS
type cursorType is ref cursor;
END;

-- Here we have declared cursor variable of type cursorType as an output variable.
CREATE OR REPLACE PROCEDURE SP_SELECT_DATA
(
  p_ResultSet        OUT  TYPES.cursorType
)
AS
BEGIN
  OPEN p_ResultSet FOR
  select * from your_table;
END SP_SELECT_DATA;

--Testing
VARIABLE resultSet  REFCURSOR
EXEC SP_SELECT_DATA(:resultSet);
PRINT :resultSet
于 2013-04-08T12:01:13.680 回答