create or replace procedure seq_to_id_max(s_Trigger_name   in varchar2,
                                          sequences_name in varchar2) is
  S_COLUMN_NAME VARCHAR2(4000);
  S_TABLE_NAME  VARCHAR2(30);
  max_id        number;
  current_val   number;
begin
  select COLUMN_NAME, TABLE_NAME
    into S_COLUMN_NAME, S_TABLE_NAME
    from all_trigger_cols
   where TRIGGER_NAME = s_Trigger_name;
  execute immediate 'select max(COLUMN_NAME) from ' || S_TABLE_NAME
    into max_id;
  execute immediate 'select ' || sequences_name || '.currval from dual'
    into current_val;
Exception
  WHEN OTHERS Then
    execute immediate 'select ' || sequences_name || '.nextval from dual'
      into current_val;
    while max_id < current_val loop
      begin
        execute immediate 'select ' || sequences_name ||
                          '.nextval from dual'
          into current_val;
      end;
    end loop;
end seq_to_id_max;
这个存储过程主要是通过序列名和触发器名将判断序列名如果小于表字段最大值就同步到最大值,因为可能是该回话第一次查询.currval所以加个异常处理,不知道异常处理写的对不对,在PL/SQL DEV中怎么异常块把下面的while语句都框里了?主要是这句:
select COLUMN_NAME, TABLE_NAME
    into S_COLUMN_NAME, S_TABLE_NAME
    from all_trigger_cols
   where TRIGGER_NAME = s_Trigger_name;
参数输入一个触发器名称,然后在all_trigger_cols试图中读取COLUMN_NAME和TABLE_NAME,昨天报告有多个值,就是这个where条件得到的是多个列,我跟踪了一下发现where条件没起到作用,所有列都查询出来了。
今天又调试报告ORA-01403:未找到数据错误。奇怪了,我在SQL查询是能查询出来的并且只有一条,为什么存储过程中就出现这种情况呢?

解决方案 »

  1.   

    select COLUMN_NAME, TABLE_NAME
        into S_COLUMN_NAME, S_TABLE_NAME
        from all_trigger_cols
       where TRIGGER_NAME = s_Trigger_name;你调试过s_Trigger_name的值是多少?
    和你在PL/SQL DEV里运行的一样么?
      

  2.   

    单步监视一下s_Trigger_name的值
      

  3.   


    调试了,值是一样的。调试时跟踪了s_Trigger_name值,传入的参数也是正确的,与直接写查询的where条件相同,但是得出的结果确实不同的,不知道是不是Oracle系统视图有什么特殊机制,或者生命周期什么的
      

  4.   

     select COLUMN_NAME, TABLE_NAME
        into S_COLUMN_NAME, S_TABLE_NAME
        from all_trigger_cols
       where TRIGGER_NAME = s_Trigger_name 
       AND ROWNUMBER<2 这样用吧  首先一般这个 TRIGGER_NAME 不可能只查出一条数据的 
      

  5.   


    这个方法也用了,能查出来一条,但是那个数据不是我期望的,查出来那一条是不加where条件默认的第一条数据
      

  6.   

    寒 你把你的 s_Trigger_name  那个值发出来看看  是不是那个值有问题
      

  7.   


    SQL> select COLUMN_NAME, TABLE_NAME from all_trigger_cols where trigger_name = 'TRG_SEQ_TTHJL';
     
    COLUMN_NAME                                                                      TABLE_NAME
    -------------------------------------------------------------------------------- ------------------------------
    TH_ID                                                                            TTHJL
    值应该没什么问题吧,能查出没有where条件第一条是第一天,今天和昨天都报告ORA-01403:未找到数据源了。
    就是单步跟踪到查询表名和字段名那行
      

  8.   


    没明白怎么所有列都有一条记录了呢?
    all_trigger_cols这个视图就是查询用户下都有多少触发器,触发器对应的表名与字段名等信息,触发器名也是唯一的啊。where 触发器名应该是得到一条吧