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对象)。