REGEXP_SUBSTR更新表

时间:2013-08-19 20:00:02

标签: oracle oracle11g

我正在尝试使用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);

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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')
                 );