2

我将如何编写一个在选择 col 类型的循环的“in”子句中具有 select 的循环,varchar(10)然后将这些值插入到希望它们成为的 col 中varchar(9)?基本上我试图从一种精度“类型转换”到另一种精度,如果这有任何意义的话。例子:

FOR V_TEN IN (SELECT THIS_IS_VARCHAR_TEN FROM TABLE WHERE SOMETHING=’VALUE’)
LOOP
                INSERT INTO OTHER_TABLE
                (THIS_IS_VARCHAR_NINE)
                VALUES
                (V_TEN);
END LOOP;

错误是列类型不同。我试过看,to_char()cast()似乎都不是我想要的。我意识到这里有精度损失,我可以接受,因为我实际上知道varchar(10)列中的值总是 9 个字符。

4

3 回答 3

10

You are looking for the SUBSTR function.

Also, do not use PL/SQL for this, plain SQL will do and be faster.

 INSERT INTO OTHER_TABLE
   SELECT OTHER_COLUMN, SUBSTR(THIS_IS_VARCHAR_TEN,1,9) 
   FROM TABLE WHERE SOMETHING=’VALUE’;

And if there are really no values longer than nine character, you do not even need to call the substr function (it will be converted automatically, and raise an error if too long).

于 2010-02-01T02:50:02.613 回答
4

因为我实际上知道 varchar(10) 列中的值总是 9 个字符。

如果这是真的,那么您甚至不需要像其他人建议的那样使用 SUBSTR。

我相信您收到错误的原因是您试图插入 V_TEN 的值。当您使用类似的构造时FOR x IN (SELECT ...) LOOPx会隐式声明为记录类型。在您的情况下,它是只有一个字段的记录,但您仍然不能直接将其用作标量类型。

您只需要在插入中按名称引用记录的字段。

FOR V_TEN IN (SELECT THIS_IS_VARCHAR_TEN FROM TABLE WHERE SOMETHING=’VALUE’)
LOOP
                INSERT INTO OTHER_TABLE
                (THIS_IS_VARCHAR_NINE)
                VALUES
                (V_TEN.THIS_IS_VARCHAR_TEN);
END LOOP;

无论如何,正如 Thilo 指出的那样,根本没有理由在显式循环中执行此操作。只需将其编写为单个 INSERT ... SELECT。

于 2010-02-01T13:48:15.420 回答
1

利用:

FOR V_TEN IN (SELECT SUBSTR(t.this_is_varchar_ten, 1, 9)
                FROM TABLE t
               WHERE t.something = 'VALUE')
LOOP

  INSERT INTO OTHER_TABLE
    (THIS_IS_VARCHAR_NINE)
  VALUES
    (V_TEN);

END LOOP;

使用SUBSTR函数对 VARCHAR(10) 数据进行子串化,使其以 VARCHAR(9) 形式返回

于 2010-02-01T02:49:35.357 回答