доступ к функции - ORA-00904: неверный идентификатор - PullRequest
0 голосов
/ 16 сентября 2018

Я новичок в oracle, помогите, пожалуйста.

Я написал функцию, похожую на здесь в схеме B, с небольшими изменениями.

Когда я запускаю запросиз функции выше, в schemaA, она работает нормально и возвращает последовательность.

select schemaB.sequence_name_seq.nextVal from dual;

Запуск функции из схемы schemaB возвращает последовательность, как и ожидалось.

Однако, когда я пытаюсь получить доступ кта же функция (содержащая вышеупомянутый запрос) из schemaA выдает мне ошибку: «ORA-00904: неверный идентификатор»

Я предоставил привилегии EXECUTE для userA schemaA (подтверждено из таблицы '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;

1 Ответ

0 голосов
/ 16 сентября 2018

Вот как я это сделаю: подключившись как 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>

Подключитесь как MIKE и используйте функцию SCOTT:

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;

Вы не должны предшествовать имени таблицы с владельцем, но имя функции .

...