oracle sql developer ora-00904 ошибка выполнения хранимой процедуры - PullRequest
0 голосов
/ 14 ноября 2018

Я написал простую хранимую процедуру в Oracle SQL Developer, но обнаружил, приложил ошибку на этапе выполнения / выполнения.

problem faced

Вот мой код:

CREATE OR REPLACE PROCEDURE EMP_NAME (EMP_ID_IN      IN     VARCHAR2,
                                      EMP_NAME_OUT      OUT VARCHAR2)
AS
BEGIN
   SELECT first_name
     INTO EMP_NAME_OUT
     FROM employee
    WHERE emp_id = EMP_ID_IN;
END EMP_NAME;

Это также показывает эту ошибку

error_log

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Что-то не так с вашим словарем данных. edit: вы находитесь в БД 10g, я предполагаю, что object_id отсутствует в представлении всех аргументов. Когда мы собираемся выполнить хранимую процедуру, мы запрашиваем у базы данных некоторую информацию о вашем коде.

SELECT data_type, argument_name name 
FROM all_arguments a, all_objects o 
WHERE a.object_id=o.object_id 
AND o.object_name=? and o.owner=? and a.package_name is NULL 
order by position

Ошибка о недействительном object_id - это исходит из этого запроса. Какую версию Oracle Database вы используете? Можете ли вы увидеть свой объект PL / SQL в ALL_OBJECTS и показать ли ваши аргументы в ALL_ARGUMENTS?

Я взял ваш код и изменил его для таблицы HR.EMPLOYEES.

Работает как положено.

enter image description here

Мы запускаем некоторый код, чтобы показать вам два параметра.

Я ввел значение '101' для номера или идентификатора сотрудника и нажал OK.

Тогда параметр OUT отображается ниже на панели «Журнал».

enter image description here

Если вы откроете панель журнала (просмотр -> журнал), вы также увидите страницу «Заявления». Именно там вы можете увидеть ВСЕ код, который мы выполняем в базе данных. Вот где я пошел, чтобы получить SQL, который не работает для вас на OBJECT_ID. Посмотрите на это, иди код и подтвердите, что не работает.

Чтобы это исправить, найдите OLD копию SQLDev, которая поддерживает 10g ... как, возможно, 2.1, ИЛИ обновите вашу БД до версии не ниже 11.2.0.4.

0 голосов
/ 14 ноября 2018

Сама процедура вроде бы в порядке.Однако его исполнение несколько странно.

Я предлагаю вам запустить его из самой таблицы, например,

declare
  l_out employee.first_name%type;
begin
  emp_name(100, l_out);
  dbms_output.put_line('Result = ' || l_out);
end;
/

Хотя, почему это процедура ?Не будет ли функция лучшим выбором?Например,

create or replace function emp_name (emp_id_in in varchar2)
  return employee.first_name%type
is
  retval employee.first_name%type;
begin
  select first_name
    into retval
    from employee
    where emp_id = emp_id_in;

  return retval;
end;
/

Вы бы запустили его простым способом, как

select emp_name(100) from dual;
...