ORA-06502在通过ORACLE DBMS_HS_PASSTHROUGH查询AS400表时比较ORA-06502的Number数据类型

时间:2014-05-15 04:58:07

标签: sql oracle db2-400

我正在尝试使用oracle数据库中的DBMS_HS_PASSTHROUGH将日期为“YYYYMMDD”的数字格式转换为用户指定的日期,例如“过去7天/ 1个月数据”。

此查询在AS400上运行正常:

SELECT * FROM AGNTPF WHERE START_DATE >= DEC(REPLACE(CHAR(CURRENT_DATE - 1 MONTH, ISO), '-', ''), 8, 0) )

但是当我使用网关从oracle运行它时

declare ret integer; begin ret := dbms_hs_passthrough.execute_immediate@P400( 'create TABLE AGNTPF1 AS (SELECT * FROM AGNTPF WHERE START_DATE >= DEC(REPLACE(CHAR(CURRENT_DATE - 1 MONTH, ISO), '-', ''), 8, 0) ) with data'); end; / declare * ERROR at line 1: ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at line 4

此致

拉​​夫

1 个答案:

答案 0 :(得分:0)

我不知道db2400 / AS400,但对我来说,看起来你传递给你的程序的SQL语句缺少正确的报价转义。这应该有效:

declare
  ret integer;
begin
    ret := dbms_hs_passthrough.execute_immediate@P40(
            'create TABLE AGNTPF1 AS
            (SELECT * FROM AGNTPF WHERE START_DATE >= DEC(REPLACE(CHAR(CURRENT_DATE - 1 MONTH, ISO), ''-'', ''''), 8, 0) ) with data');
end;

或者,您可以使用着名的q运算符(此处,我使用竖线符号|来标记引用字符串的开头和结尾):

declare
  ret integer;
begin
    ret := dbms_hs_passthrough.execute_immediate@P40(
            q'|create TABLE AGNTPF1 AS
            (SELECT * FROM AGNTPF WHERE START_DATE >= DEC(REPLACE(CHAR(CURRENT_DATE - 1 MONTH, ISO), '-', ''), 8, 0) ) with data|');
end;