#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;
Комментарии:
1. Попробуйте выполнить функцию с ее полным именем: ВЫБЕРИТЕ DCSDBA.IS_NUMBER(‘123’) ИЗ DUAL; Вы все еще получаете ошибку?
2. это сработало, вы знаете, почему на этот раз не сработал DCSDBA. часть? я вызвал другие функции, которые у меня есть, без полного имени
3. Похоже, что другие функции хранятся в схеме DCSRPT, поэтому вы можете использовать короткое имя для их вызова. Проверьте это.
Ответ №1:
Попробуйте выполнить вызов
SELECT DCSDBA.IS_NUMBER('123') FROM DUAL;
Комментарии:
1. Немного больше объяснений могло бы сделать это лучшим ответом. Почему вызов операционной системы не сработал и почему добавление имени владельца исправляет это? Также, возможно, предложите синоним.