#sql #oracle #plsql #oracle-sqldeveloper
#sql #Oracle #plsql #oracle-sqldeveloper
Вопрос:
У меня есть следующий код:
SET SERVEROUTPUT ON
ACCEPT empno PROMPT 'Enter empno: '
ACCEPT ename PROMPT 'Enter ename: '
ACCEPT job PROMPT 'Enter job: '
ACCEPT mgr PROMPT 'Enter mgr: '
ACCEPT sal PROMPT 'Tneter sal: '
ACCEPT deptno PROMPT 'Enter deptno: '
DECLARE
v_empno NUMBER := 'amp;empno';
v_ename VARCHAR(255) := 'amp;ename';
v_job VARCHAR(255) := 'amp;job';
v_mgr NUMBER := 'amp;mgr';
v_hire DATE := Sysdate;
v_sal NUMBER := 'amp;sal';
v_comm NUMBER := null;
v_deptno NUMBER := 'amp;deptno';
BEGIN
INSERT INTO EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (v_empno, v_ename, v_job, v_mgr, v_hire, v_sal, v_comm, v_deptno);
EXCEPTION
WHEN value_error THEN
DBMS_OUTPUT.Put_line('Error inserting data');
END;
/
ACCEPT vote PROMPT 'Commit changes?'
DECLARE
vote VARCHAR(10) := 'amp;vote';
BEGIN
IF vote = 'yes' THEN
COMMIT COMMENT 'CHANGES COMMITED' WRITE IMMEDIATE NOWAIT;
DBMS_OUTPUT.Put_line('New employee with empno ' || v_empno || ', name:' || v_ename|| ', job:' || v_job || ', his manager is ' || v_mgr ' and salary is ' || v_sal);
ELSE
ROLLBACK;
END IF;
END;
Этот код вставляет данные в таблицу. Это работает.
Но он не выводит результат из
DBMS_OUTPUT.Put_line('New employee with empno ' || v_empno || ', name:' || v_ename|| ', job:' || v_job || ', his manager is ' || v_mgr ' and salary is ' || v_sal);
И я получаю сообщение об ошибке, что необходимо объявить v_empno.
Что мне делать?
Ответ №1:
Переменные ограничены областью их объявления. Вы определили v_empno
в одном анонимном блоке PL / SQL: вы не можете ссылаться на него во втором.
Что вы могли бы сделать, так это вместо этого ссылаться на переменные подстановки:
DBMS_OUTPUT.Put_line('New employee with empno amp;amp;empno , name: amp;amp;ename, job:amp;amp;job , his manager is amp;amp;mgr and salary is amp;amp;sal');
Обратите внимание на двойные амперсанды. Это обозначение указывает, что переменная заполняется из предыдущего экземпляра этой именованной переменной. Это избавляет от необходимости каждый раз запрашивать пользователя.
Но основная проблема заключается в том, что PL / SQL на самом деле не предназначен для взаимодействия с пользователем. Вы пытаетесь создать пользовательский интерфейс, используя язык, предназначенный для автономной обработки данных.