【问题标题】:Create View in procedure PL/SQL在过程 PL/SQL 中创建视图
【发布时间】:2017-08-16 18:54:30
【问题描述】:

我在论坛上看过,但目前这个问题没有答案。基本上,我试图在我的过程中创建一个视图,因为它比似乎不起作用的复杂选择语句更容易,因为它返回的“ORA-01422 精确提取返回的行数超过了请求的行数”。我已经把语句底部供参考

但是,视图选项似乎不起作用,它返回另一个错误“在预期以下情况之一时遇到符号“CREATE”:”。是不是我做错了什么?

感谢观看。

procedure proRekt (par_id number) is 
  vardec farm.parcel.description%type;
  vland farm.landuse.landuse_id%type;
  v_luse farm.landuse.landuse%type;
  varpl farm.parcel.parcel_id%type;

begin  
 create or replace view Door as
select a.parcel_id,a.description,b.landuse_id,c.landuse
from 
     farm.parcel a,
     farm.parcel_landuse b,
     farm.landuse c
where a.parcel_id = b.parcel_id
  and b.landuse_id = c.landuse_id;

 select parcel_id,description,landuse
    into varpl,
         vardec,
         vland
  from   door
  where  parcel_id = parID;

**** 错误的选择语句

select a.parcel_id,c.description,a.landuse_id,b.landuse
into   varpl,
       vardec,
       vland,
       v_luse
from   farm.parcel_landuse a,
       farm.landuse b,
       farm.parcel c
where  c.parcel_id = parID
  and  a.landuse_id = b.landuse_id
  and  a.parcel_id = c.parcel_id;

【问题讨论】:

  • 不是 oracle 用户,但 select into structure 是错误的... select into from
    还是要插入多个表?
  • 它的pl/sql所以需要选择与sql有点不同的变量。
  • 我明白了.. 这应该寻找 varTNo 变量吗?
  • 如果你想创建视图那为什么要通过存储过程创建呢?您可以通过存储过程直接创建视图并从中选择数据。
  • CREATE VIEW 是 SQL 命令而不是 PL/SQL 命令。如果你需要在 PL/SQL 中使用它,你必须使用EXECUTE IMMEDIATE。但是根据您正在做的事情,SQL 似乎就可以了。

标签: sql oracle plsql


【解决方案1】:

在 SQL 范围内创建视图:

create or replace view Door as
select a.parcel_id,
       a.description,
       b.landuse_id,
       c.landuse
from   tithedb.parcel a
       INNER JOIN tithedb.parcel_landuse b
       ON ( a.parcel_id = b.parcel_id )
       INNER JOIN tithedb.landuse c
       ON ( b.landuse_id = c.landuse_id );

在过程的 PL/SQL 范围内使用它:

procedure proexempt (parID number)
is 
  vardescription tithedb.parcel.description%type;
  varland tithedb.landuse.landuse_id%type;
  varlanduse tithedb.landuse.landuse%type;
  varparcel tithedb.parcel.parcel_id%type;
begin  
  select parcel_id,
         description,
         landuse
  into   varparcel,
         vardescription,
         varlanduse
  from   door
  where  parcel_id = parID;

  -- ... more stuff
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    NULL; -- Handle error here.
  WHEN TOO_MANY_ROWS THEN
    NULL; -- Handle error here (or use "AND ROWNUM = 1" in your query).
END proexempt;
/

【讨论】:

  • 谢谢!!!期望解决了我的问题。首先运行它并且它与期望一起工作,但由于某种原因它没有返回所有数据,它对大多数人来说抛出了太多行异常。所以我按照你的建议做了,把 And Rownum
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多