Oracle 甲骨文ORA-00904:“;E3";:vpd函数中的标识符无效

Oracle 甲骨文ORA-00904:“;E3";:vpd函数中的标识符无效,oracle,oracle11g,oracle11gr2,vpd,Oracle,Oracle11g,Oracle11gr2,Vpd,我正在学习oracle虚拟专用数据库,因此创建了以下表格: create table employees ( empid varchar(30) primary key,empname varchar(30), dept varchar(30)); insert into employees values ('E1','mark','ACCOUNTING'); insert into employees values ('E2','john','SALES'); insert into empl

我正在学习oracle虚拟专用数据库,因此创建了以下表格:

create table employees ( empid varchar(30) primary key,empname varchar(30), dept varchar(30));
insert into employees values ('E1','mark','ACCOUNTING');
insert into employees values ('E2','john','SALES');
insert into employees values ('E3','vpdadmin', 'RESEARCH');


create table payroll (empid varchar(30), dept varchar(30), total int, taxes int, foreign key(empid) references employees(empid));
insert into payroll values ('E1','ACCOUNTING',2400,100);
insert into payroll values ('E2','SALES',2500,75);
insert into payroll values ('E3','RESEARCH',3000,110);
然后创建策略函数,如下所示:

create function policy_function (obj_schema varchar2, obj_name varchar2) 
return varchar2 is
v_dept employees.dept% TYPE;
v_id employees.empid% TYPE;
begin 
select dept into v_dept from employees where upper(EMPNAME)=SYS_CONTEXT('userenv','SESSION_USER');
select empid into v_id from employees where upper(EMPNAME)=SYS_CONTEXT('userenv','SESSION_USER');
if (v_dept != 'ACCOUNTING') then
return 'upper(EMPID)='|| v_id;
else
return '';
end IF ;
end policy_function;
然后:

begin dbms_rls.add_policy  (
user,
'payroll',
'policy_on',
user,
'policy_function',
'select'); 
end; 
但当我从vpdadmin帐户的工资单中选择*时,我得到错误:

Error information for ORA-28113:
Logon user     : VPDADMIN
Table/View     : VPDADMIN.PAYROLL
Policy name    : POLICY_ON
Policy function: VPDADMIN.POLICY_FUNCTION
RLS view  :
SELECT  "EMPID","DEPT","TOTAL","TAXES" FROM "VPDADMIN"."PAYROLL"   "PAYROLL" WHERE (upper(EMPID)=E3) 
ORA-00904: "E3": invalid identifier

那怎么了?在employees和payroll表中已经有E3作为empid,我不知道发生了什么以及如何修复它

看来
POLICY_函数中的
RETURN
语句应该是

return 'upper(EMPID)=''' || v_id || '''';
EMPID是一个字符串,必须用单引号括起来


祝您好运。

看来
POLICY\u函数中的
RETURN
语句应该是

return 'upper(EMPID)=''' || v_id || '''';
EMPID是一个字符串,必须用单引号括起来


祝您好运。

错误在于
WHERE
子句应为
upper(EMPID)='E3'
,以将EMPID与值'E3'(字符串)进行比较。实际上,如果没有单引号,Oracle希望在表中找到一列E3(“标识符”表示列名或表名等)。如何解决这一问题如Bob Jarvis的回答所示;要在带引号的字符串中获取引号,必须使用附加引号对其进行转义。错误的是,
WHERE
子句应为
upper(EMPID)='E3'
,以便将EMPID与值'E3'(字符串)进行比较。实际上,如果没有单引号,Oracle希望在表中找到一列E3(“标识符”表示列名或表名等)。如何解决这一问题如Bob Jarvis的回答所示;要获取带引号字符串中的引号,必须使用附加引号对其进行转义。