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查询是能查询出来的并且只有一条,为什么存储过程中就出现这种情况呢?
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查询是能查询出来的并且只有一条,为什么存储过程中就出现这种情况呢?
解决方案 »
- 发现一个oracle诡异的bug
- oracle8.17将安装目录全拷贝后恢复出错!
- between and
- 求救:连接数据库时出现问题
- 菜鸟问题
- C#中调用存储过程遇到ORA-12571: TNS:packet writer failure错误
- 什么是SAP?
- 请问Oracle中的空格函数和trim(' ')
- 刚安装完oracle8.17,如何登陆到Enterprise Mananger中
- 急:学习Orace的Portal功能,哪里可以下载到相关资料?
- 如何在本地机器上连接其他机器的oracle
- 高分求教Oracle笔试题目 -- 英文Math&Sentence Structure部分--看大家英文数学功底了
into S_COLUMN_NAME, S_TABLE_NAME
from all_trigger_cols
where TRIGGER_NAME = s_Trigger_name;你调试过s_Trigger_name的值是多少?
和你在PL/SQL DEV里运行的一样么?
调试了,值是一样的。调试时跟踪了s_Trigger_name值,传入的参数也是正确的,与直接写查询的where条件相同,但是得出的结果确实不同的,不知道是不是Oracle系统视图有什么特殊机制,或者生命周期什么的
into S_COLUMN_NAME, S_TABLE_NAME
from all_trigger_cols
where TRIGGER_NAME = s_Trigger_name
AND ROWNUMBER<2 这样用吧 首先一般这个 TRIGGER_NAME 不可能只查出一条数据的
这个方法也用了,能查出来一条,但是那个数据不是我期望的,查出来那一条是不加where条件默认的第一条数据
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:未找到数据源了。
就是单步跟踪到查询表名和字段名那行
没明白怎么所有列都有一条记录了呢?
all_trigger_cols这个视图就是查询用户下都有多少触发器,触发器对应的表名与字段名等信息,触发器名也是唯一的啊。where 触发器名应该是得到一条吧