使用来自另一个模式的数据的 Oracle SQL 函数说表或视图不存在

Posted

技术标签:

【中文标题】使用来自另一个模式的数据的 Oracle SQL 函数说表或视图不存在【英文标题】:Oracle SQL Function using data from another schema says table or view does not exist 【发布时间】:2014-06-06 12:10:48 【问题描述】:

我试图创建一个函数,它接受 3 个参数并返回一个。返回参数的值是通过查询两个表获得的,但是其中一个表在不同的架构上。我使用的 SQL 如下:

create or replace FUNCTION tester
    (
    originaltext IN VARCHAR2, lang IN VARCHAR2, category IN VARCHAR2 DEFAULT NULL) 
  RETURN VARCHAR2 AS
  translatedttextval VARCHAR2(255) := '';
BEGIN
  --if category is null, disregard category
  if category is null then
      SELECT distinct nvl(trans.translatedtext, originaltext) 
      INTO translatedttext
      FROM tbl_translations trans, SECDEVSCHEMA.tbl_instanceids ids 
      WHERE trans.translatedlang = ids.id_a
      AND ids.name = lang
      AND trans.originaltext = originaltext;
  end if;
  RETURN translatedttextval;
END;

我在这里删除了一些使用类别搜索的查询,因为它执行类似的操作并且存在相同的问题。

所以,当我运行它并传入参数时,我收到一个错误,内容如下: 错误(16,46):PL/SQL:ORA-00942:表或视图不存在

如果我执行以下查询,它在不在 SECDEVSCHEMA 上时可以正常工作,并返回来自 tbl_instanceids 的结果,它在 SECDEVSCHEMA 架构上:

SELECT * FROM SECDEVSCHEMA.tbl_instanceids ids WHERE ids.id_a = 1234555; 

我没有对数据库的 DBA 访问权限,但如果我需要授予某些选择特权或某些事情,我可以完成它。尽管上述查询有效,但不确定是否是这种情况。

还有一个小问题: 它在查询中说的地方 nvl(trans.translatedtext, originaltext)

如果我想在不存在已翻译文本值的情况下用括号将原始文本值括起来,我该怎么做?

顺便说一句,我正在使用 SQL Developer,以防万一。

谢谢

【问题讨论】:

【参考方案1】:

你的小问题

nvl(trans.translatedtext, '<'|| originaltext ||'>' )

【讨论】:

【参考方案2】:

这归结为权限问题。

在SQL Developer中,展开tables包,在Function中选择需要访问的表,右键选择Priviledges > Grant。

由于这只是一个开发数据库,​​我刚刚将所有权限分配给适当的架构或用户,并且它现在可以工作了。

但仍然不确定这部分:

还有一个额外的小问题:它在查询 nvl(trans.translatedtext, originaltext) 中所说的位置

如果我想在不存在已翻译文本值的情况下用括号括住原始文本值,>我将如何处理?

有人愿意接受吗? 谢谢

【讨论】:

以上是关于使用来自另一个模式的数据的 Oracle SQL 函数说表或视图不存在的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL 将游标(来自函数)中的每个值一一分配给另一个游标

Oracle PL/SQL 和 Shell 脚本:从一种模式到另一种模式

如何使用 Oracle (PL/SQL) 动态 sql 将数据查询到 %rowtype 变量中

Mongoose:如何使用来自模式的数据(产品值)使用方法填充另一个模式()中的字段?

比较 SQL 中的 Oracle 表列

Oracle SQL:使用来自同一表的另一列的数据更新表