1

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);
4

2 に答える 2

3

@PatrickMarchand のコメントで述べたように、Oracle はクエリを最適化するため、関数は 1 回だけ呼び出されます。AskTomの記事はそれを明確にしています。

回避策を得るには、p_table 行にリンクされたものを関数パラメーターに導入して、Oracle がすべての行に対してそれを呼び出すようにする必要があります。たとえばrowidp_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 の例

于 2013-08-20T05:23:55.797 に答える