在plsql中使用游标更新多条记录

Posted

技术标签:

【中文标题】在plsql中使用游标更新多条记录【英文标题】:Update multiple records using cursor in plsql 【发布时间】:2014-11-21 15:44:14 【问题描述】:

我对 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|'形式的字符串

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

如何确保游标中当前记录的每个输出值都不同?即如果在第一次迭代时 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

谢谢你的期待。

【问题讨论】:

使用implicit FOR LOOP CURSOR可以大大缩短代码。 【参考方案1】:

我认为问题在于您在第一次迭代期间覆盖了 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;

【讨论】:

以上是关于在plsql中使用游标更新多条记录的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL游标批量更新数据问题

循环遍历带有更新字段条件的游标 [PLSQL]

2018.5.30 Oracle数据库PLSQL编程---游标的使用

PLSQL游标笔记一

如何插入多条记录并获取标识值?

mysql游标的用法及作用