PL / SQL将VARCHAR2转换为行

时间:2017-06-21 06:11:53

标签: sql oracle plsql

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如何工作?

1 个答案:

答案 0 :(得分:0)

从您的描述中不清楚您尝试实现的目标,但您似乎正在尝试替换v_new_letter中的空格。

您不需要游标和所有循环,但可以在单个SQL语句中执行:

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

您似乎正在尝试执行某些操作以匹配字符串c01c09 - 但这不会在您的查询中使用。也许是这样的:

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