DECLARE
v_letter_c0 VARCHAR2(500) := 'c0';
v_new_letter;
BEGIN
FOR my_number IN 1..70
LOOP
FOR i IN (Select * From test_table)
LOOP
IF(my_number<=9) THEN
v_new_letter := v_letter_c0 || my_number;
UPDATE test_table y
SET y.v_new_letter = replace(i.v_new_letter, ' ', '')
WHERE y.v_new_letter = i.v_new_letter;
END IF;
END LOOP;
END LOOP;
END;
如何在v_new_letter中转换TEXT。因为我想将y.v_new_letter用于阅读。
对不起,我不怎么说得更准确。 但是我想说,UPDATE如何工作?
答案 0 :(得分:0)
从您的描述中不清楚您尝试实现的目标,但您似乎正在尝试替换v_new_letter
中的空格。
您不需要游标和所有循环,但可以在单个SQL语句中执行:
UPDATE test_table
SET v_new_letter = replace( v_new_letter, ' ', '');
您似乎正在尝试执行某些操作以匹配字符串c01
到c09
- 但这不会在您的查询中使用。也许是这样的:
UPDATE test_table
SET v_new_letter = replace( v_new_letter, ' ', '')
WHERE REGEXP_LIKE( v_new_letter, '^c0[1-9]$' );
或c01
到c70
:
UPDATE test_table
SET v_new_letter = replace( v_new_letter, ' ', '')
WHERE REGEXP_LIKE( v_new_letter, '^c(0[1-9]|[1-6]\d|70)$' );
但是,如果WHERE
子句匹配,那么它将永远不会有任何替换空间,因此不清楚你想要实现什么。
<强>更新强>:
根据您的评论,您希望使用动态SQL:
DECLARE
sql VARCHAR2(4000);
BEGIN
FOR my_number IN 1..70 LOOP
sql := 'UPDATE test_table'
|| ' SET c' || TO_CHAR( i, 'FM00' )
|| ' = replace( c' || TO_CHAR( i, 'FM00' ) || ', '' '' )';
EXECUTE IMMEDIATE sql;
END LOOP;
END;
/