使用plsql中的游标更新多个记录

时间:2014-11-21 15:44:14

标签: plsql oracle11g

我对PLSQL很新,所以请耐心等待。

我正在尝试动态地将字段值替换为字符串,并使用循环和游标显示值。我的代码如下:

DECLARE
  MSG VARCHAR2(500);
  SMS_TYPE VARCHAR(20);
  DDACDATE DATE;
  CUR SMSTYPE%ROWTYPE;

  CURSOR C_SMS IS 
  SELECT SMS_ID,COL_01,COL_02,COL_03,COL_04
  FROM SMS;-- FOR UPDATE OF SMS_CONTENT NOWAIT;
  REC_SMS C_SMS%ROWTYPE;
BEGIN

  SELECT * INTO CUR FROM SMSTYPE WHERE SMSTYPE_NAME = 'RENEWAL';

  MSG := CUR.SMSTYPE_MSG;

  OPEN C_SMS;
  LOOP
    FETCH C_SMS INTO REC_SMS;
    EXIT WHEN C_SMS%NOTFOUND; -- cursor attribute to exit when no rows found to fetch.
    MSG := REPLACE(MSG,'|INSURED|',REC_SMS.COL_01);
    MSG := REPLACE(MSG,'|PRODUCT|',REC_SMS.COL_02);
    MSG := REPLACE(MSG,'|POL_NO|',REC_SMS.COL_03);
    MSG := REPLACE(MSG,'|POL_TO_DT|',REC_SMS.COL_04);
    --UPDATE SMS SET SMS_CONTENT = MSG WHERE CURRENT OF C_SMS; --UPDATE DATABASE
    DBMS_OUTPUT.PUT_LINE(MSG);
  END LOOP;
  CLOSE C_SMS;

END;

MSG值是'|INSURED||PRODUCT||POL_NO||POL_TO_DT|'

形式的字符串

我的问题是,在循环的持续时间(即光标中的最后一条记录)中重复输出相同的值。 我已经注释掉了update语句,因为我为目标表中的所有记录重复了相同的值。

如何确保光标中当前记录的每个输出值都不同?即如果在第一次迭代时MSG在下一次迭代中为'ELLY SOAP 123 12-OCT-2014',则MSG应为'DAVE TOOTHBRUSH 342 13-OCT-2014'

如果我尝试使用

输出返回的值
 DBMS_OUTPUT.PUT_LINE(REC_SMS.COL_01)

而不是

 DBMS_OUTPUT.PUT_LINE(MSG);

我得到了所有独特的价值,即

ELLY
DAVE

感谢您的期待。

1 个答案:

答案 0 :(得分:1)

我认为问题在于你在firt迭代期间在MSG字符串中覆盖你的令牌(比如| INSURED |等)。

当第二个循环发生时,MSG不再是' | INSURED || PRODUCT || POL_NO || POL_TO_DT |'但是' ELLY SOAP 123 12-OCT-2014'

您需要在循环的每次迭代中将MSG重置为CUR.SMSTYPE_MSG,或者您需要使用临时变量。

尝试类似:

LOOP
    FETCH C_SMS INTO REC_SMS;
    EXIT WHEN C_SMS%NOTFOUND; -- cursor attribute to exit when no rows found to fetch.

    MSG := CUR.SMSTYPE_MSG;

    MSG := REPLACE(MSG,'|INSURED|',REC_SMS.COL_01);
    MSG := REPLACE(MSG,'|PRODUCT|',REC_SMS.COL_02);
    MSG := REPLACE(MSG,'|POL_NO|',REC_SMS.COL_03);
    MSG := REPLACE(MSG,'|POL_TO_DT|',REC_SMS.COL_04);
    --UPDATE SMS SET SMS_CONTENT = MSG WHERE CURRENT OF C_SMS; --UPDATE DATABASE
    DBMS_OUTPUT.PUT_LINE(MSG);
END LOOP;