0

大きな文字列(> 4Kb)でOracleClobフィールドを更新しようとしています。私はphpBB(3.0)のデータベース抽象化クラスを使用してクエリを実行しています。クエリは実際には4000文字を超えるクエリのコードで構成されています。ただし、以下のクエリを実行しようとすると、正規表現クラスは更新クエリをキャッチできません。この正規表現の何が問題になっているのか教えていただけますか。

$query = "UPDATE table_x
   SET id = '4',
       type_id = '77',
       holder = '99999',
       year = '2012',
       period = '1',
       rel_year = '2013',
       start = '14/01/2013',
       finish = '15/02/2013',
       total_days = '120',
       total_units = '1042',
       answered = '865',
       non_response = '174',
       na = '3',
       sent = '1',
       assessments = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse semper pulvinar nunc, nec fringilla mauris ultrices et. Mauris urna metus, laoreet quis viverra vel, venenatis in enim. Vivamus suscipit ultrices venenatis. Proin sed augue dolor. Donec quam magna, ornare eget varius quis, dignissim sed diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque convallis gravida augue, rutrum commodo lectus semper sit amet. Curabitur ac lorem non leo ultricies malesuada ut in leo. Ut vitae enim felis, at vehicula arcu.
Phasellus diam augue, molestie at adipiscing vitae, semper in massa. Suspendisse ac urna et sem vehicula fringilla id ac ligula. Nunc feugiat dolor nec leo mollis interdum. Nam consectetur, diam malesuada vestibulum rutrum, neque neque porttitor nisi, in molestie metus orci in mauris. Cras in est lectus, in luctus mi. Etiam suscipit elit et odio viverra nec vehicula orci cursus. Nullam ornare, arcu eget condimentum ullamcorper, nulla mauris rhoncus nisi, sed dapibus velit leo at nisi. Nullam interdum feugiat enim, ut vulputate enim fringilla mattis. Donec eget neque nisl, laoreet tincidunt ante. Etiam ac urna libero, nec suscipit mauris. Etiam ullamcorper, erat sed tempus aliquet, dui erat vehicula sem, et congue dolor elit malesuada justo. Nunc sodales ipsum at tellus posuere eu pretium elit mattis. Quisque velit sem, egestas et placerat quis, semper non arcu.
Ut dignissim adipiscing nunc, nec eleifend nisi tincidunt eu. Ut aliquet rhoncus cursus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis viverra dui sit amet ipsum lobortis ornare. Integer odio lacus, volutpat id euismod ut, tincidunt vitae nibh. Vivamus elit nisi, ornare et vulputate a, egestas et libero. Mauris eros urna, faucibus ut imperdiet ac, commodo in libero. Vestibulum ac tellus at nulla malesuada placerat nec tempus mauris. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris nulla ligula, tempor non congue non, dictum eget arcu. Donec et urna tortor. Pellentesque neque tortor, adipiscing id sodales condimentum, fringilla vel erat. Phasellus nibh magna, varius ut imperdiet sit amet, ultricies vitae eros. Aenean interdum luctus ipsum. Aenean mauris eros, accumsan eget auctor in, imperdiet ut arcu.
Donec aliquet sodales lorem eu varius. Nulla facilisi. Vestibulum ut dolor nisl. Fusce feugiat vulputate est, vel auctor lorem gravida eget. Ut nec aliquam lorem. Vestibulum mattis elit tortor. Praesent et rutrum metus.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed placerat sollicitudin mauris, et euismod ligula tincidunt sed. Nullam ut dui dolor, ut egestas augue. Curabitur eget ultrices nunc. Cras dapibus, metus at lobortis consectetur, sapien augue pharetra odio, a suscipit velit sem a tellus. Vivamus porttitor cursus magna at convallis. Vivamus neque justo, lobortis sit amet facilisis sed, auctor in justo. Phasellus venenatis felis at orci volutpat non viverra nisl ultricies. Sed sed lectus dui, a dignissim neque. Morbi posuere, dui nec varius laoreet, nunc velit tempor lacus, eget placerat nibh augue ac lacus. Sed mauris nulla, ultrices eget dignissim et, viverra sagittis justo. Suspendisse sem lorem, blandit nec pretium sed, tristique ac tellus. Sed vestibulum lorem sit amet odio scelerisque eu blandit nisl ornare. Pellentesque urna justo, condimentum a rutrum vitae, tincidunt at odio. Proin et est leo.
Nunc porta risus non erat sollicitudin tincidunt. Sed pellentesque varius risus mattis hendrerit. Donec nec ipsum ut sem aliquam lacinia lacinia eu libero. Nulla commodo tellus in lacus semper porta. Nulla eros odio, pulvinar non ultrices a, tempus hendrerit purus. Aliquam erat eros, lacinia non sodales a, varius at augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
Maecenas risus ante, sollicitudin molestie eleifend ut, vestibulum sit amet magna. Maecenas quis urna a augue facilisis tristique et eget lacus. Cras non augue ante. Vestibulum non rutrum nunc. Vivamus imperdiet, elit vitae convallis dictum, nisi magna rhoncus odio, nec ornare tortor dolor in magna. Sed accumsan, leo imperdiet tincidunt scelerisque, est arcu interdum nibh, id mattis quam mi in dui. Quisque vitae risus sagittis odio consequat varius. Etiam quis risus in magna pretium rutrum. Aenean ac elementum metus. Vestibulum a orci non nulla elementum tincidunt. Morbi '
 WHERE id = '20'";

if (preg_match_all('/^(UPDATE [\\w_]++\\s+SET )([\\w_]++\\s*=\\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]+)(?:,\\s*[\\w_]++\\s*=\\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]+))*+)\\s+(WHERE.*)$/s', $query, $data, PREG_SET_ORDER))
4

1 に答える 1

1

Oracle では、PL/SQL を使用しない限り、4000 文字を超える文字列を含む CLOB 列を変更できません。たとえば、CLOB 変数を定義し、文字列を変数に割り当ててから、DML を実行する必要があります。

DECLARE
  l_str CLOB;
BEGIN
  l_str := 'My really long string....';
  UPDATE table_x SET assessments = l_str WHERE id = 20;
  COMMIT; --Or not commit until your transaction is complete
END;

DML ステートメントが phpBB でどのように処理されるかについては詳しくありませんが、Oracle データベースでは、4000 文字を超える CLOB に PL/SQL を使用する必要があります。PL/SQL ブロックを として送信できるかどうかを確認してください$query

于 2013-03-07T19:37:40.773 に答える