Пытаетесь вернуть количество записей в консоль, которую я вставил? - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь вставить в промежуточную таблицу все данные, которые соответствуют определенным критериям. В этом примере это для любых записей, где дата last_updated наступает позже, чем max_modified_date таблицы. Эта часть работает для меня; однако я добавил степень сложности, приняв параметр IN (любое случайное число) и параметр OUT (число, которое рассчитывается путем добавления «случайного числа» из параметра IN к числу вставленных записей. в моем коде представлена ​​переменная rUpdated_Row_Count_2. Когда я запускаю код, единственное значение, которое сейчас выводится на мою консоль, это «0». Мой код ниже:

create or replace procedure test_proc(rUpdated_Row_Count IN NUMBER, rUpdated_ROW_COUNT_2 OUT NUMBER)
is
   max_modified_date date;
BEGIN
    select max(modify_dt) into max_modified_date from value;

    for  rec_ in (
                  select value_id, modify_dt as last_update
                from value
              ) loop
                    if rec_.last_update > max_modified_date THEN
                        insert into table2_test( table2_id, last_update )
                                    values( null, rec_.last_update);
                                  rUpdated_Row_Count_2 := rUpdated_Row_Count_2 + 1;
                          end if;
                    end loop;
            end;
/



DECLARE
  rUpdated_Row_Count number;
  rUpdated_Row_Count_2 number := 1;
BEGIN
--    dbms_output.put_line(rUpdated_Row_Count || rUpdated_Row_Count_2);
    test_proc(1, rUpdated_Row_Count_2);
    dbms_output.put_line(rUpdated_Row_Count || rUpdated_Row_Count_2); 
END;
/

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Очень простой пример для иллюстрации моего комментария. Проверьте это в схеме Скотта:

DECLARE
 PROCEDURE process_recs (p_dept_no scott.dept.deptno%TYPE)
 IS
  CURSOR e_cur IS
  SELECT empno, ename
    FROM scott.emp
   WHERE deptno = p_dept_no;

   v_recs_processed NUMBER:= 0;
BEGIN
  FOR e_rec IN e_cur LOOP
    v_recs_processed:= e_cur%ROWCOUNT;
  END LOOP;
  dbms_output.put_line(v_recs_processed);
END;
BEGIN
  process_recs(10);
END;
/

Выход:

 3
0 голосов
/ 16 мая 2018

Oracle возвращает NULL, если вы добавляете любое целое число со значениями NULL, а в вашем коде rUpdated_ROW_COUNT_2 для процедуры равно NULL, потому что значение «1», которое вы передаете во время вызова, не будет принято из-за параметра OUT.Или же вы должны сделать от "rUpdated_ROW_COUNT_2 OUT NUMBER" до "rUpdated_ROW_COUNT_2 IN OUT NUMBER" Ваш код процедуры должен быть:

create or replace procedure test_proc(rUpdated_Row_Count IN NUMBER, rUpdated_ROW_COUNT_2 OUT NUMBER)
is
   max_modified_date date;
   v_1 number := 0;
BEGIN
    select max(modify_dt) into max_modified_date from value;

    for  rec_ in (
                  select value_id, modify_dt as last_update
                from value
              ) loop
                    if rec_.last_update > max_modified_date THEN
                        insert into table2_test( table2_id, last_update )
                                    values( null, rec_.last_update);
                                  v_1 := v_1 + 1;
                          end if;
                    end loop;
rUpdated_Row_Count_2 := v_1;
            end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...