2017-06-21 69 views
-2
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作为阅读。PL/SQL将VARCHAR2转换为行

对不起,我不怎么说得更准确。 但我想说,如何做更新将工作?

+1

请尽量更好地描述你需要做什么。一些示例数据和期望的结果(作为格式化文本)以及所需结果的扩展将是有用的。在这里你可以找到关于[问]和如何构建[mcve]的信息,这对于改善你的问题是有用的 – Aleksej

回答

0

从您的描述中,您试图实现的目标很不明确,但您似乎试图替换v_new_letter中的空格。

你不需要光标和所有的循环,但可以在一个单独的SQL语句做到这一点:

UPDATE test_table 
SET v_new_letter = replace(v_new_letter, ' ', ''); 

你似乎是试图做一些事情,通过c09c01匹配字符串 - 但这是不在您的查询中使用。也许是这样的:

UPDATE test_table 
SET v_new_letter = replace(v_new_letter, ' ', '') 
WHERE REGEXP_LIKE(v_new_letter, '^c0[1-9]$'); 

或为c01c70

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; 
/
+0

一个错误,例如在表格中的我有一些称为c01,c02等的列。这被称为“我”。并在点后列c01,c02等,但问题是,“一”后。我不知道如何插入c01,c02等,以便它们可读 –

+0

@Yeras_QazaQ已更新 – MT0

+0

是的,您是对的。非常感谢你!!! –