2016-08-25 141 views
-1

我有這樣的看法。我剛剛給出了部分代碼將視圖轉換爲存儲過程

DROP VIEW u_EVENT; 

CREATE VIEW u_EVENT AS 

WITH time_summary_data 
      AS ( SELECT u_name, 
         u_id, 
         u_event_id, 
         -- max(d_report_date) d_report_date, 
         -- max(d_time_from) d_time_from, 
------- 
-- 
--- 

我從視圖中獲取記錄集。現在我想轉換成存儲過程。作爲with條款使用,我不明白該怎麼辦。

我嘗試了下面的一個。它編譯成功,但無法顯示記錄集。我正在做正確的或其他的方式來做。如何顯示記錄集,不知道。這個Sp是否正確?

CREATE OR REPLACE 
PROCEDURE TEST (p_param2 out sys_refcursor) 
AS 
BEGIN 
open p_param2 for 
WITH time_summary_data AS 
+0

你想要做什麼?我不明白你想做什麼。 –

+0

我想創建一個存儲過程,但因爲它有聲明,它不起作用 – aniltc

+0

@aniltc。不起作用? 「創建或替換」錯誤嗎?執行存儲過程時出錯?如果出現錯誤,請將錯誤完全複製到您的問題中。運行結果不同?然後列出預期和實際結果。你能減少到一個簡單的完整測試用例嗎?你說''with'子句是問題,你能否在沒有'with'的情況下正確運行一個類似的存儲過程? –

回答

0

對我來說,它與轉換沒有任何「WITH」的視圖相同。

假設你有一個簡單的觀點象下面這樣:

create or replace view Mark_Jones as 
    with tbl(name, id) as (
      select 'MarkJones' name , 1 id from dual 
    union all select 'LemiWink' , 2 from dual 
    union all select 'ChinaLTD' , 3 from dual 
    union all select 'GrowsInvest' , 4 from dual  
) 
    select * from tbl 
; 

它顯示:

SQL> select * from mark_jones; 
MarkJones   1 
LemiWink    2 
ChinaLTD    3 
GrowsInvest   4 

我看到沒有問題轉換(我們真的不知道這可能意味着你)它存儲過程:

create or replace procedure proc_mark_jones(p_test out sys_refcursor) as 
begin 
    OPEN p_test FOR 
    with tbl(name, id) as (
       select 'MarkJones' name , 1 id from dual 
     union all select 'LemiWink' , 2 from dual 
     union all select 'ChinaLTD' , 3 from dual 
     union all select 'GrowsInvest' , 4 from dual  
    ) 
    select * from tbl 
    ; 
end; 
/

這裏是如何使用此程序:

declare 
    x sys_refcursor; 
    l_name varchar2(1000); 
    l_id number; 
begin 
    proc_mark_jones(x); 
    IF (x IS NOT NULL) 
    THEN 
    LOOP 
     FETCH x INTO l_name, l_id; 
     EXIT WHEN x%NOTFOUND; 
     DBMS_OUTPUT.PUT_LINE(l_id||'* ' ||l_name); 
    END LOOP; 
    CLOSE x; 
    END IF; 
end; 
/

1* MarkJones 
2* LemiWink 
3* ChinaLTD 
4* GrowsInvest 

PL/SQL procedure successfully completed. 

...在Oracle11g上爲我工作。

0

存儲過程不會將東西發送到屏幕上。你必須有幾個設置開啓讓任何東西進入到屏幕上:

如果你用sqlplus,你必須有這一套:

set serveroutput on; 

裏面你的程序,你必須把這個讓線來到屏幕上:

exec dbms_output.put_line('Putting my stuff on the screen'); 

您不能像使用SQL Server一樣從表中顯示選擇。

+0

我不認爲這是OP的重點。他並不想顯示輸出;他試圖將***轉換爲VIEW(DB對象)。 –