2013-07-26 2 views
3

Я пытаюсь создать файл спула через анонимный блок ниже, чтобы узнать мнения о конкретной таблице.Ошибка с типом данных LONG в курсоре

declare 
cursor c1 is select view_name,text from users_view; 
rt c1%rowtype; 
begin 
open c1; 
loop 
fetch c1 into rt; 
exit when c1%notfound; 
dbms_output.put_line(rt.view_name || '|' || rt.text); 
end loop; 
end; 

Когда я бегу, я получаю сообщение об ошибке, как «числовыми или значение ошибки», однако если удалить столбец текста (LONG) из определения курсора блок проходит без каких-либо ошибок.

Я понимаю, что мы не можем использовать тип данных LONG в предложении where, но не может ли он быть извлечен в курсоре? Если да, какова может быть альтернатива в этом случае?

+0

Это PL/SQL правильно? – Josien

+0

Длинный может быть выбран в курсоре, но получит эту ошибку, если она больше 32 тыс. Символов. Есть ли причина, по которой вы хотите сделать это внутри анонимного блока, а не как простой выбор? –

+0

«Рассматривать точки зрения для конкретной таблицы» означает, что вы планируете анализировать текст всего представления, чтобы найти ссылки внутри них в определенной таблице? –

ответ

2

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

select owner, type, name 
from all_dependencies 
where referenced_type = 'TABLE' 
and referenced_owner = user -- or a specific schema 
and referenced_name = '<my_table_name>'; 

Здесь также перечислены все триггеры на столе и т. Д., Поэтому, если вас интересует только просмотр, вы можете добавить and type = 'VIEW'.

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

+0

Я в конце концов получил это через dba_dependencies, но просто хотел понять эту ситуацию с курсором. – Baljeet

2

В этом случае ошибка указывает на то, что вы набрали ограничение на буфер - dbms_output.put_line не обрабатывают такой большой объем данных.

Рассмотрев проблему более внимательно, это не проблема dbms_output.put_line, еще нет, это, как указал Алекс Пул в комментарии к вашему вопросу, это проблема с курсором. Поэтому я предлагаю вам использовать простой оператор Select (вариант № 2 в ответе). Если вы идете на обходной путь

create table <<name>> as 
    select view_name 
     , to_lob(text) 
    from user_views 

, например, вы будете иметь возможность использовать курсор, но затем dbms_output.put_line остановит вас

Для создания файла очереди у вас есть по крайней мере два варианта:

  1. Используйте пакет UTL_FILE для записи данных в файл.
  2. Пусть SQL * PLUS выполнит эту работу. Например:

    set feedback off; 
    set termout off; 
    set colsep "|"; 
    set long 20000; -- increase the size if it's not enough 
    set heading off; 
    set linesize 150; -- increase the size if it's not enough 
    
    
    spool <<file path\file name>> 
    
    select view_name 
        , text 
        from user_views 
    
    spool off; 
    

В конце вы будете иметь такой же вывод в файл <<file path\file name>>:

ALL_APPLY_CONFLICT_COLUMNS |select c.object_owner, 
           |  c.object_name, 
           |  c.method_name, 
           |  c.resolution_column, c.column_name, 
           |  c.apply_database_link 
           | from all_tab_columns o, 
           |  dba_apply_conflict_columns c 
           | where c.object_owner = o.owner 
           | and c.object_name = o.table_name 
           | and c.column_name = o.column_name 
+0

Похоже, что это не с dbms_ouput, потому что я получаю ту же ошибку даже при замене ее на 'dbms_ouput.put_line ('hi')'. Всего около 300 записей, печать 300 раз не должна быть проблемой. Пожалуйста, порекомендуйте. – Baljeet

+1

@ iceman29 - буфер 'dbms_output' [неограничен] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_output.htm#CIHEGBBF), поскольку я думаю, что 10g, но максимальная строка размер по-прежнему будет проблемой; вы могли бы вывести «clob» в куски. Только если есть веская причина не использовать простой выбор, конечно, и если есть, то 'dbms_metadata.get_ddl' может быть более простым путем. –

+0

@AlexPoole Простой выбор не может использоваться, потому что долго не работает в where where (я читал об этом после того, как он не работал для меня). Пожалуйста, предложите, есть ли способ использовать его. – Baljeet

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