Как выводить информацию в Oracle db, используя в другом блоке pl / sql?

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