2016-08-25 135 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对象)。 –