Не удается вызвать хранимую процедуру и функцию oracle

#oracle #function #stored-procedures #oracle10g

#Oracle #функция #хранимые процедуры #oracle10g

Вопрос:

Возможно, это слишком простой вопрос, но мне действительно нужна помощь.

Я создаю хранимую процедуру в Oracle 10g, но я не могу ее вызвать. Я использую SQL Developer для управления базой данных.

 CREATE OR REPLACE
FUNCTION check_login 
  (username IN VARCHAR2, pwd IN VARCHAR2)
  RETURN VARCHAR2
IS
  isUserValid INTEGER;
BEGIN
  SELECT Count(*) INTO isUserValid
  FROM users
  WHERE Username = username AND PASS_WORD = pwd;
  return isUserValid;
END;
  

Я также пробовал это:

 CREATE OR REPLACE
PROCEDURE check_login 
  (username IN VARCHAR2, pwd IN VARCHAR2, RESULT OUT INTEGER)
IS
  isUserValid INTEGER;
BEGIN
  SELECT Count(*) INTO isUserValid
  FROM users
  WHERE Username = username AND PASS_WORD = pwd;
  RESULT := isUserValid;
END;
  

Анализ обоих не дает никакого сообщения об ошибке. Для их вызова я использовал следующий синтаксис:

 BEGIN 
  check_login('admin', 'admin'); 
END;
  

И

 EXECUTE check_login('admin', 'admin');
  

Я получаю это сообщение об ошибке….

PLS-00221: ‘CHECK_LOGIN’ не является процедурой или не определен
PL / SQL: оператор игнорируется

Оператор SELECT внутри обоих работает нормально, если выполняется напрямую.

Я делаю что-то не так?

Ответ №1:

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

Поэтому вам нужно определить переменную и выполнить функцию для возврата в переменную, как показано ниже

и запустите его, используя параметр run Script, а не параметр Run Statement.

 variable ret varchar2(20);

execute :ret:=check_login(dd,dd);

select :ret from dual
  

Или, если вы делаете это из plsql

 declare  v_ret varchar2(100); 
begin

  v_ret:=check_login(a,b); 
end;
  

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

1. Спасибо, Джозеф! Это сработало. Теперь, как сжать три строки только до одной строки, чтобы ее можно было вызвать из кода PHP в одной строке с помощью oci_execute() ?

2. Второй блок, о котором вы упомянули, работает, но отображает только завершенный анонимный блок . Не возвращает значение.

Ответ №2:

Я нахожу, что самый простой способ вызвать функцию — это просто выбрать функцию из dual, например-

 select check_login('admin', 'admin') from dual;
  

Обратите внимание на сообщение об ошибке «Нет процедуры» :).