2017-06-21 76 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

是的,您是對的。非常感謝你!!! –