Использование предложения USER в WHERE для представления в Oracle Sql Developer - PullRequest
0 голосов
/ 13 мая 2018

Мне не удалось найти какую-либо информацию, относящуюся к этому вопросу, поскольку она довольно конкретна.Ситуация такова, что я создал представление, которое должно возвращать результаты на основе пользователя, который его вызывает.Представление выглядит следующим образом:

    CREATE VIEW V_ClientReward AS
    SELECT cl.id, EXTRACT(YEAR FROM r1.recommendationDate) AS 
    yearRecommended,

    COALESCE((SELECT COUNT(*) 
    FROM Recommendation r2 
    WHERE r2.client1 = cl.id AND 
    EXTRACT(YEAR FROM r2.recommendationDate)= EXTRACT(YEAR FROM 
    r1.recommendationDate)
    AND r2.client2 IN(SELECT id FROM Client WHERE registrationDate IS NOT 
    NULL) GROUP BY r2.client1), 0) AS numberRecommendedContracted,

    COALESCE((SELECT COUNT(*) 
    FROM Recommendation r2 
    WHERE r2.client1 = cl.id AND 
    EXTRACT(YEAR FROM r2.recommendationDate)= EXTRACT(YEAR FROM 
    r1.recommendationDate)
    AND r2.client2 NOT IN(SELECT id FROM Client WHERE registrationDate IS 
    NOT NULL) GROUP BY r2.client1), 0) AS numberRecommendedNotContracted,

    ((SELECT rewardImport FROM ClientReward WHERE rewardYear = EXTRACT(YEAR 
    FROM r1.recommendationDate))*COALESCE((SELECT COUNT(*) 
    FROM Recommendation r2 
    WHERE r2.client1 = cl.id AND 
    EXTRACT(YEAR FROM r2.recommendationDate)= EXTRACT(YEAR FROM 
    r1.recommendationDate)
    AND r2.client2 IN(SELECT id FROM Client WHERE registrationDate IS NOT 
    NULL)
    GROUP BY r2.client1), 0)) AS totalEarned 

    FROM Client cl INNER JOIN Recommendation r1
    ON cl.id=r1.client1
    INNER JOIN WebClient
    ON idUser = cl.id
    WHERE nick = USER
    GROUP BY cl.id, EXTRACT(YEAR FROM r1.recommendationDate);

Идея состоит в том, что после того, как я предоставил пользователю SELECT для этого представления, простой акт вызова его через SELECT * FROM P18.V_ClientReward должен получить результаты на основе этого пользователя.название.К сожалению, когда я выполняю его, я не получаю никаких результатов, только пустые поля.Я уже пытался выполнить запрос, указав нужного пользователя непосредственно как WHERE nick = 'user_name', и он отлично работает.

Любая помощь будет принята с благодарностью.

Спасибо.

1 Ответ

0 голосов
/ 13 мая 2018

У меня нет ваших таблиц, поэтому я использую одну из своих.

Во-первых, содержимое таблицы: столбец NICK используется для различения пользователей базы данных (scott & hr).Таблица принадлежит пользователю SCOTT.

SQL> connect scott/tiger@xe
Connected.

SQL> select id_emp, fname, nick
  2  from person;

    ID_EMP FNAME                NICK
---------- -------------------- --------------------
         1 Little               HR
         2 Charles              HR
         3 Rio                  HR
         4 Seb                  SCOTT
         5 Romain               SCOTT

Создание представления с использованием выражения where, которое вы использовали:

SQL> create or replace view v_person as
  2    select id_emp, fname
  3    from person
  4    where nick = user;

View created.

Предоставление привилегий пользователю HR (иначе оно не будет отображатьсячто угодно):

SQL> grant select on v_person to hr;

Grant succeeded.

Хорошо, давайте проверим, что видят эти пользователи.

SQL> show user
USER is "SCOTT"
SQL> select * from v_person;

    ID_EMP FNAME
---------- --------------------
         4 Seb
         5 Romain

SQL> connect hr/hr@xe
Connected.

SQL> -- including the owner's name:
SQL> select * from scott.v_person;

    ID_EMP FNAME
---------- --------------------
         1 Little
         2 Charles
         3 Rio

SQL>

Кажется, все в порядке, не так ли?

Каквашей проблемы: вы случайно не использовали строчные ник значение?

SQL> update person set nick = 'scott' where id_emp > 3;

2 rows updated.

SQL> select * From v_person;

no rows selected

SQL>

Если нет, то не могли бы вы создать такой же простой пример, который ясно показывает, что вы сделали?

...