我尝试创建一个报告,根据用户ID显示过滤后的信息。讲师将能够登录系统,并将看到他们所领导的所有模块,登录ID与用于在模块表中定义讲师代码的讲师代码相同。
这是我的SQL查询。
SELECT m.module_code, m.module_name, m.lecturer_code,
m.module_number_assessments, m.module_moderator FROM module m, lecturer l
WHERE m.lecturer_code = [Select l.lecturer_code from lecturer l where
l.lecturer_code = UserInfo.getUserId()];
我收到以下错误"无法解析查询,请检查查询的语法。 (ORA-00936:缺少表达)"当试图将其用作报告的来源时。
我是APEX的新手。有关此代码无效的任何想法吗?
答案 0 :(得分:2)
在Apex中,您使用:APP_USER
检索用户。此绑定变量包含用户登录到应用程序时使用的值(因此登录页面上的:P101_USERNAME
的值)。
如果您需要实际ID或与用户相关的任何其他相关信息,您应该创建一些应用程序项来存储该信息。在身份验证方案的后验证过程中,您可以根据使用的登录名将值检索到应用程序项中。
答案 1 :(得分:1)
如果我理解你的意图,那么正确的SQL就是:
SELECT m.module_code, m.module_name, m.lecturer_code,
m.module_number_assessments, m.module_moderator
FROM module m JOIN
lecturer l
ON m.lecturer_code = l.lecturer_code
WHERE l.lecturer_code = UserInfo.getUserId();
UserInfo.getUserId()
不是Oracle的标准部分(据我所知)。您可以使用USER
或类似函数来获取数据库中的用户标识。获取系统信息的一般功能是SYS_CONTEXT()
,记录为here。您可能想要“SYSTEM_USER”:SYS_CONTEXT('USERENV', 'SESSION_USER')
。
在您的情况下,您可能只想要EXISTS
:
SELECT m.*
FROM module m
WHERE EXISTS (SELECT 1
FROM lecture l
WHERE m.lecturer_code = l.lecturer_code AND
l.lecturer_code = UserInfo.getUserId()
);
这些都没有解决Oracle无法理解UserInfo.getUserId()
的问题。
答案 2 :(得分:1)
使用包创建页面流程:
declare
v varchar2(255) := null;
c owa_cookie.cookie;
begin
c := owa_cookie.get('LOGIN_USERNAME_COOKIE');
:P1_USERNAME := c.vals(1);
exception when others then null;
end;
根据上述获取用户名的程序,您可以编写如下查询:
SELECT m.module_code, m.module_name, m.lecturer_code,
m.module_number_assessments, m.module_moderator FROM module m, lecturer l
WHERE m.lecturer_code = (Select l.lecturer_code from lecturer l where
l.lecturer_code = :P1_USERNAME);
在数据库表中对演示代码进行适当的更改 与用户名相比
答案 3 :(得分:0)
据我所知,没有任何类似于顶点中UserInfo.getUserId()的代码
在我的代码中,我使用apex cookie获取loggined用户的用户名然后查找id我在代码中使用类似于下面的代码 适应你可以使用如下
l.lecturer_code = (select USER_ID from USERS_TABLE where USER_USERNAME=apex_authentication.get_login_username_cookie)