2015-12-06 28 views
0

我正在尝试创建一个报告,该报告将根据用户标识显示过滤的信息。讲师将能够登录到系统,并会看到他们所领导的所有模块,登录ID与用于在模块表中定义讲师代码的讲师代码相同。APEX - 将值与当前用户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的新手。任何想法为什么此代码无效?

+1

请学会使用正确的显式'join'语法。 –

+0

谢谢,但我收到错误:无法解析查询,请检查您的查询的语法。 (ORA-00904:“USERINFO”。“GETUSERID”:无效标识符) – AdamMcquiff

+0

这意味着底层数据库不理解您正在使用的功能。 –

回答

2

心尖您检索使用:APP_USER用户。此绑定变量包含用户登录应用程序时使用的值(因此登录页面上的值为:P101_USERNAME)。

如果您需要与用户有关的实际ID或任何其他相关信息,您应该创建一些应用程序项目来存储该信息。在身份验证方案的身份验证后过程中,您可以根据使用的登录名,将值检索到应用程序项中。

+0

完美!这工作。感谢您的帮助。 – AdamMcquiff

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() 
      ); 

这些都不解决UserInfo.getUserId()不受Oracle理解问题。

+0

我认为你的语法是正确的,比我的更干净。我相信你是对的,我认为APEX不允许我使用UserInfo.getUserID()。我可以使用USER函数的任何好的文档? – AdamMcquiff

+1

直到'SYS_CONTEXT'正在工作的语法,但我无法得到实际的'SYS_CONTEXT'节正常工作。我无法在“SYS_CONTEXT”文档中找到“SYSTEM_USER”。我尝试了SYS_CONTEXT('SYSTEM_USER','USER'),'SYS_CONTEXT('USERENV','SESSION_USER')和'SYS_CONTEXT('USERENV','SESSION_USERID')' – AdamMcquiff

+0

@AdamMcquiff。 。 。只有'用户'工作? (即'l.lecturer_code = USER') –

0

据我所知在顶点

心不是类似于UserInfo.getUserId()的任何代码在我的代码

我使用顶点的cookie用于获取loggined用户的用户名,然后查找ID我使用类似的代码下面括号 为适应你可以使用如下

l.lecturer_code = (select USER_ID from USERS_TABLE where USER_USERNAME=apex_authentication.get_login_username_cookie) 
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; 

Reference

基于上述程序获取用户名,你可以写你的查询,如:

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); 

Make appropriate change in your database table for lecture code to be comparable with username