Plsql 将视图转换为存储过程
我对这样的事情有看法。我刚刚给出了部分代码Plsql 将视图转换为存储过程,plsql,oracle11g,Plsql,Oracle11g,我对这样的事情有看法。我刚刚给出了部分代码 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_
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
存储过程不会将内容发送到屏幕。您必须打开多个设置才能将任何内容显示在屏幕上:
exec dbms_output.put_line('Putting my stuff on the screen');
如果您使用的是sqlplus,则必须具有以下设置:
set serveroutput on;
在您的过程中,您必须将以下内容放到屏幕上:
exec dbms_output.put_line('Putting my stuff on the screen');
您不能像使用SQL server那样从表中显示select。对于我来说,这与转换没有任何“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.
以下是如何使用此过程:
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上为我工作。你想做什么?我不明白你想做什么。我想创建一个存储过程,但因为它有with语句,所以它没有work@aniltc. 不起作用?是否在创建或替换
时出错?执行存储过程时出错?如果有错误,请将错误准确地复制到您的问题中。跑步的结果不同吗?然后列出预期结果和实际结果。您能否简化为一个简单完整的测试用例?你说有with
子句是问题所在,没有with
,你能让类似的存储过程正常运行吗?我目前的观点不是一个优化的观点,所以我正在转换为存储过程并将其插入到表中。我不认为这是操作的重点。他没有试图显示输出;他尝试转换视图(DB对象)。