Ora-01427:
单个子查询返回多个行:select语句下面嵌套的select语句查询结果大于一行.
解决方法:将嵌套查询语句加上where rownum=1,附录有去重语句。
ora-01461:
仅能绑定要插入 LONG 列的 LONG 值:实际字符长度大于2000,字段被强转为CLOB。
解决办法:大多数时候是脏数据,处理掉即可。
Ora-01772:
一般是字符型转num型发生错误,
解决方法:新建FN_GETNUM函数(附在文档后),对照目标表,对原表VARCHAR类型、目标表为num类型的列执行该列。
原因二:子查询用到的字段为类型不对
原因三:decode函数使用时,decode(ziduan,1,’A’,2,’B’),此时ziduan为字符型。
Ora-01406:
提取的列值被截断。
解决办法:在视图里面substrb截取字段,或者在JOB里面将该字段放大。
Ora-01400
无法将 NULL 插入 ("GMC"."MDM_GY_BINGRENXX_ETL_TMP"."XINGMING"),有时候设置了where 字段 is not null,还是会有这个报错,有可能是字段是空格,加trim(字段名)就可以。
Ora-01438:ORA-01455:ora-01457
值大于为此列准备的最大精度 转换列溢出整数数据类型
解决办法:目前没有特别好的解决办法,需要排查。一般有两种情况,一是超精度,二是字符转数值时存在非数字字符。
Ora-29275:部分多字节字符
在认为有问题的字段 用 to_nchar("字段")转换
ORA-01858:
在要求输入数字处找到非数字字符:
解决办法:使用GETNUM函数(见附录)
Ora-04045:ora-01600:
在正式库里重新编译视图,待容灾库更新后重新同步。
Ora-01555:
一般是由于数据量过大,分批次ETL即可。
ora-04023:
视图失效,重建视图。
Ora-12154:
除了DS连不上,服务器,客户端都能正常连上。
解决方法:写成连接串形式即可。
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.2.125)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sjkhis)
)
)
cant resolve the proxy
临时文件夹失效,解决方法如下:
cd /home/dsadm/bidw/data/tmp
chmod -R 777 tmp
表对表插入慢
将extended置空
9080端口无效
大多数时候时某个服务掉了,重启即可。
cannot convert to framework type xx
查看后面的字符,看是哪两个字段进行转换时出了问题。曾经遇到这个问题,是某日期字段里有脏数据,虽然在视图里,在ds里分别设置为date,timestamp,还是报了datetime-string错误。
Replace替换’
方法一:chr(39)
方法二:’’(这里第一个是转义字符,第二个代表引号)
The input schema column HUIYINQK is not used and the connector is configured to stop when unused columns are detected in the input schema.
意为输出列里面有,但是查询里SQL没有HUIYINQK。
解决办法:将该字段添加进去即可。
The record is too big to fit in a block
在参数里面将APT_DEFAULT_TRANSPORT_BLOCK_SIZE放大
主键派生值错误:
输入与输出值之间命名存在冲突。一般是映射里面有字段对应不上。
解决办法:去控件里面查找红色的字段,修改。
遇到目录相关问题,首先检查目录有没有授权。
Unrecognized argument: variant:11g
一般是缺少参数,例如起始日期,时间段等等
CLOB字段的问题
将入库改成delete then insert。(此方法有一定危险,不推荐,有其他方法更好)
CLOB字段混淆问题
解决方法:在update语句里面加上如下标红字段。
The connector could not find the specified file:
一般是由于后面有目标库控件中某个选项否被改成了是。
RECEIVED SIGNAL SIGABRT
Removing the NLS map, or setting the array and transaction sizes
to one will eliminate the problem, however this will not be a
valid solution if these values are required
SQLSERVER调试常用函数:
JIESUANRQ between convert(datetime,'#ETL_DATE_A#'+' 00:00:00') AND convert(datetime,'#ETL_DATE_B#'+' 23:59:59')
FASHENGRQ >= convert(datetime,'#$START_TIME#') - #$EXTRACT_DAYS#
MYSQL调试常用函数:
jilusj >= cast(concat(STR_TO_DATE('#$START_TIME#','%Y-%m-%d %H:%i:%s')) AS DATETIME) - interval '6' DAY
inp_patient.IP_Admit_Time BETWEEN cast(concat(STR_TO_DATE('#ETL_DATE_A#','%Y%m%d'),' 00:00:00') AS DATETIME) AND cast(concat(STR_TO_DATE('#ETL_DATE_B#','%Y%m%d'),' 23:59:59') AS DATETIME)
.so文件的软连接错误
报错查不到该文件。
一般情况下两个问题:1.缺失文件
2.该文件没有权限。
经检查,存在这个文件。那么即文件没有权限。
是用户映射问题。将dsadm等用户映射到root下即可解决问题。
国产数据库调试
解决办法:表名前加上库名
SELECT ID FROM 库名.表名
WHERE xiugaisj >= to_timestamp('#$START_TIME#'||' 00:00:00', 'yyyy-mm-dd hh24:mi:ss')- #$EXTRACT_DAYS#
附录
数值函数
create or replace function FN_GETNUM(num in varchar2)
return number AS
NUM_OUT number;
begin
begin
if num is not NULL then
select to_number(num)
into NUM_OUT
from dual A
where ROWNUM <=1;
else
NUM_OUT:=null;
end if ;
exception
when NO_DATA_FOUND then
begin
NUM_OUT:=null;
end;
when others then
BEGIN
NUM_OUT:=null;
end;
end;
return(NUM_OUT);
end;
/*日期字段不正确的转为空值*/
CREATE OR REPLACE FUNCTION GMC_FN_GETDATE(todate IN VARCHAR2)
RETURN date AS
DATE_OUT date;
BEGIN
BEGIN
IF todate IS NOT NULL THEN
SELECT to_date(todate,'yyyy-mm-dd')
INTO DATE_OUT
FROM dual A
WHERE ROWNUM <= 1 ;
ELSE
DATE_OUT := null;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
BEGIN
DATE_OUT := null;
END;
WHEN others THEN
BEGIN
DATE_OUT := null;
END;
END;
RETURN(DATE_OUT);
END;
/*精度问题*/
select
max(lengthb(GMC_FN_STRSPLIT(FUKESSSBZ,'.',1))) as ones,--小数前面的最大位数
max(lengthb(GMC_FN_STRSPLIT(FUKESSSBZ,'.',2))) as twos--小数后面的最大位数
from GMC_V_YCFBJ_CHANQIANSF
--查询字段某字符间隔第几位的字符
CREATE OR REPLACE FUNCTION GMC_FN_STRSPLIT(p_str IN VARCHAR2,
p_delimiter IN VARCHAR2,
p_index in INT) RETURN VARCHAR2 IS
j INT := 0;
i INT := 1;
str VARCHAR2(1000) := p_str;
resultstr VARCHAR2(1000);
BEGIN
WHILE i < p_index + 1 LOOPj := INSTR(str, p_delimiter, 1);
IF j < 1 THEN
resultstr := str;
EXIT;
END IF;
resultstr := SUBSTR(str, 1, j - 1);
str := SUBSTR(str, j + 1);
i := i + 1;
END LOOP;
if i < p_index then
resultstr := '';
end if;RETURN resultstr;
END;
日期函数
CREATE FUNCTION GMC_FN_GETDATE(todate IN VARCHAR2)
RETURN date AS
DATE_OUT date;
BEGIN
BEGIN
IF todate IS NOT NULL THEN
SELECT to_date(todate,'yyyy-mm-dd')
INTO DATE_OUT
FROM dual A
WHERE ROWNUM <= 1 ;
ELSE
DATE_OUT := null;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
BEGIN
DATE_OUT := null;
END;
WHEN others THEN
BEGIN
DATE_OUT := null;
END;
END;
RETURN(DATE_OUT);
END;
/*去重解决*/
delete from 表 a
where (a.Id,a.seq) in (select Id,seq from 表 group by Id,seq having count(*) > 1)
and rowid not in (select min(rowid) from 表 group by Id,seq having count(*)>1)
编译无效视图
create or replace procedure compile_invalid_views as
--编译某个用户下的无效视图
str_sql varchar2(200);
begin
for invalid_views in (select object_name from user_objects
where object_name like 'ODS%' or object_name like 'REPORT%' OR object_name LIKE 'BI%')
loop
str_sql := 'alter view '||invalid_views.object_name || ' compile';
begin
execute immediate str_sql;
exception
--When Others Then Null;
when OTHERS Then
dbms_output.put_line(sqlerrm);
end;
end loop;
end;
文章评论