【问题标题】:error for INSERT using SELECT in PROCEDURE (PL/SQL)在 PROCEDURE (PL/SQL) 中使用 SELECT 插入错误
【发布时间】:2017-09-21 06:19:26
【问题描述】:

在我自己的架构中在 PL/SQL (Oracle) 中运行此过程时出错:

CREATE OR REPLACE PROCEDURE my_procedure AS
BEGIN

  INSERT INTO myschema.mytable (col1, col2, col3, col4)
  SELECT COUNT(*), col2, col3, col4
  FROM AnotherSchema.anotherTable
  GROUP BY AnotherSchema.anotherTable.col2;

END my_procedure;

这些是我得到的错误:

错误(4,7):PL/SQL:SQL 语句被忽略

错误(6,22):PL/SQL:ORA-00942:表或视图不存在

AnotherSchema.anotherTable 确实存在。 myschema.mytable 也是如此

事实上,当我只运行 INSERT 命令时,它工作正常,并且一行被插入到 myschema.mytable 中:

  INSERT INTO myschema.mytable (col1, col2, col3, col4)
  SELECT COUNT(*), col2, col3, col4
  FROM AnotherSchema.anotherTable
  GROUP BY AnotherSchema.anotherTable.col2;

我不明白为什么当我将 INSERT 函数放入过程中时会出现此错误。


编辑:

我需要澄清一下,我是在自己的架构中运行脚本并插入到自己在自己的架构中创建的表中。并且我可以对从 AnotherSchema 读取的表执行选择(从我的模式)。

【问题讨论】:

  • 首先,尝试正确分组,例如:GROUP BY AnotherSchema.anotherTable.col2, AnotherSchema.anotherTable.col3, AnotherSchema.anotherTable.col4。如果您从中调用此过程的用户没有该表的读取权限,您可能会收到此错误;你在用同一个用户运行它吗?
  • 感谢您的回复。显然,这是一个错字,因为很明显我只是在我的帖子中提供了伪脚本,而不是实际的脚本。我已经在我的帖子中更正了这一点。是的,我正在使用同一个用户阅读表格,并且我已经阅读了该表格的特权(AnotherSchema.aotherTable)。
  • 好吧,伪脚本也不起作用,最好给出更接近真实脚本或脚本本身的近似值。我的问题仍然是关于你正在运行它的用户。我很清楚这个错误 - 从第 4 行(语句)开始,然后是第 6 行的ORA-942 - AnotherSchema.anotherTable。您定义 my_procedure 的架构可能与您单独用于 INSERT 语句的架构不同。
  • 将 AnotherSchema.anotherTable 上的选择授予 myschema?
  • 有些东西不见了,如果你像上面一样直接授予,它会起作用,我试过了

标签: oracle plsql sql-insert procedure


【解决方案1】:

您没有直接被授予对其他模式中的表的选择权限,但可能是通过角色授予的,为了让您的插入在 PLSQL 中工作,您需要直接授予对这些表进行选择。

这是来自 Ask Tom 的链接,解释了为什么会这样:

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1065832643319

【讨论】:

  • 您能详细说明一下吗?我有一种感觉,这可能是罪魁祸首,尽管我不太明白。我试图在我自己的架构中运行整个脚本,但我得到了错误。但是当我只突出显示脚本的 INSERT 部分并运行它时,它工作正常。我怎么能没有直接授予访问权限以将 INSERT 访问到我自己的架构中的表中,该表是我创建的并正在从我自己的架构运行脚本?
  • 现在说得通了。正如@Thomas 还建议的那样,我让管理员授权选择我的模式,现在它可以工作了。非常感谢您的链接和解释。
【解决方案2】:

如果它说表/视图不存在,那么可能是您在过程中使用时拼错了表名。

其次,如果表名正确,请确保 myschema 具有对 AnotherSchema.anotherTable 的选择权限。如果您在 myschema 或 anotherschema 中运行了 insert 语句,则会在记录中插入检查。

【讨论】:

  • 表名没问题。正如我所说,当我突出显示中间部分(插入命令)并仅运行该部分时,这很好。当我使用创建或替换过程运行整个过程时,我只会收到错误消息。我显然对 AnotherSchema.anotherTable 具有选择权限,因为当我在自己的架构中运行命令的 INSERT 部分时,它可以工作。
猜你喜欢
  • 2022-12-02
  • 2021-01-12
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多