代码之家  ›  专栏  ›  技术社区  ›  John Wick

试图将插入的记录数返回到控制台?

  •  0
  • John Wick  · 技术社区  · 6 年前

    我正在尝试将符合特定条件的所有数据插入临时表中。在本例中,它适用于上一次更新日期晚于表的max\u modified\u日期的任何条目。这件作品适合我;然而我通过接受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 回复  |  直到 6 年前
        1
  •  2
  •   user8406805 user8406805    6 年前

    如果添加任何带有空值的整数,Oracle将返回空值,并且在代码中,rUpdated_ROW_COUNT_2对于过程为空,因为在校准时传递的值“1”由于OUT参数将不被接受。否则,您必须将“rUpdated\u ROW\u COUNT\u 2 OUT NUMBER”改为“rUpdated\u ROW\u COUNT\u 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;
    
        2
  •  0
  •   Art    6 年前

    非常基本的例子来说明我的评论。在Scott模式中测试它:

    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