使用功能-ORA-00904:无效的标识符

时间:2018-09-16 12:52:54

标签: oracle oracle12c

我是oracle新手,请协助。

我在schemaB中编写了类似于here的函数,但做了一些细微改动。

当我从上面的函数运行查询时,在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;

1 个答案:

答案 0 :(得分:3)

这就是我的方法:以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>

MIKE的身份连接并使用SCOTT的功能:

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;

您不应在所有者的表名之前,而是函数名