2012-12-04 130 views
1

我有一张表,有时会更新记录,错过'0'或几个连续的零。记录长度应该是小数点后的8位数(总共10个字符)。PLSQL和循环

例如 - 最初看起来像1.12345600会落得像1.123456

我做了一个脚本,检查所有的记录长度,并增加了各短于10个字符“0”记录的记录。

问题是它只添加一次'0'。上面的例子看起来像1.1234560,而不是我想要的1.12345600。 这是脚本:

DECLARE 

     CURSOR dif IS 
      SELECT CUST_CODE, CUST_ID, CONTRACT_NUM, MSISDN 
      FROM project1; 


BEGIN 

     FOR a in dif LOOP 

      IF LENGTH (a.CUST_CODE)<10 
      THEN 
      UPDATE project1 
      SET CUST_CODE=a.CUST_CODE||'0'  
      WHERE CUST_CODE=a.CUST_CODE; 
      END IF; 
     END LOOP; 
     commit; 

END; 

它完成运行后,单“0”被添加。如果我再次运行该脚本,它将为仍然少于10个字符的任何记录添加另一个“0”。有7个字符的Reocrds需要第三次运行。

我猜应该有另一个循环在某处继续检查记录,直到它达到所需的长度。 有什么想法?

回答

3

如果我是你,我会做一个单一的声明。

UPDATE project1 SET CUST_CODE=rpad(CUST_CODE, 10, '0'); 
+0

谢谢,的确更方便一些。我尝试着练习plsql,所以使用任何oppertunity来写东西,虽然看起来好像我最好先关注sql ... 谢谢 – Shlomix

0

如果你想与上面给出的SQL来实现它是最好的办法,但要通过PLSQL您需要更正你的逻辑来实现它。 您正在执行游标中重复记录的记录数的循环,然后将每个记录添加一个零,即'0',这正是您在代码中编写的内容。

如果您想让长度为10,则 按如下所示实施。

   IF LENGTH (a.CUST_CODE)<10 
     THEN 
     v_len = 10-length (a.cust_code-- declare a variable 
     for 
     i in 1..v_len 
     loop 
     v_pad=v_pad||'0'; 
     end loop; 
     UPDATE project1 
     SET CUST_CODE=a.CUST_CODE|| v_pad  
     WHERE CUST_CODE=a.CUST_CODE; 
     END IF; 

希望这将帮助你在PLSQL

0
DECLARE 

     CURSOR dif IS 
      SELECT CUST_CODE, CUST_ID, CONTRACT_NUM, MSISDN 
      FROM project1; 
v_temp number; 

BEGIN 

     FOR a in dif LOOP 
v_temp := 10-LENGTH (a.CUST_CODE) 
      IF LENGTH (a.CUST_CODE)<10 
      THEN 
      UPDATE project1 
      SET CUST_CODE=RPAD(a.CUST_CODE,v_temp,'0') ; 
      WHERE CUST_CODE=a.CUST_CODE; 
      END IF; 
     END LOOP; 
     commit; 

END; 

您可以使用上面的查询