我想要做一些數據的更新來更新內容如下:執行立即通過for循環
CREATE OR REPLACE PROCEDURE PROC_MDM_RUN_DATA_MAPPING
IS
sqlString VARCHAR2(2000) := '';
CURSOR csr_updates
IS
SELECT trim(table_name) AS table_name,
trim(column_name) AS column_name,
trim(old_value) AS old_value,
trim(new_value) AS new_value
FROM C_MDM_MAPPING_TABLE
WHERE area = 'MDM' and rownum < 10
AND run_update = 'Y' ;
BEGIN
FOR rec IN csr_updates
LOOP
BEGIN
sqlString := 'UPDATE ' || rec.table_name ||
' SET ' || rec.column_name || ' = ''' || rec.new_value || '''
WHERE TRIM(' || rec.column_name || ') = ''' || rec.old_value || ''';' ;
INSERT INTO C_MDM_ERROR_LOG (msg) VALUES (sqlString);
dbms_output.put_line(sqlString) ; -- works, giving correct SQL
execute immediate sqlString ; -- fails
END;
END LOOP;
COMMIT;
END PROC_MDM_RUN_DATA_MAPPING;
/
程序編譯,生成正確的SQL爲每個數據更新 - 下面的例子:
在需要下列之一時結束文件‘:UPDATE S_CFM_UNIVERSITY_ALL SET MASTER_UNI_NAME = 'Chung-Ang University'
WHERE TRIM(MASTER_UNI_NAME) = 'Chung Ang University';
但立即執行的語句給出了錯誤 「出現符號PLS-00103’:
; 符號「;」代替「文件結束」繼續。「
我試圖排除尾隨分號,但返回錯誤
ORA-00933: SQL command not properly ended
任何幫助表示讚賞,感謝。
與執行立即使用時,您不需要的SqlString分號,你確定你的光標查詢所有列的返回值?可能有一個空值的行並導致sql命令沒有正確結束錯誤 – 2013-03-22 03:00:07
是的,rs是對的。刪除動態SQL字符串中的';',你會沒事的。 – Rachcha 2013-03-22 03:04:53
感謝rs - 所有列都返回值,但一些值包含單引號,我需要檢查 – acutesoftware 2013-03-22 03:06:49