首页 > 解决方案 > 访问函数 - ORA-00904: 无效的标识符

问题描述

我是oracle的新手,请帮忙。

我在 schemaB 中编写了一个与此处类似的函数,只是稍作改动。

当我从上面的函数运行查询时,在 schemaA 中,它运行良好并返回序列。

select schemaB.sequence_name_seq.nextVal from dual;

从 schemaB 运行函数当然会按预期返回序列。

但是,当我尝试从 schemaA 访问相同的函数(包含上述查询)时,它给了我一个错误:“ORA-00904:无效标识符”

我已向 schemaA 的 userA 授予 EXECUTE 权限(从“DBA_TAB_PRIVS”表中确认)。

功能:

create or replace Function nextSeq
(
   tableName in VARCHAR2
)return NUMBER as
nextNum Number;

begin

EXECUTE IMMEDIATE 'select '||tableName||'_SEQ.nextval from dual' into nextNum;

return nextNum;
END nextSeq;

致电:

select nextSeq('SCHEMAB.TABLENAME') from dual;

标签: oracleoracle12c

解决方案


下面是我的做法: 连接为SCOTT,我正在创建一个序列和一个函数;然后我将EXECUTE功能授予用户MIKE

SQL> show user
USER is "SCOTT"
SQL> create sequence dept_seq;

Sequence created.

SQL> create or replace function nextseq (tablename in varchar2)
  2    return number
  3  as
  4    nextnum number;
  5  begin
  6    execute immediate 'select ' || tablename||'_seq.nextval from dual' into nextnum;
  7    return nextnum;
  8  end;
  9  /

Function created.

SQL> select nextseq('dept') from dual;

NEXTSEQ('DEPT')
---------------
              1

SQL> grant execute on nextseq to mike;

Grant succeeded.

SQL>

连接 asMIKE并使用SCOTT's 功能:

SQL> connect mike/lion@xe
Connected.
SQL> show user
USER is "MIKE"
SQL> select scott.nextseq('dept') from dual;

SCOTT.NEXTSEQ('DEPT')
---------------------
                    2

SQL>

如您所见,它有效。与您的代码相比,区别在于:

You: select nextSeq('SCHEMAB.TABLENAME') from dual;
Me : select scott.nextseq('dept') from dual;

您不应该在表名前面加上所有者,而是在函数名前面。


推荐阅读