我对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
感谢您的期待。
答案 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;