2013-07-31 3 views
0

Я запускаю разработчика Oracle SQL, и у меня есть следующая Хранимая процедура. Я совсем новичок в этом, но на самом деле не знаю, почему это не работает:Почему эта базовая хранимая процедура «Select Into» не работает?

CREATE OR REPLACE PROCEDURE CHECKDUPLICATE(
     username1 IN USERS.USERNAME%TYPE, 
     o_username OUT USERS.USERNAME%TYPE 
) 

IS 
BEGIN 

    SELECT USERNAME 
    INTO o_username 
    FROM USERS WHERE username1 = o_username; 

END; 

Когда я пытаюсь вызвать его:

DECLARE 
    o_username USERS.USERNAME%TYPE; 
BEGIN 

    CHECKDUPLICATE('Jacklin', o_username); 

    DBMS_OUTPUT.PUT_LINE('username : ' || o_username); 

END; 

Я получаю сообщение об ошибке:

Error starting at line 1 in command: 
DECLARE 
    o_username USERS.USERNAME%TYPE; 
BEGIN 

    CHECKDUPLICATE(Jacklin, o_username); 

    DBMS_OUTPUT.PUT_LINE('username : ' || o_username); 

END; 
Error report: 
ORA-06550: line 5, column 19: 
PLS-00201: identifier 'JACKLIN' must be declared 
ORA-06550: line 5, column 4: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

Что означает «Идентификатор« Джеклин »должен быть объявлен? (Таблица называется USERS, а имя столбца называется USERNAME). Любая помощь будет принята.

EDIT ** Я положил Jacklin в кавычки, и я получаю это сообщение прямо сейчас:

Error report: 
ORA-01403: no data found 
ORA-06512: at "L13JAV04.CHECKDUPLICATE", line 9 
ORA-06512: at line 6 
01403. 00000 - "no data found" 
*Cause:  
*Action: 

Несмотря на то, Jacklin существует ли он в базе данных!

+0

Джеклин - это строка. Должен быть заключен в одинарные кавычки – Noel

+0

Спасибо! Но теперь я получаю еще одно сообщение об ошибке.Сообщение об ошибке: ORA-01403: нет данных не найдено ORA-06512: на "L13JAV04.CHECKDUPLICATE", строка 9 ORA-06512: в строке 6 01403. 00000 - "Нет данных" * Причина: * Действие : – DeaIss

+0

Я отредактировал его в своем первоначальном вопросе для более удобного чтения – DeaIss

ответ

3

После того, как вы цитируете «Jacklin» так, что он рассматривается как строковый литерал, а не идентификатор, ваш SQL заявление не выглядит правильно.

SELECT USERNAME 
    INTO o_username 
    FROM USERS 
    WHERE username1 = o_username; 

Моя ставка является то, что вы хотите использовать входной параметр в вашем предложении WHERE, а не выходной параметр.

SELECT USERNAME 
    INTO o_username 
    FROM USERS 
    WHERE username1 = username; 

Не имеет смысла проверять значение выходного параметра, если вы ничего не сделали для его инициализации.

Но ваш код по-прежнему не имеет смысла. A SELECT INTO выдает ошибку, если возвращается что-либо, кроме 1 строки. Если ваш запрос возвращает 0 строк, вы получите исключение NO_DATA_FOUND. Если ваш запрос возвращает более 1 строки, вы получите исключение TOO_MANY_ROWS. Ваша процедура называется CheckDuplicate, поэтому я предполагаю, что ее цель - проверить, существует ли конкретное имя пользователя в таблице, а не пытаться вставить ее и поймать уникальную ошибку нарушения ограничений. Если это намерение вашего кода

  • Вы, вероятно, хотите, чтобы функция
  • Вы, вероятно, не хотят, чтобы вернуть username
  • Вы, вероятно, хотите, чтобы вернуть показатель ли имя пользователя уже существует

Мое предположение, следовательно, является то, что вы хотели бы что-то вроде

create or replace function isAvailable(p_username IN USERS.USERNAME%TYPE) 
    return Boolean 
is 
    l_username USERS.USERNAME%TYPE; 
begin 
    select username 
    into l_username 
    from users 
    where username = p_username; 
    return false; 
exception 
    when no_data_found 
    then 
    return true; 
end; 
1

Вам нужно поставить Джеклин в кавычки, чтобы он был обработан как строка. В противном случае парсер считает, что это имя поля.

+0

Я сделал это, но я получаю еще одно сообщение об ошибке (Отредактировано в исходный вопрос) – DeaIss

+1

См. комментарий Джафара. В вашем случае предложение неверно. FROM USERS WHERE username1 = o_username следует заменить FROM USERS WHERE username1 = USERNAME_FIELD_IN_TABLE (что бы это ни было). –

0

Не было бы пользователя по имени «Джеклин», поэтому он дал вам ошибку. Пожалуйста, добавьте исключение в конце

WHEN NO_DATA_FOUND 
THEN 
...... 
Смежные вопросы