在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中使用游标更新多条记录的主要内容,如果未能解决你的问题,请参考以下文章