#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;
Обратите внимание на сообщение об ошибке «Нет процедуры» :).