[Ora] DBMS_LOB.converttoclob в избранное  новое    подписка   модер. 
От: FunnyRabbit 
Дата: 18.08.06 09:59
Код такой.


PROCEDURE FILL_TEMPLATE (doc_id IN docs.ID%TYPE)
IS
   doc_row           docs%ROWTYPE;
   result_doc        CLOB               := EMPTY_CLOB;
   extension         VARCHAR2 (10)      := '';
   extention_error   EXCEPTION;
   PRAGMA EXCEPTION_INIT (extention_error, -987654);
   convert_warn      INTEGER;

   search_str        VARCHAR2 (20)      := 'ASD;
   replace_str       VARCHAR2 (30)      := 'DSA';
   dest_offset       INTEGER            := 1;
   src_offset        INTEGER            := 1;
   lang_context      INTEGER            := DBMS_LOB.default_lang_ctx;
   csid              INTEGER            := DBMS_LOB.default_csid;
BEGIN
   -- Get file info by id (doc_id - primary key)
   SELECT ID.*
     INTO doc_row
     FROM docs ID
    WHERE ID.ID = doc_id;

   extension := SUBSTR (doc_row.NAME, INSTR (doc_row.NAME, '.', -1));

   -- Now we check extension.
   IF LOWER (extension) != LOWER (file_extension)
   THEN
      RAISE extention_error;
   END IF;

   -- Convert BLOB to CBLOB.
   DBMS_LOB.converttoclob (result_doc,
                           doc_row.blob_content,
                           DBMS_LOB.getlength (doc_row.blob_content),
                           dest_offset,
                           src_offset,
                           csid,
                           lang_context,
                           convert_warn
                          );

   SELECT REPLACE (result_doc, search_str, replace_str)
     INTO result_doc
     FROM DUAL;

...
...
...

EXCEPTION
   WHEN extention_error
   THEN
      something;
   WHEN OTHERS
   THEN
      somthing;
END;


Так вот.
1. На строке DBMS_LOB.converttoclob(...) говорит "ORA-22275: неверно задан указатель LOB".
2. Можно ли через SELECT REPLACE заменить все вхождения строки А в строке Б в CLOB'е?

Вопрос риторический пока, т.к. ответ сам ищу пока.
То что меня не убивает, делает меня умнее.
Re: [Ora] DBMS_LOB.converttoclob в избранное  новое    модер. 
От: FunnyRabbit 
Дата: 18.08.06 10:04
Здравствуйте, FunnyRabbit, Вы писали:

FR>Вопрос риторический пока, т.к. ответ сам ищу пока.


А вот теперь не риторический. В чем причина ошибки ORA-22275? src_blob инициализируется. И по пункту 2 что скажете?
То что меня не убивает, делает меня умнее.
Re: [Ora] DBMS_LOB.converttoclob в избранное  новое    модер. 
От: Denis Popovhttp://denislpopov.narod.ru
Дата: 18.08.06 10:39
Вместо присвоения EMPTY_CLOB скажи c коде::
dbms_lob.createTemporary(result_doc, false);

А REPLACE в CLOB'е по-моему возможет с Oracle 10g.
Re[2]: [Ora] DBMS_LOB.converttoclob в избранное  новое    модер. 
От: Pruha 
Дата: 18.08.06 11:47
Здравствуйте, Denis Popov, Вы писали:

DP>Вместо присвоения EMPTY_CLOB скажи c коде::

DP>
DP>dbms_lob.createTemporary(result_doc, false);
DP>

А почему?
DP>А REPLACE в CLOB'е по-моему возможет с Oracle 10g.
А чем в 9-ке пользоваться?
Re[3]: [Ora] DBMS_LOB.converttoclob в избранное  новое    модер. 
От: Denis Popovhttp://denislpopov.narod.ru
Дата: 18.08.06 12:06
Здравствуйте, Pruha, Вы писали:

P>А почему?


Вот такая разница, http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14200/functions047.htm#sthref1323

Restriction on LOB Locators. You cannot use the locator returned from this function as a parameter to the DBMS_LOB package or the OCI.

SQL> declare c clob;
  2  begin
  3    c := empty_clob();
  4    dbms_lob.writeAppend(c, 1, 'X');
  5  end;
  6  /
declare c clob;
*
ERROR at line 1:
ORA-22275: invalid LOB locator specified
ORA-06512: at "SYS.DBMS_LOB", line 789
ORA-06512: at line 4


SQL> declare c clob;
  2  begin
  3    dbms_lob.createTemporary(c, false);
  4    dbms_lob.writeAppend(c, 1, 'X');
  5  end;
  6  /

PL/SQL procedure successfully completed.


DP>>А REPLACE в CLOB'е по-моему возможет с Oracle 10g.

P>А чем в 9-ке пользоваться?

Похоже, ошибся, REPLACE с CLOB'ами работает и в 9-ке, по крайней мере в 9.2

SQL> declare
  2    c clob;
  3    s varchar2(8) := '12345678';
  4    r clob;
  5  begin
  6    dbms_lob.createTemporary(c, false, dbms_lob.SESSION);
  7    for i in 1 .. 100 loop
  8      dbms_lob.writeAppend(c, length(s), s);
  9    end loop;
 10    r := replace(c, '1', 'q');
 11  end;
 12  /

PL/SQL procedure successfully completed.