Ошибка при использовании переменных обмена PLSQL

#oracle #plsql #sqlplus

#Oracle #plsql #sqlplus

Вопрос:

Ну, у меня есть этот оператор PL / SQL:

   SET SERVEROUTPUT ON;
ACCEPT lastname PROMPT 'Please enter a Lastname';

DECLARE
  lastn employees.last_name%TYPE;
  sal employees.salary%TYPE;
BEGIN
 lastn := amp;amp;lastname;
  SELECT salary INTO sal FROM employees WHERE last_name = lastn;
  IF sal < 3000 THEN
    sal := sal   500;
    UPDATE employees SET salary = sal WHERE last_name = lastn;
    DBMS_OUTPUT.PUT_LINE(lastn||' salary updated');
  ELSIF sal > 3000 THEN
      DBMS_OUTPUT.PUT_LINE(lastn || ' earns ' || sal);
    END IF;
  END;
 

Если я ввожу имя, например, ‘King’, я получаю сообщение об ошибке. Сообщение об ошибке: «Идентификатор ‘KING’ должен быть объявлен».

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

1. Не уверен, как вы вызываете процедуру хранения, но я думаю, что идентификатор в вызове должен быть чем-то вроде: lastname:’king’ или что-то подобное…

Ответ №1:

Вы должны учитывать, что строка amp;amp;lastname в вашем скрипте будет заменена значением, которое вы вставляете во время выполнения; это означает, что когда вы даете ‘King’, ваш код становится:

 lastn = King;
 

что, очевидно, выдает ошибку.

Что вам просто нужно, так это кавычки:

 lastn := 'amp;amp;lastname';
 

С помощью скрипта x.sql lke это:

 ACCEPT lastname PROMPT 'Please enter a Lastname ';
DECLARE
  lastn varchar2(100);
BEGIN
 lastn := 'amp;amp;lastname';
 dbms_output.put_line('lastn = ' || lastn);
END;
/
 

Если вы попытаетесь использовать SQL * Plus с

 set verify on
 

вы можете видеть это поведение:

 SQL> @c:tempx
Please enter a Lastname King
old   4:  lastn := 'amp;amp;lastname';
new   4:  lastn := 'King';
lastn = King

PL/SQL procedure successfully completed.

SQL>
 

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

1. Если я использую ваш код, я получаю эту ошибку: точная выборка возвращает больше запрошенного количества строк

2. Вероятно, это означает, что в таблице employee имеется более одной записи, которая соответствует условию LastName . Вам нужно понять, нужно ли вам обрабатывать много совпадающих записей или нет, а затем соответствующим образом отредактировать свой код.