【问题标题】:inline view query内联视图查询
【发布时间】:2012-01-27 21:42:28
【问题描述】:

我想从这个表 mytemp 中删除我最近添加的一些记录,请告诉我这个查询有什么问题, 所选列中的数据已使用光标填充

DELETE FROM (SELECT ROWNUM RM, S from mytemp) where rm > 20;

错误是:

ORA-01732: 数据操作操作在此视图上不合法

【问题讨论】:

  • DELETE FROM 需要一个表的名称...DELETE FROM mytemp WHERE ... 也许?
  • 好的,所以我们不能从内联视图中删除??

标签: oracle view inline


【解决方案1】:

为准确性而编辑...

这是您遇到的错误的描述:

http://ora-01732.ora-code.com/

试图对一个 UPDATE、INSERT 或 DELETE 语句使用 包含表达式或函数或派生自更多的视图 比一张桌子。如果使用连接操作来创建视图或 视图包含从函数或表达式派生的虚拟列, 那么视图只能被查询。

所以看起来一个可更新的视图可以代替一个表,只要它不连接多个表或使用虚拟列。在您的情况下,问题出在虚拟 ROWNUM 列。

【讨论】:

  • 谢谢,但是我们如何使用'rownum >20',它会不会总是返回false..我想确认我们只能使用内联视图进行选择..我们不能使用内联视图进行数据操作..?
  • 你是对的,这是一个糟糕的解决方案。我编辑了我的帖子以解释为什么它不起作用并删除了错误的 SQL。
  • 谢谢 Danimal,我还是不明白..什么是虚拟 rownum 列?我的意思是,内联视图将输出作为 rownum 列的“rm”,然后删除 rm 值大于 20 的那些记录..您还可以解释一下这个虚拟 rownum..再次感谢
  • 我的意思是您在内联视图中使用“rownum”来生成 RM 列。推测它被认为是从函数派生的列,因此根据 Oracle 的文档,您的视图不符合更新、插入或删除的条件。
  • 嗯..我认为你是对的..我认为这个错误是由于该列中的值是使用光标填充的..但是可能是它被认为是从函数或表达式派生的列。 .
【解决方案2】:

这是rownum>20 声明。

ROWNUM>x,其中大于正整数的 x 值始终为假。

select * from ANYTABLE where rownum>(ANY POSITIVE INTEGER) 

不返回任何记录。

提取的第一行的 ROWNUM 为 1,使条件为假。要获取的第二行现在是第一行,并且还分配了 1 的 ROWNUM 并使条件为假。随后所有行都不满足条件,因此不返回任何行。

查看THIS了解更多信息。

您可以执行以下操作:

delete from (select amount from TABLE t where t.amount=1000)

但是和

是一样的
delete from TABLE where amount=1000

【讨论】:

  • thnx bonsvr,你知道这一点,但我想做的是通过内联视图删除 soem 记录..我认为我们可以通过将 rownum 作为实际列来选择使用内联视图 n...跨度>
  • @ratsy 是的,你可以。 alter table mytemp add row_col number; update mytemp set row_col=rownum;
  • 感谢 bonsvr,是的,这解决了我的 tiem 目的 :) 谢谢...但我仍然想知道我们是否不能使用内联视图删除
猜你喜欢
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多