Я получаю «ORA-00904: недопустимый идентификатор» при вызове функции, несмотря на предоставление разрешения на ВЫПОЛНЕНИЕ

#sql #oracle #function #ora-00904

#sql #Oracle #функция #ora-00904

Вопрос:

Я пытаюсь вызвать функцию IS_NUMBER для имени пользователя DSCRPT, но мне пришлось создать функцию в логине DSCDBA, которому я предоставил разрешения на выполнение, как и для множества других функций, но эта выдает ошибку «НЕДОПУСТИМЫЙ идентификатор«. «НЕДОПУСТИМЫЙ ИДЕНТИФИКАТОР«

Функция:

 create or replace 
FUNCTION is_number (p_string IN VARCHAR2)
   RETURN INT
IS
   v_new_num NUMBER;
BEGIN
   v_new_num := TO_NUMBER(p_string);
   RETURN 1;
EXCEPTION
WHEN VALUE_ERROR THEN
   RETURN 0;
END;
  

ПРЕДОСТАВИТЬ:

 GRANT EXECUTE ON "DCSDBA"."IS_NUMBER" TO "DCSRPT";
  

Выполнение SQL при входе в систему как DSCRPT

 SELECT IS_NUMBER('123') FROM DUAL;
  

Ошибка:

ORA-00904: «IS_NUMBER»: недопустимый идентификатор 00904. 00000 — «% s: недопустимый идентификатор» * Причина:
* Действие: Ошибка в строке: 1 Столбец: 8

Подтверждено, что я могу видеть функцию при входе в DSCRPT

 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('FUNCTION') and owner = 'DCSDBA' order by owner, object_name;
  

Возврат поиска ALL_OBJECTS

Комментарии:

1. Попробуйте выполнить функцию с ее полным именем: ВЫБЕРИТЕ DCSDBA.IS_NUMBER(‘123’) ИЗ DUAL; Вы все еще получаете ошибку?

2. это сработало, вы знаете, почему на этот раз не сработал DCSDBA. часть? я вызвал другие функции, которые у меня есть, без полного имени

3. Похоже, что другие функции хранятся в схеме DCSRPT, поэтому вы можете использовать короткое имя для их вызова. Проверьте это.

Ответ №1:

Попробуйте выполнить вызов

 SELECT DCSDBA.IS_NUMBER('123') FROM DUAL;
  

Комментарии:

1. Немного больше объяснений могло бы сделать это лучшим ответом. Почему вызов операционной системы не сработал и почему добавление имени владельца исправляет это? Также, возможно, предложите синоним.