当前位置: 代码迷 >> DB2 >> 存储过程调试,跪求解答解决思路
  详细解决方案

存储过程调试,跪求解答解决思路

热度:2880   发布时间:2013-02-26 00:00:00.0
存储过程调试,跪求解答
请教大家,我在toad里调试下面的存储过程,当执行EXECUTE IMMEDIATE v_insert_sql1就能插入数据,但是如果EXECUTE IMMEDIATE v_insert_sql 的话,就不能执行,我调试的时候,把光标放在v_insert_sql1这个变量上就有值,而放在v_insert_sql这个变量上就显示null,可是v_insert_sql就比v_insert_sql1多插了个字段而已阿,v_insert_sql的长度也足够长,这个是什么问题呢?跪求解答,谢谢大家

CREATE PROCEDURE "DB2INST1"."PRO_HIS_TRACE" ( OUT "O_INSER" VARCHAR(1024) )
  SPECIFIC "SQL110726174143300"
  LANGUAGE SQL
  NOT DETERMINISTIC
  COMMIT ON RETURN NO
  EXTERNAL ACTION
  MODIFIES SQL DATA
  CALLED ON NULL INPUT
  INHERIT SPECIAL REGISTERS
  OLD SAVEPOINT LEVEL
begin
  declare v_ship_id varchar(20);
  declare v_source_timestamp varchar(22);
  declare v_longitude decimal(9,6);
  declare v_latitude decimal(9,6);
  declare v_hcid varchar(64);
  declare v_insert_sql varchar(32000) default '';
  declare v_insert_sql1 varchar(1024) default '';
  declare v_insert_sql2 varchar(1024) default '';
  

  DECLARE SQLSTATE CHAR(5) DEFAULT '00000'; -- db2错误信息 
  DECLARE SQLCODE INT DEFAULT 0; -- db2错误代码 
  DECLARE SQLStmt varchar(1024) default '';
  declare v_err_no integer;
  DECLARE V_SQL_CODE INT DEFAULT 0;  
  DECLARE V_SQL_MSG VARCHAR(500) DEFAULT '';  
  DECLARE V_JOB_ROWS INT DEFAULT 0; 
  DECLARE V_SQL_STATE CHAR(5) DEFAULT '00000'; 

  DECLARE stmt STATEMENT;
  DECLARE c2 CURSOR WITH HOLD FOR stmt ;
  
  declare c1 cursor WITH HOLD for select a.ship_id,a.source_timestamp,a.LONGITUDE,a.LATITUDE from posit_realtime a left join his_trace b on a.ship_id=b.ship_id;

/* declare exit handler for sqlexception
  begin
  set v_err_no=sqlcode;
  rollback;
  end;*/
  DECLARE EXIT HANDLER FOR SQLEXCEPTION 
  H1:BEGIN 
  GET DIAGNOSTICS EXCEPTION 1 V_SQL_MSG = MESSAGE_TEXT; -- 捕获错误描述 
  SELECT SQLSTATE,SQLCODE INTO V_SQL_STATE,V_SQL_CODE FROM SYSIBM.SYSDUMMY1; -- 捕获错误信息及其代码  
  ROLLBACK; -- 回滚 
  END H1; 


 SET SQLStmt='select b.hcid from posit_realtime a left join his_voyagehistory b on a.ship_id=b.mmsi where a.ship_id=?';
  PREPARE stmt FROM SQLStmt;
  open c1;
  cursor1loop:
  loop
  fetch c1 into v_ship_id,v_source_timestamp,v_longitude,v_latitude;
  if sqlcode = 100 then 
  leave cursor1Loop;
  else
  OPEN c2 USING v_ship_id;
  FETCH c2 INTO v_hcid;
  set v_insert_sql='insert into his_trace(SHIP_ID,VOYAGE_ID,SOURCE_TIMESTAMP) values('||''''||v_ship_id||''''||','||null||','||''''||v_source_timestamp||''''||')';
  set v_insert_sql1='insert into his_trace(SHIP_ID,SOURCE_TIMESTAMP) values('||''''||v_ship_id||''''||','||''''||v_source_timestamp||''''||')';

  EXECUTE IMMEDIATE v_insert_sql1;
  commit;
  CLOSE c2;
  end if;
  end loop;
  close c1;
end;

------解决方案--------------------------------------------------------
你将NULL修改为空字符串,

select ', ' || null || ', '
看看结果
------解决方案--------------------------------------------------------
为null的时候,说明你不需要插入那个字段,插入语句里直接忽略这个字段
  相关解决方案