oracle - 访问函数 - 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;
解决方案
下面是我的做法: 连接为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;
您不应该在表名前面加上所有者,而是在函数名前面。
推荐阅读
- azure-devops - Azure DevOps 执行 Get-AzureADServicePrincipal cmdlet 所需的权限是什么?
- javascript - 如果在视口中可见,则为元素设置动画
- logstash - logstash:想要在同一个过滤器中匹配“单个 grok 模式”和“多个 grok 模式”
- c# - 在 C# 列表中使用 `static readonly T[] _emptyArray = new T[0]` 作为零值
执行 - javascript - 如何使图像区域包含html css javascript中的链接?
- java - 二进制搜索有一些问题有人可以看看吗?
- swagger - 有没有办法在 swagger/openAPI 3.0 文档中并排显示“示例值”和“架构”?
- python - 如何在 discord.py 中进行事件以给出反应?
- oracle-apex - 通过 Apex 项目复选框检查要在项目字段中存储值
- spring-boot - 非法字符导致spring boot微服务构建在docker镜像创建过程中失败