我是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;
答案 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;
您不应在所有者的表名之前,而是函数名。