#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 . Вам нужно понять, нужно ли вам обрабатывать много совпадающих записей или нет, а затем соответствующим образом отредактировать свой код.