PL / SQL от varchar (10) до varchar (9) - PullRequest
       10

PL / SQL от varchar (10) до varchar (9)

2 голосов
/ 01 февраля 2010

Как мне написать цикл, у которого есть предложение в предложении in цикла, которое выбирает столбец типа varchar(10), но затем вставляет эти значения в столбец, который хочет, чтобы они были 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 символам.

Ответы [ 3 ]

10 голосов
/ 01 февраля 2010

Вы ищете функцию SUBSTR .

Кроме того, не используйте PL / SQL для этого, простой SQL будет работать быстрее.

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

И если на самом деле нет значений длиннее девяти символов, вам даже не нужно вызывать функцию substr (она будет преобразована автоматически и вызовет ошибку, если она слишком длинная).

4 голосов
/ 01 февраля 2010

так как я действительно знаю, что значения в столбце varchar (10) всегда будет 9 символов.

Если это правда, то вам даже не нужно использовать SUBSTR, как предлагали другие.

Я полагаю, что причина того, что вы получаете сообщение об ошибке, заключается в том, что вы пытаетесь вставить значение V_TEN. Когда вы используете такую ​​конструкцию, как FOR x IN (SELECT ...) LOOP, x неявно объявляется как тип записи. В вашем случае это запись только с одним полем, но вы все равно не можете использовать ее непосредственно как скалярный тип.

Вам просто нужно сослаться на поле записи по имени в вашей вставке.

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;

В любом случае, как указал Тило, нет никаких причин делать это в явном цикле вообще. Просто напишите это как одну вставку ... SELECT.

1 голос
/ 01 февраля 2010

Использование:

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...