我有一个像这样的观点。我刚刚给出了部分代码
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)
存储过程不会向屏幕发送内容。您必须打开几个设置才能进入屏幕:
如果您使用的是sqlplus,则必须使用此设置:
set serveroutput on;
在你的程序中,你必须把它放到屏幕上才能显示:
exec dbms_output.put_line('Putting my stuff on the screen');
您无法像使用SQL Server一样显示表中的选择。
答案 1 :(得分: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上为我工作。