2013-08-19 2 views
0

Я пытаюсь использовать REGEXP_SUBSTR для обновления столбца в таблице, и я получаю сообщение об ошибке, отсутствующее.REGEXP_SUBSTR для обновления таблицы

UPDATE p_table SET f_name = SELECT REGEXP_SUBSTR ((SELECT user_name 
          FROM user_info 
         WHERE ROWID = R_ID ('user_info')), '[^ ]{1,15}', 1, 1) 
      FROM DUAL; 

Когда я добавляю скобки перед первым выбрать и после двойного он работает, но устанавливает все строки в этом столбце с тем же значением. Мне не нужны все, чтобы они были уникальными, но я не могу иметь их одинаковыми. Спасибо за любые советы, которые вы могли бы мне дать.

UPDATE p_table SET f_name = (SELECT REGEXP_SUBSTR ((SELECT user_name 
          FROM user_info 
         WHERE ROWID = R_ID ('user_info')), '[^ ]{1,15}', 1, 1) 
      FROM DUAL); 
+1

Это «,» после «1» на второй последней строке. Он ожидает, что еще что-то последует ... –

+1

Ваше выражение, кажется, немного пропало, но я думаю, что это было потеряно при копировании. Ваш подзапрос, похоже, не коррелирует с таблицей, которую вы обновляете; подзапрос будет генерировать одно значение (я думаю), поэтому все строки будут установлены в одно и то же значение. Как вы хотите генерировать значения - какова связь между этими двумя таблицами? –

+0

Спасибо, что поймали это. Я обновил приведенные выше заявления. – user2697655

ответ

0

Он делает то, что вы хотите, без подзапроса?

UPDATE p_table 
    SET f_name = (SELECT REGEXP_SUBSTR(user_name, '[^ ]{1,15}', 1, 1) 
        FROM user_info 
        WHERE ROWID = R_ID ('user_info') 
       ); 
+0

Нет, он просто обновляет все строки с одинаковым значением. Мне нужно, чтобы строки были в основном разными. Спасибо за вашу помощь. – user2697655

2

Как упоминалось в комментарии @PatrickMarchand Oracle оптимизирует запрос, поэтому ваша функция вызывается только один раз. AskTom article дает понять.

Чтобы получить обходной путь, вы должны ввести что-то, связанное с рядами p_table, в функциональные параметры, чтобы заставить Oracle вызвать его для каждой строки. Например rowid из p_table:

UPDATE p_table 
SET f_name = (
     SELECT 
     REGEXP_SUBSTR( 
      (SELECT user_name FROM user_info 
      WHERE ROWID = R_ID ('user_info', p_table.rowid) 
     ), 
      '[^ ]{1,15}', 1, 1 
     ) 
     FROM DUAL 
    ) 

SQLFiddle example.

+0

Спасибо за помощь. SQLFiddle и AskTom были очень полезны. – user2697655

Смежные вопросы