Как вызвать sql-функцию ABC, определенную в package DEF, используя TOAD ORACLE

#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;