#oracle #function #plsql #package
#Oracle #функция #plsql #пакет
Вопрос:
У меня есть пакет Oracle с именем DEF, внутри которого находится 1 функция с именем ABC, которая принимает 1 строковый аргумент. Могу ли я узнать, как вызвать эту функцию ABC непосредственно в редакторе TOAD?
Заранее спасибо.
CREATE OR REPLACE PACKAGE HPQ_IF.def AS
FUNCTION def(p_sql IN VARCHAR2)
RETURN VARCHAR2;
END def;
/
FUNCTION abc(p_sql IN VARCHAR2)
RETURN VARCHAR2
IS
j NUMBER;
BEGIN
dbms_output.put_line(p_sql);
RETURN 'Done';
END abc;
Последняя ошибка (с использованием первого ответа ниже):
[Error] Execution (6: 31): ORA-06550: line 6, column 31:
PLS-00302: component 'abc' must be declared
ORA-06550: line 6, column 3:
PL/SQL: Statement ignored
Комментарии:
1. Кажется, вы изменили имена функции и пакетов. Но я подозреваю, что вы допустили ошибку. Функция должна вызываться abc не только в теле, но и в объявлении. Пожалуйста, опубликуйте полный заголовок packaged и полное тело пакета. Если вы меняете имена, то сначала исправьте все ошибки, чтобы и заголовок, и тело успешно скомпилировались.
Ответ №1:
В буфере TOAD SQL:
DECLARE
v_sql VARCHAR2(255);
v_return VARCHAR2(255);
BEGIN
v_sql := 'the string'; -- or get it from anywhere else
v_return := HPQ_IF.def.abc(v_sql);
dbms_output.put_line(v_return);
-- do anything else you want to do with the return value here...
END;
Если вы не хотите ничего делать с возвращаемым значением, кроме отображения информации:
SELECT HPQ_IF.def.abc('the string') FROM DUAL;
Однако, чтобы функция PL / SQL вызывалась в SQL (SELECT, INSERT и т.д.), Она должна быть свободна от определенных побочных эффектов (т.Е. он не может изменять определенные состояния в базе данных). Для вызова в качестве столбца в SELECT она не должна изменять базу данных (например, вставлять или обновлять), выполнять DDL или фиксировать транзакцию.
Вы также можете использовать процедуру Execute из браузера Schema.
Комментарии:
1. привет, спасибо за ответ, странно, что это привело к выполнению [ошибки] (6: 31): ORA-06550: строка 6, столбец 31: PLS-00302: компонент ‘abc’ должен быть объявлен ORA-06550: строка 6, столбец 3: PL / SQL: оператор проигнорирован
2. Опубликуйте код для def.abc, пожалуйста? Доступна ли abc в спецификации пакета def?
3. привет, Скотт, я опубликовал выше заголовок пакета и его тело. Обратите внимание, что я также использовал ту же схему HPQ_IF в тестировании
4. Согласно тому, что вы опубликовали, в package def нет общедоступной функции abc, если только это не опечатка.
5. @iwan Я почистил синтаксис и добавил немного больше объяснений; обратите внимание, что, поскольку это функция, вы должны возвращать значение.
Ответ №2:
Функция возвращает значение, поэтому вам нужно где-то вернуть результат.
Вы можете вызвать функцию из инструкции SQL
SELECT def.abc( 'Some string' )
FROM dual;
Или вы можете вернуть результат в локальную переменную в PL / sQL
DECLARE
l_result VARCHAR2(100);
BEGIN
l_result := def.abc( 'Some string' );
END;