Jodbc works with LOB columns?

Hi,
I would like to now if the jodbc drivers (thin and/or OCI) work
with LOB columns.
Browsing the generic Server 804 docs in Oracle Technet site, I
read that jodbc thin drivers don't, but that the OCI drivers do.
But the jodbc.htm that camne with the 8.0.5 production release
for Linux doesn't mention LOB columns, only LONG and LONG RAW.
Was it just an oversight in the Oracle2Linux doc, or the jodbc
OCI driver for Linux really doesn work with LOBs? (or is the
generic docs wrong and none of the OCI driver work with LOBs?)
Anybody knows?
Any info would be greatly apreciated.
Leandro
null

The amount of data is not really material, in this type of decision, it is the way you would most often access the data that is important. If the lobs are larger than about 4K they will be stored out of line (in a separate table) anyway, with only lob pointers in the actual table. You could look at partitioning (probably a hash partition would work best) to deal with the amount of data.
If you mostly query for a single attribute (i.e. You access a persons photo hundreds of times a day, but only look for a finger print once or twice a day), then it may make sense to split the table into three.
However, if you most often need to pull all three attributes, then storing in a single table makes most sense. Particularly since you say you do not always have all three attributes for a given person. With three tables, you will always be outer joining.
HTH
John

Similar Messages

  • Protected memory exception during bulkcopy of table with LOB columns

    Hi,
    I'm using ADO BulkCopy to transfer data from a SqlServer database to Oracle. In some cases, and it seems to only happen on some tables with LOB columns, I get the following exception:
    System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
    at Oracle.DataAccess.Client.OpsBC.Load(IntPtr opsConCtx, OPOBulkCopyValCtx* pOPOBulkCopyValCtx, IntPtr pOpsErrCtx, Int32& pBadRowNum, Int32& pBadColNum, Int32 IsOraDataReader, IntPtr pOpsDacCtx, OpoMetValCtx* pOpoMetValCtx, OpoDacValCtx* pOpoDacValCtx)
    at Oracle.DataAccess.Client.OracleBulkCopy.PerformBulkCopy()
    at Oracle.DataAccess.Client.OracleBulkCopy.WriteDataSourceToServer()
    at Oracle.DataAccess.Client.OracleBulkCopy.WriteToServer(IDataReader reader)
    I'm not sure exactly what conditions trigger this exception; perhaps only when the LOB data is large enough?
    I'm using Oracle 11gR2.
    Has anyone seen this or have an idea how to solve it?
    If I catch the exception and attempt row-by-row copying, I then get "ILLEGAL COMMIT" exceptions.
    Thanks,
    Ben

    From the doc:
    Data Types Supported by Bulk Copy
    The data types supported by Bulk Copy are:
    ORA_SB4
    ORA_VARNUM
    ORA_FLOAT
    ORA_CHARN
    ORA_RAW
    ORA_BFLOAT
    ORA_BDOUBLE
    ORA_IBDOUBLE
    ORA_IBFLOAT
    ORA_DATE
    ORA_TIMESTAMP
    ORA_TIMESTAMP_TZ
    ORA_TIMESTAMP_LTZ
    ORA_INTERVAL_DS
    ORA_INTERVAL_YM
    I can't find any documentation on these datatypes (I'm guessing these are external datatype constants used by OCI??). This list suggests ADO.NET bulk copy of LOBs isn't supported at all (although it works fine most of the time), unless I'm misreading it.
    The remaining paragraphs don't appear to apply to me.
    Thanks,
    Ben

  • Working with Multi-column text in Illustrator CS6 - highly irritating! How do I do the following ...

    Hi ...
    I'm finding working with multi column\row text box ("table") in Illustrator CS6 really irritating and non-intuitive. Maybe just my ignorance but I can't find simple ways to do the following:
    1. Click in a different cell of the "table" to the one currently active. Cursor does not move to new cell. How do I move focus to a different cell?
    2. Begin entering text in an empty table - I can't get the cursor to appear, despite clicking inside cell area, on text box border etc.
    Is there any simple way to perform these basic, simple tasks?
    Thanks
    Richard

    In my quick test I was able to enter the text by beginning at the upper left of the box and clicking. When I entered the text it appeared in the first box. Then I was able to tab through to the other boxes.

  • When comparing database tables with lob columns via "Database diff" in different environments indexes are shown as different

    When using "Database diff" selecting other schemas only for compare own objects are shown too!Hi!
    For tables with lob columns (clob, blob, etc.) indexes with system names are automatically created per lob column.
    If I am on different database instances (eg. dev/test) these system names can differ and are shown as differences, but these is a false positive.
    Unfortunately there is now way to influence the index names.
    Any chance to fix this in sql developer?
    Best regards
    Torsten

    Only the Sql Dev team can respond to that question.
    Such indexes should ONLY be created by Oracle and should NOT be part of any DDL that you, the user, maintains outside the database since they will be created by Oracle when the table is created and will be named at that time.
    It is up to the Sql Dev team to decide whether to deal with that issue and how to deal with it.

  • Oracle 11.2 - Perform parallel DML on a non partitioned table with LOB column

    Hi,
    Since I wanted to demonstrate new Oracle 12c enhancements on SecureFiles, I tried to use PDML statements on a non partitioned table with LOB column, in both Oracle 11g and Oracle 12c releases. The Oracle 11.2 SecureFiles and Large Objects Developer's Guide of January 2013 clearly says:
    Parallel execution of the following DML operations on tables with LOB columns is supported. These operations run in parallel execution mode only when performed on a partitioned table. DML statements on non-partitioned tables with LOB columns continue to execute in serial execution mode.
    INSERT AS SELECT
    CREATE TABLE AS SELECT
    DELETE
    UPDATE
    MERGE (conditional UPDATE and INSERT)
    Multi-table INSERT
    So I created and populated a simple table with a BLOB column:
    SQL> CREATE TABLE T1 (A BLOB);
    Table created.
    Then, I tried to see the execution plan of a parallel DELETE:
    SQL> EXPLAIN PLAN FOR
      2  delete /*+parallel (t1,8) */ from t1;
    Explained.
    SQL> select * from table(dbms_xplan.display);
    PLAN_TABLE_OUTPUT
    Plan hash value: 3718066193
    | Id  | Operation             | Name     | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
    |   0 | DELETE STATEMENT      |          |  2048 |     2   (0)| 00:00:01 |        |      |            |
    |   1 |  DELETE               | T1       |       |            |          |        |      |            |
    |   2 |   PX COORDINATOR      |          |       |            |          |        |      |            |
    |   3 |    PX SEND QC (RANDOM)| :TQ10000 |  2048 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
    |   4 |     PX BLOCK ITERATOR |          |  2048 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |            |
    |   5 |      TABLE ACCESS FULL| T1       |  2048 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
    PLAN_TABLE_OUTPUT
    Note
       - dynamic sampling used for this statement (level=2)
    And I finished by executing the statement.
    SQL> commit;
    Commit complete.
    SQL> alter session enable parallel dml;
    Session altered.
    SQL> delete /*+parallel (t1,8) */ from t1;
    2048 rows deleted.
    As we can see, the statement has been run as parallel:
    SQL> select * from v$pq_sesstat;
    STATISTIC                      LAST_QUERY SESSION_TOTAL
    Queries Parallelized                    1             1
    DML Parallelized                        0             0
    DDL Parallelized                        0             0
    DFO Trees                               1             1
    Server Threads                          5             0
    Allocation Height                       5             0
    Allocation Width                        1             0
    Local Msgs Sent                        55            55
    Distr Msgs Sent                         0             0
    Local Msgs Recv'd                      55            55
    Distr Msgs Recv'd                       0             0
    11 rows selected.
    Is it normal ? It is not supposed to be supported on Oracle 11g with non-partitioned table containing LOB column....
    Thank you for your help.
    Michael

    Yes I did it. I tried with force parallel dml, and that is the results on my 12c DB, with the non partitionned and SecureFiles LOB column.
    SQL> explain plan for delete from t1;
    Explained.
    | Id  | Operation             | Name     | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
    |   0 | DELETE STATEMENT      |          |     4 |     2   (0)| 00:00:01 |        |      |            |
    |   1 |  DELETE               | T1       |       |            |          |        |      |            |
    |   2 |   PX COORDINATOR      |          |       |            |          |        |      |            |
    |   3 |    PX SEND QC (RANDOM)| :TQ10000 |     4 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
    |   4 |     PX BLOCK ITERATOR |          |     4 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |            |
    |   5 |      TABLE ACCESS FULL| T1       |     4 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
    The DELETE is not performed in Parallel.
    I tried with another statement :
    SQL> explain plan for
    2        insert into t1 select * from t1;
    Here are the results:
    11g
    | Id  | Operation                | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
    |   0 | INSERT STATEMENT         |          |     4 |  8008 |     2   (0)| 00:00:01 |        |      |            |
    |   1 |  LOAD TABLE CONVENTIONAL | T1       |       |       |            |          |        |      |            |
    |   2 |   PX COORDINATOR         |          |       |       |            |          |        |      |            |
    |   3 |    PX SEND QC (RANDOM)   | :TQ10000 |     4 |  8008 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
    |   4 |     PX BLOCK ITERATOR    |          |     4 |  8008 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |            |
    |   5 |      TABLE ACCESS FULL   | T1       |     4 |  8008 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
    12c
    | Id  | Operation                          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
    |   0 | INSERT STATEMENT                   |          |     4 |  8008 |     2   (0)| 00:00:01 |        |      |            |
    |   1 |  PX COORDINATOR                    |          |       |       |            |          |        |      |            |
    |   2 |   PX SEND QC (RANDOM)              | :TQ10000 |     4 |  8008 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
    |   3 |    LOAD AS SELECT                  | T1       |       |       |            |          |  Q1,00 | PCWP |            |
    |   4 |     OPTIMIZER STATISTICS GATHERING |          |     4 |  8008 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
    |   5 |      PX BLOCK ITERATOR             |          |     4 |  8008 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |            |
    It seems that the DELETE statement has problems but not the INSERT AS SELECT !

  • ASSM and table with LOB column

    I have a tablespace created with ASSM option. I've heard about that tables with LOB columns can't take the advantage of ASSM.
    I made a test : create a table T with BLOB column in a ASSM tablespace. I succeeded!
    Now I have some questions:
    1. Since the segments of table T can't use ASSM to manage its blocks, what's the actrual approach? The traditional freelists??
    2. Will there be some bad impacts on the usage of the tablespace if table T becomes larger and larger and is used frequently?
    Thanks in advance.

    Can you explain what you mean by #1 because I believe it is incorrect and it does not make sense in my personal opinion. You can create a table in an ASSM tablespace that has a LOB column from 9iR2 on I believe (could be wrong). LOBs don't follow the traditional PCTFREE/PCTUSED scenario. They allocate data in what are called "chunks" that you can define at the time you create the table. In fact I think the new SECUREFILE LOBs actually require ASSM tablespaces.
    HTH!

  • Export table with LOB column

    Hi!
    I have to export table with lob column (3 GB is the size of lob segment) and then drop that lob column from table. Table has about 350k rows.
    (I was thinking) - I have to:
    1. create new tablespace
    2. create copy of my table with CTAS in new tablespace
    3. alter new table to be NOLOGGING
    4. insert all rows from original table with APPEND hint
    5. export copy of table using transport tablespace feature
    6. drop newly created tablespace
    7. drop lob column and rebuild original table
    DB is Oracle 9.2.0.6.0.
    UNDO tablespace limited on 2GB with retention 10800 secs.
    When I tried to insert rows to new table with /*+append*/ hint operation was very very slow so I canceled it.
    How much time should I expect for this operation to complete?
    Is my UNDO sufficient enough to avoid snapshot too old?
    What do you think?
    Thanks for your answers!
    Regards,
    Marko Sutic

    I've seen that document before I posted this question.
    Still I don't know what should I do. Look at this document - Doc ID:     281461.1
    From that document:
    FIX
    Although the performance of the export cannot be improved directly, possible
    alternative solutions are:
    +1. If not required, do not use LOB columns.+
    or:
    +2. Use Transport Tablespace export instead of full/user/table level export.+
    or:
    +3. Upgrade to Oracle10g and use Export DataPump and Import DataPump.+
    I just have to speed up CTAS little more somehow (maybe using parallel processing).
    Anyway thanks for suggestion.
    Regards,
    Marko

  • Table with LOB column

    Hi,
    I have a proble. How to move a table with LOB colum? How to create a table with LOB column by specifying another tablespace for LOB column?
    Please help me.
    Regards,
    Mathew

    What is it that you are not able to find?
    The link that I provided was answer to your second question.

  • Membership rules does not work with UDF column name having the max length

    Found a bug in OIM .
    Membership rules does not work with UDF column name having the maximum length
    Steps to Reproduce
    1.Create a UDF having max column name length for eg UDF_USR_PERSONAL_SUB_DOMAIN_CO (lable = Personal Code)
    2. Create a simple Rule like Personal Code = 7000
    3. Assign this Rule as a member ship rule of a Group.
    4. Create a user with Personal Code = 7000.
    5. User doesnot get the group membership.
    Thanks
    Suren

    Yes , i verified logs as well .
    If you just decrease the column name length , w/o making change to any other attributes , it starts working ..
    Thanks
    Suren

  • Shrink table with LOB column

    Hello,
    I have a table with 1.000.000 BLOB records. I updated almost a half of the records with NULL. Now I try to reclaim the free space using:
    ALTER TABLE table MODIFY LOB (column) (SHRINK SPACE);
    It's still running from some time, but what I am surprised about is that this operation generates a lot of redo logs (the full table had 30Gb, after the update it should have 15Gb, and by now I already have about 8Gb of generated archive logs).
    Do you know why this operation generates redo logs?
    Thank you,
    Adrian

    The REDO stream that Oracle generates is full of physical addresses (i.e. ROWIDs). If you run an update statement
    UPDATE some_table
      SET some_column = 4
    WHERE some_key = 12345;Oracle actually records in the REDO the logical equivalent of
    UPDATE some_table
      SET some_column = 4
    WHERE ROWID = <<some ROWID>>That is, Oracle converts your logical SQL statement into a series of updates to a series of physical addresses. That's a really helpful thing if the REDO has to be re-applied at a later date because Oracle doesn't have to do all the work of processing the logical SQL statement again (this would be particularly useful if your UPDATE statement were running a bunch of queries that took minutes or hours to return).
    But that means that if you are physically moving rows around, you have to record that fact in the redo stream. Otherwise, if you had to re-apply the redo information (or undo information) in the future, the physical addresses stored in the redo logs may not match the physical addresses in the database. That is, if you move the row with SOME_KEY = 12345 from ROWID A to ROWID B and move the row with SOME_KEY = 67890 from ROWID C to ROWID A, you have to record both of those moves in the redo stream so that the statement
    UPDATE some_table
      SET some_column = 4
    WHERE ROWID = <<ROWID A>>updates the correct row.
    Justin

  • How can I work with report columns in computation or validation?

    Hi all,
    I have an updateable report. Bevor submitting canges, I want to do computation or validation on one of the report columns. But a report column is not an item. Is there a possibility to work with report colums?
    Thanks, Daniela

    Hi Daniela,
    Presumably, your tabular form has been created using the wizard?
    If so, you might like to slightly change your SQL statement to allow you to access the "display only" columns in the collection.
    When you have time, you should have a look at the HTMLDB_ITEM package api documentation as this explains how you can manually construct a tabular form. But for now, for the "display only" column, you need to do something like:
    select
    other fields,
    HTMLDB_ITEM.DISPLAY_AND_SAVE(n,fieldname) columnheading
    FROM table
    where "n" is a column number - this will become G_F0n in the collection. You should ensure that you use a number that is not being used by an editable field - if you're not sure, do a View Source on a rendered page, and look for name="f01", name="f02" etc - these are the column numbers, pick one that isn't used for your new column.
    The documentation says, for DISPLAY_AND_SAVE: "Use this function to display an item as text, but save its value to session state." so this sounds exactly what you need.
    Regards
    Andy

  • Conflict resolution for a table with LOB column ...

    Hi,
    I was hoping for some guidance or advice on how to handle conflict resolution for a table with a LOB column.
    Basically, I had intended to handle the conflict resolution using the MAXIMUM prebuilt update conflict handler. I also store
    the 'update' transaction time in the same table and was planning to use this as the resolution column to resolve the conflict.
    I see however these prebuilt conflict handlers do not support LOB columns. I assume therefore I need to code a customer handler
    to do this for me. I'm not sure exactly what my custom handler needs to do though! Any guidance or links to similar examples would
    be very much appreciated.

    Hi,
    I have been unable to make any progress on this issue. I have made use of prebuilt update handlers with no problems
    before but I just don't know how to resolve these conflicts for LOB columns using custom handlers. I have some questions
    which I hope make sense and are relevant:
    1.Does an apply process detect update conflicts on LOB columns?
    2.If I need to create a custom update/error handler to resolve this, should I create a prebuilt update handler for non-LOB columns
    in the table and then a separate one for the LOB columns OR is it best just to code a single custom handler for ALL columns?
    3.In my custom handler, I assume I will need to use the resolution column to decide whether or not to resolve the conflict in favour of the LCR
    but how do I compare the new value in the LCR with that in the destination database? I mean how do I access the current value in the destination
    database from the custom handler?
    4.Finally, if I need to resolve in favour of the LCR, do I need to call something specific for LOB related columns compared to non-LOB columns?
    Any help with these would be very much appreciated or even if someone can direct me to documentation or other links that would be good too.
    Thanks again.

  • Add columns to a table with lob column

    Hi,
    Just a quick question: is there a performance penalty after adding columns to a table with a lob fied? the lob field is now the last column in the table and via via I was told that adding columns will impact badly the IO performance on the table if the lob field isn't anymore the last column. The table is on a Oracle 10.2.0.3 version.
    thanks. regards
    Ivan

    Havent heard of performance degradation specifically due to a LOB column not being the last column in a table (although there are several issues with just having a LOB column in a table).
    You may want to build a test database to test it out. It should be easy to run tests comparing one with the additional column and one the original to prove or refute it. The results would be interesting to learn - please post them up if you intend to test it out.

  • Working with Boolean Column in jTable

    I have generated a jTable on runtime. I have created an object of DefaultTableModel and used it to create the jTable.
    DefaultTableModel model = (new DefaultTableModel(
    new Object[][]{},
    new String[]{
    "SELECT", "SERVER"
    Class[] types = new Class[]{
    java.lang.Boolean.class, java.lang.Object.class
    boolean[] canEdit = new boolean [] {
    true, false
    public Class getColumnClass(int columnIndex) {
    return types[columnIndex];
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    return canEdit [columnIndex];
    jTable table = new jTable(model);
    This creates a table with two columns. First one is a Boolean and the second one is a String. Boolean by default appears as check boxes. The first column is editable and the second is not.
    My problem is:
    I want to call some method when any of these checkboxes are selected.
    Hope to find some help very soon. Its a little urgent.
    Thanks in advance.

    Try writing your own cell renderer and editor.

  • Exact space occupied by a table with LOB column

    Hi Gurus,
    I need to check the exact amount of space used (in bytes or MB) by a table which is having a BLOB column.
    I tried the following query but it is not giving the proper usage.
    select segment_name , sum(bytes)
    from dba_extents
    where segment_type='TABLE'
    and segment_name in ('TEST_CLOB','TEST_BLOB','TEST_CLOB_ADV','TEST_BLOB_ADV')
    group by segment_name;
    I even tried the following stored procedure
    create or replace procedure sp_get_table_size (p_table_name varchar2)
    as
        l_segment_name          varchar2(30);
        l_segment_size_blocks   number;
        l_segment_size_bytes    number;
        l_used_blocks           number; 
        l_used_bytes            number; 
        l_expired_blocks        number; 
        l_expired_bytes         number; 
        l_unexpired_blocks      number; 
        l_unexpired_bytes       number; 
    begin
        select segment_name
        into l_segment_name
        from dba_lobs
        where table_name = p_table_name;
        dbms_output.put_line('Segment Name=' || l_segment_name);
        dbms_space.space_usage(
            segment_owner           => 'dldbo', 
            segment_name            => l_segment_name,
            segment_type            => 'LOB',
            partition_name          => NULL,
            segment_size_blocks     => l_segment_size_blocks,
            segment_size_bytes      => l_segment_size_bytes,
            used_blocks             => l_used_blocks,
            used_bytes              => l_used_bytes,
            expired_blocks          => l_expired_blocks,
            expired_bytes           => l_expired_bytes,
            unexpired_blocks        => l_unexpired_blocks,
            unexpired_bytes         => l_unexpired_bytes
        dbms_output.put_line('segment_size_blocks       => '||  l_segment_size_blocks);
        dbms_output.put_line('segment_size_bytes        => '||  l_segment_size_bytes);
        dbms_output.put_line('used_blocks               => '||  l_used_blocks);
        dbms_output.put_line('used_bytes                => '||  l_used_bytes);
        dbms_output.put_line('expired_blocks            => '||  l_expired_blocks);
        dbms_output.put_line('expired_bytes             => '||  l_expired_bytes);
        dbms_output.put_line('unexpired_blocks          => '||  l_unexpired_blocks);
        dbms_output.put_line('unexpired_bytes           => '||  l_unexpired_bytes);
    end sp_get_table_size;
    But it is giving the error
    Error starting at line 298 in command:
    exec sp_get_table_size ('TEST_CLOB_ADV')
    Error report:
    ORA-03213: Invalid Lob Segment Name for DBMS_SPACE package
    ORA-06512: at "SYS.DBMS_SPACE", line 210
    ORA-06512: at "SYS.SP_GET_TABLE_SIZE", line 20
    ORA-06512: at line 1
    03213. 00000 -  "Invalid Lob Segment Name for DBMS_SPACE package"
    *Cause:    The Lob Segment specified in the DBMS_SPACE operation does not
               exist.
    *Action:   Fix the Segment Specification
    Although the LOB section is specified in create table syntax.
    Please help.
    Thanks
    Amitava.

    Here is a query that I use, to associate space from all segments under s schema (LOBs, indexes, etc.) back to the tables they support:
    with schema as (select '&your_schema' as name from dual),
    segs_by_table as(
      select 'TABLE' seg_supertype, seg.segment_name as related_table, seg.* from dba_segments seg, schema where seg.owner = schema.name and seg.segment_type in ('TABLE','TABLE PARTITION','TABLE SUBPARTITION')
      union all
      select 'INDEX' seg_supertype, i.table_name as related_table, seg.* from dba_segments seg, dba_indexes i, schema where seg.owner = schema.name and seg.segment_type in ('INDEX','INDEX PARTITION','INDEX SUBPARTITION')
      and Seg.OWNER = i.owner and seg.segment_name = i.index_name
      union all
      select 'LOB' seg_supertype, lob.table_name as related_table, seg.* from dba_segments seg, dba_lobs lob, schema where seg.owner = schema.name and seg.segment_type in ('LOBSEGMENT','LOB PARTITION')
      and seg.OWNER = lob.owner and seg.segment_name = lob.segment_name
    union all
      select 'LOB' seg_supertype, lob.table_name as related_table, seg.* from dba_segments seg, dba_lobs lob, schema where seg.owner = schema.name and seg.segment_type in ('LOBINDEX')
    and seg.OWNER = lob.owner and seg.segment_name = lob.index_name
    select owner,related_table,
    segment_type,   segment_name , partition_name, blocks
    from segs_by_table, schema
    where owner = schema.name
    --and related_table like 'BLOB_TEST%'
    order by owner,related_table,  segment_type, segment_name;
    You can revise as needed to limit to a single table, to summarize, etc.
    Mike

Maybe you are looking for