Как вызвать функцию внутри курсора в pl/sql?

Я объявила функцию, которая возвращает некоторую строку как

function(varchar2) return varchar2;

Я хочу, чтобы эта функция вызывалась изнутри курсора, как

open p-cursor for select * from employee where emp_name = function(ssn).

Но это вызывает некоторую ошибку.

Запрос, используемый в курсоре, отлично работает при выполнении отдельно.

1
nl ja de
Какую ошибку он бросает?
добавлено автор Luke Woodward, источник

2 ответы

Когда вы говорите, что вы «объявили» функцию, вы имеете в виду вот так?

declare
  function f (p varchar2) return varchar2
  is
  begin
    ...
  end;
begin
  open p_cursor for select * from employee where emp_name = function(ssn);
  ...
end;

Вы не можете использовать такую ​​функцию в SQL. Вам нужно будет создать функцию в базе данных, чтобы ее можно было использовать вне программы PL/SQL - например:

  create or replace function f (p varchar2) return varchar2
  is
  begin
    ...
  end;

Или, если вы создаете пакет, вы можете сделать публичную функцию пакета следующим образом:

  create or replace package pkg is
    function f (p varchar2) return varchar2;
    ...
  end;

Затем его можно использовать в другом коде:

  open p_cursor for select * from employee where emp_name = pkg.f(ssn);
1
добавлено
«Некоторая ошибка»? Не могли бы Вы уточнить?!
добавлено автор Tony Andrews, источник
Привет, Тони, спасибо за интерес к моему запросу. Я создал функцию внутри пакета и пытаюсь использовать эту функцию в процедуре в том же пакете. Процедура содержит курсор, из которого я хочу использовать эту функцию, но она вызывает некоторую ошибку. Но когда я выполняю запрос, используемый в курсоре, он дает мне правильный результат. Я просто хочу знать способ вызова функции внутри курсорного запроса.
добавлено автор Shushant, источник

Я уверен, что вы не можете использовать групповую функцию в предложении where. Но эта функция (ssn), не являющаяся групповой функцией, не может также использоваться здесь.

Вы можете использовать его как вспомогательный запрос, который служит цели.

открыть p-курсор для выбора * у сотрудника, где emp_name = (выберите имя_папки.function_name (ssn) из double);

0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)