2013-04-08 77 views
0

我有以下腳本,我在oracle內部運行以返回一些數據,但是我想將其存儲爲存儲過程,因此我不必保持重新運行整個位代碼在運行時。如果有人能讓我知道如何做到這一點,我將非常感激。我一直在試驗,但沒有多少運氣。使用現有代碼創建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; 
+0

你需要結果作爲結果集嗎? – TechDo 2013-04-08 11:50:32

+0

是的,這是正確的。 – Reidacus 2013-04-08 11:54:36

+0

謝謝大家的建議。確實很有幫助。 – Reidacus 2013-04-08 12:20:29

回答

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; 
+0

這對我很好,非常感謝。 – Reidacus 2013-04-08 12:21:07

0

你需要光標在oracle中選擇數據。請參閱鏈接Oracle – Returning a recordset from a stored procedure瞭解更多詳情。

-- 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 
1

作爲一個引用遊標的替代,可以使用一個流水線功能(這是更容易使用在一些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());