Summarising without temporary tables

Can you please help me out with this question:
I have a table containing the following attributes and data:
EquipInfo(
EquipmentID Number,
AbnormalityID Number,
NumOfOccurances Number
I have the following data in the table:
EquipmentID     AbnormalityID          NumOfOccurances
     1          1               7
     1          8               3
     1          9               2
     2          4               8
     3          2               4
     3          4               1
Now I need a cursor that returns the following information:
EquipID     TotalAbn Description
1     12     7 of type 1, 3 of type 2, 2 of type 9
2     8     8 of type 4
3     5     4 of type 2, 1 of type 4
The restriction imposed was not to use temporary tables because the client doesn't permit us to interfere with their temporary tablespaces.
I need some guidance to proceed on accomplishing this objective using stored procedures and looping constructs available.
Can this be achieved using subqueries, CUBE/ROLLUP operations?
Can you please help me out on this issue?

The first two columns in your result set can be derived just using the SUM aggregrate function:
select equipmentid, sum(numofoccurances) totalabn
  from equipinfo
group by equipmentid;For the third column (description), you will need to write a PL/SQL function that takes an equipmentid as a parameter, loops through the associated rows and builds a string. Something like:
create or replace function ab_function
  (p_equipment_id in equipinfo.equipmentid%type)
  return varchar2
is
  v_result  varchar2(4000);
begin
  for r in (select numofoccurances, abnormalityid
              from equipinfo
             where equipmentid = p_equipmentid) loop
    v_result := v_result || ', ' || r.numofoccurances || ' of type ' || r.abnormalityid;
  end loop
  return (ltrim(v_result, ', '));
end;
/And then refer to this function in your select:
select equipmentid, sum(numofoccurances) totalabn, ab_function(equipmentid) description
  from equipinfo
group by equipmentid;

Similar Messages

  • Please recommend if we have options to read xml file and insert data into table without a temporary table.

    Please recommend if we have options to read xml file and insert data into table without a temporary table. 

    DECLARE @data XML;
    SET @data =N'<Root>
    <List RecordID="946236" />
    <List RecordID="946237" />
    <List RecordID="946238" />
    <List RecordID="946239" />
    <List RecordID="946240" />
    </Root>'
    INSERT INTO t (id) SELECT T.customer.value('@RecordID', 'INT') AS id
    FROM @data.nodes('Root/List')
     AS T(customer);
    Best Regards,Uri Dimant SQL Server MVP,
    http://sqlblog.com/blogs/uri_dimant/
    MS SQL optimization: MS SQL Development and Optimization
    MS SQL Consulting:
    Large scale of database and data cleansing
    Remote DBA Services:
    Improves MS SQL Database Performance
    SQL Server Integration Services:
    Business Intelligence

  • Report: sorting of data and temporary table sorting

    We have a report that runs a procedure, which inserts data into a temporary table using the supplied parameters. The report then selects data from this table.
    Previously the report has always displayed data in the same order in which it was inserted into the table, even though no sorting is specified by the report itself. I realize that the report itself ought to specify the sorting in order to guarantee it, but this has worked in the past.
    As part of an application/Oracle upgrade the report has been recompiled. Data is now displayed in a different order as before. However, each time we run it now, it IS the same (new) sorting. So it's still consistent, but consistent in a different way than before.
    Is there some way to go back to the old sorting (display in same order as inserted into table) - without having to re-code this (and all the other) reports in order to specify the sorting? We think that data is still inserted into the temporary table in the same order as before. We are using the same version of Crystal Reports.
    Edited by: user489847 on May 31, 2010 4:01 AM

    Crystal Reports.This is the Oracle Reports forum.
    Anyway, I have seen this in one of our applications too. Suddenly the ordering was different, because there was no explicit order by. There is never a guarantee of the ordering if you do not specify it.
    You should ask this in the database forum too, since this is not really Reports related.

  • How to Use Temporary table on report builder

    Hi community!
    Well, i'm trying to build a temporary table based report in Oracle Report Builder. in "After Parameter Form Trigger" I've placed a stored procedure that populate a temporary table and I've based my report on it. The problem is Report shows no data. When i execute this procedure directly on database and i perform a select on my temporary table, it show all inserted data.
    I hope somebody can to help me because I tried many ways to build this report with my temporary table and always looks blank.

    Temporary tables are session specific.
    If particular session is closed then no data will be found on your temporary table in an another session.
    My suggestion is, on "After parameter form" trigger you directly populate the GTT without using procedure.
    Hope this will help.

  • How can i create a Global Temporary Table inside a Stored Procedure....

    Hi...
    I need to create a Global Temporary Table inside a Stored
    Procedure....
    I have no idea how to do that....
    Please....if u can send me a sample, send to me....
    Thanks a lot

    To create a global temporary table inside a stored procedure,
    the minimal syntax would be:
    CREATE OR REPLACE PROCEDURE procedure_name
    AS
    BEGIN
    EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE table_name'
    || '(column_name NUMBER)';
    END procedure_name;
    As Todd stated, it would probably be better to create the global
    temporary table outside of the procedure:
    SQL> CREATE GLOBAL TEMPORARY TABLE table_name
    2 (column_name NUMBER);
    Table created.
    You can also specify things like ON COMMIT PRESERVE ROWS or ON
    COMMIT DELETE ROWS.
    It may be that there is something else, like a PL/SQL table of
    records or a cursor, that would suit your needs better. It is
    difficult to guess without knowing what you want to do with it.

  • Temporary table in a pl/SQL block

    Hi all. I am in the process of learning PL/SQL and right now I focusing on Temporary Tables & PL/SQL blocks. without going into great detail I have created a cursor for loop that will retrive records from a table based on my criteria. I now need to insert this information into a temporary table. I am somewhat familiar on the usage of a temporary table by itself but I am confused by its usage in the PL/SQL block itself. For example, does it need to be declared?

    pl/SQl block or PL/SQl table(associate array) ?
    this example will help, if i got is correct
    SQL> declare
      2  cur_emp sys_refcursor;
      3  type t_obj is record( empno number, ename varchar2(25));
      4  type t_tab is table of t_obj index by binary_integer;
      5  tt t_tab;
      6  begin
      7   open cur_emp for
      8    select empno,ename from emp where deptno=10;
      9     loop
    10      fetch cur_emp BULK collect into tt;
    11      exit when cur_emp%notfound;
    12     end loop;
    13     for i in 1..tt.count loop
    14        dbms_output.put_line('empno :' ||tt(i).empno||'     ename  :'||tt(i).ename);
    15     end loop;
    16   end;
    17  /
    empno :7782     ename  :CLARK
    empno :7839     ename  :KING
    empno :7934     ename  :MI_LL_ER
    PL/SQL procedure successfully completed.

  • Doubt with Global Temporary table

    hi,
    i have created a global temporary table with ON COMMIT DELETE ROWS option. in my Function in a loop i m inserting values into this Table, after that loop closes and then i m selecting some other values from DB. and in the last i am returning a ref cursor which is selecting values from temporary table i hav created.
    now the thing is i m not getting any values in the cursor.
    later I have created the table with ON COMMIT PRESERVE ROWS option, in this case cursor returning values,
    can anyone explain me the functionality, as per my knowledge global temporary table values are session specific so why i m not getting the values in the 1st case when i used ON COMMIT DELETE ROWS (same session).
    Thanks
    Piyush

    Ok, here's a simple example, like we'd like to see from you not working....
    First create a GTT with ON COMMIT DELETE ROWS...
    SQL> ed
    Wrote file afiedt.buf
      1* create global temporary table mytable (x number) on commit delete rows
    SQL> /
    Table created.Now a simple function that populates the GTT and returns a ref cursor to the data without doing any commits (hence the data should be there!)
    SQL> ed
    Wrote file afiedt.buf
      1  create or replace function pop_table return sys_refcursor is
      2    v_rc sys_refcursor;
      3  begin
      4    insert into mytable
      5    select rownum from dual connect by rownum <= 10;
      6    OPEN v_rc FOR SELECT x FROM mytable;
      7    RETURN v_rc;
      8* end;
    SQL> /
    Function created.So now we call the function and get a reference to our ref cursor...
    SQL> var v_a refcursor;
    SQL> exec :v_a := pop_table();
    PL/SQL procedure successfully completed.So, in principle, because no commits have been issued the ref cursor should return data...
    SQL> print v_a;
             X
             1
             2
             3
             4
             5
             6
             7
             8
             9
            10
    10 rows selected.... which it does.
    Now, what happens if we do that again...
    SQL> commit;
    Commit complete.
    SQL> exec :v_a := pop_table();
    PL/SQL procedure successfully completed.... but this time we commit before retrieving the data...
    SQL> commit;
    Commit complete.
    SQL> print v_a;
    ERROR:
    ORA-00600: internal error code, arguments: [kcbz_check_objd_typ_1], [0], [0], [1], [], [], [], []
    no rows selected
    SQL>Oracle has (correctly) lost reference to the data because of the commit.
    So show us what yours is doing.

  • Query hint to force SQL to use a temporary table in a CTE query?

    Hi,
    is it possible to tell SQL Server to create a temporary table by itself when I'm using a CTE in my query?
    I have a query starting with a CTE where I group by my record, then another recursive CTE use the first CTE and finally my select statement like:
    with cte as (select a,b,c,row_number() ...  from mytable group by a,b,c)
    , cte2(select .... from cte A where rownum =1
    union all select ... from cte B inner join cte2 C on ......
    select * from cte2
    this query is very very slow, but if I store the first CTE into a temporary table and then cte2 consume my temp table rather than the CTE, the query is very fast.
    creating the temp table took 10sec and the select took 20sec
    while the initial query didnt return anything  after 2minutes!!!
    so what can I try to do to have the query running in less than 30sec without creating the temp table first?
    is there a query hint which can be used to tell SQL Server to convert the CTE into a temp table?
    as I have a lot of query to manage, I want to simplify my model without relying in temporary tables every time I suffer this issue...
    thanks.

    What is your SQL Server version?
    There is no hint to materialize results of cte into a temp table, so the solution you tried is the best you can have.
    I think the idea of materializing CTE into a temp table was already proposed on Connect. Try searching for this and vote.
    For every expert, there is an equal and opposite expert. - Becker's Law
    My blog
    My TechNet articles

  • How we cn avoid the sequence in remote tables through global temporary tabl

    Hi,
    We have table xx_interface_qualifiers in the remote db and we are inserting the data like this and its on a loop
    INSERT INTO xx_interface_qua
    (interface_id,
    list_line_interface_id, excluder_flag,
    qualifier_context, qualifier_attribute,
    qualifier_attr_value, qualifier_precedence,
    comparison_operator_code, start_date_active,
    end_date_active, list_header_name, list_line_no,
    creation_date, created_by, last_update_date,
    last_updated_by, interface_attribute1
    VALUES (xx_interface_qua_s.NEXTVAL,
    ttt, 'Y',
    xxx, xxx2,
    xxx3, xxx4,
    '=', SYSDATE,
    NULL, xxx4, -1,
    SYSDATE, '-1', SYSDATE,
    '-1', 44 );
    We are trying to avoid the hitting of the database every time for a sequence and try to implement the global temporary tables,i mean to say 1st we need to insert the data to TEMP table and then from temp table we cn inseert all the data to xx_interface_qual in a single shot to improve the performance.
    But how we cn avoid the sequence in this case as we do not know the sequence in remote side.
    Please suggest any other way to improve the performance.
    Regards
    Das

    797846 wrote:
    We have table xx_interface_qualifiers in the remote db and we are inserting the data like this and its on a loop
    We are trying to avoid the hitting of the database every time for a sequence and try to implement the global temporary tables,i mean to say 1st we need to insert the data to TEMP table and then from temp table we cn inseert all the data to xx_interface_qual in a single shot to improve the performance.
    But how we cn avoid the sequence in this case as we do not know the sequence in remote side.Does not make sense. I/O is the slowest database operation.
    You have an unknown performance problem (that you claim is due to a sequence, but failed to provide any evidence for). Now you want to create more I/O, by writing the data twice. Once into a temp table and then again into the destination table. And do that in order to increase performance?
    I do not see how this can solve the underlying, and unknown, performance issue that you claim exists.
    Any problem solution needs to start with correctly and comprehensively identifying the problem.
    You cannot solve a problem without first knowing WHAT the problem is.

  • Temporary Tables in Oracle

    Hi all,
    I am developing a .net application withe back end being oracle 10g. previously i worked with sql server 2005,2008 and i am new to oracle.
    i am working on a complex query which requiries, temporary table inside the procedure. In sql server easy to create and drop the temp table inside the proc.
    Can I use a Transaction specific GTT to store and process the temporary data inside my procedure??? My web application gets connected to the database through a one username and password. Since being a web applicatioin multiple users will execute the procedure at the same time, logged under the same username and password...
    I know its a coomon question, but i need it urgently..
    its very complicated to use WITH SELCT or inline views etc...
    Thank you,
    Kris.

    I know its a coomon question, but i need it urgently..If you know it is a common question then you should know the common answer. But let's rehearse it one more time.
    In Oracle temporary tables are permanent objects. It is only the data in them which is temporary. So for your scenario you shoudl have the DBA create the table once, like any other table.
    The trick with temporary tables is that each session sees its own data and nothing else. So your procedure can populate the table with data, process it and return it without a hitch.
    Since being a web applicatioin multiple users will execute the procedure at the same time, logged under the same username and password...Doesn't matter: the view of the data is controlled by session. So you haven't got a problem providing the table is populated and the resultset returned within a single call.
    its very complicated to use WITH SELCT or inline views etc...Yes it is hard. Fortunately CPUs keep getting more powerful and bandwidth keeps getting cheaper, so our systems continue to cope with the increasing amount of suck-y code being thrown at them. Isn't Moore's Law wonderful :)
    Cheers, APC
    blog: http://radiofreetooting.blogspot.com

  • Using temporary tables with a ref. cursor

    I want to use a temporary table to populate certain data and then return a ref cursor fetching data from the temporary table.
    1. Will this approach work ?
    2. Do I need to drop the temporary table ? Can I drop the table as a last statement in the stored proc (remember a ref cursor based on this table is to be returned as a out parameter).
    Please help.

    1. Will this approach work ?Sort of, just like it is possible to dig a trench with a spoon. It can be done, but why can't you just write a select that returns the data without storing intermediate versions of your processing somewhere.
    2. Do I need to drop the temporary table ?No. and you shouldn't.
    Can I drop the table as a last statement in the stored proc
    (remember a ref cursor based on this table is to be returned as a out parameter).No.
    If you really need to use a temporary table, it should be created one time when the application is installed, and should never be created in code.

  • Create Temporary Tables

    Hi, there.
    Can anybody tell me what's the syntax for the SQL statements to create temporary tables?
    I'm developing a shopping cart, and at the end of every purchase (checkout) I want to organize the items of the Session Bean Hash Table that contains them, and group them by category, brand, price and show the serial number of each item. I was thinking to do SQL-style operations like GROUP BY on the Hash Table itself, but I am having a hard time with it, so that's why I thought that filling a temporary database table with the Hash Table data could be the solution to the problem of grouping and ordering the items contained in the Shopping cart Bean.
    I saw the following code in this same forum:
    stmt = con.createStatement();
    stmt.executeUpdate("create table temp (slno integer, first_name varchar(32), middle_name varchar(1), last_name varchar(32))");
    But I don't understand how the temporary table has a fixed name, isn't that going to create conflict with another user that creates a temporary table with the same name but in a different session?
    I hope my approach makes sense. If so, what's the SQL syntax to create temporary-session-like tables so I can include it in my JDBC code?
    Thank you in advance for any information or alternative suggestion.

    But I don't understand how the temporary table has a
    fixed name, isn't that going to create conflict with
    another user that creates a temporary table with the
    same name but in a different session?Yes, it is. That's one reason why people try to avoid creating temporary tables, I suppose. There are other reasons.
    I hope my approach makes sense. If so, what's the SQL
    syntax to create temporary-session-like tables so I
    can include it in my JDBC code?You already know the syntax for creating a table. Your only problem is finding a unique name for the table, one that no other user will use. You could have a one-row one-column table with a number in it, which you read and increment, then use that number for your table name, for example. Unless your database happens to have this as a feature -- you would have to read its documentation to find that out.
    However as I implied before, you should try to avoid creating temporary tables. Creating a table is a time-consuming operation, and if your program ends abnormally without dropping the temporary table, your database slowly fills up with useless tables.

  • Question about temporary tables and imports.

    Hello everybody.
    Interesting one this. We have an application that uses global temporary tables. We refresh live to test using import of the application schema. I noticed when doing this yesterday that the temporary tables were being recreated in test as perminant rather than temporary.
    Is there a reason for this? Has anyone come across this before? Is there a way around it (apart from manual checking)?
    Many thanks
    Rup

    Could you specify how you found out that it is coming in as permanent?
    I believe exp/Imp will export and import it is Temporary table. I have just done a simple test to check and it works fine;
    Here is my test log:
    SQL> connect scott
    Enter password:
    Connected.
    SQL>SQL> CREATE GLOBAL TEMPORARY TABLE test_global
      2          (startdate DATE,
      3           enddate DATE,
      4           class CHAR(20))
      5        ON COMMIT DELETE ROWS;
    Table created.
    SQL>  select table_name,temporary from user_tables where table_name='TEST_GLOBAL';
    TABLE_NAME                     T
    TEST_GLOBAL                    Y
    SQL> select table_name,temporary from user_tables;
    TABLE_NAME                     T
    DEPT                           N
    EMP                            N
    BONUS                          N
    SALGRADE                       N
    TEST_GLOBAL                    Y
    SQL> exit
    Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
    With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
    C:\Documents\dbmsdirect\Testing\global>exp
    Export: Release 10.2.0.2.0 - Production on Wed Feb 20 12:18:45 2008
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    Username: scott
    Password:
    Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
    With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
    Enter array fetch buffer size: 4096 >
    Export file: EXPDAT.DMP > test_global
    (2)U(sers), or (3)T(ables): (2)U > t
    Export table data (yes/no): yes >
    Compress extents (yes/no): yes >
    Export done in WE8MSWIN1252 character set and AL16UTF16 NCHAR character set
    server uses AL32UTF8 character set (possible charset conversion)
    About to export specified tables via Conventional Path ...
    Table(T) or Partition(T:P) to be exported: (RETURN to quit) > test_global
    . . exporting table                    TEST_GLOBAL
    Table(T) or Partition(T:P) to be exported: (RETURN to quit) >
    Export terminated successfully without warnings.
    C:\Documents\dbmsdirect\Testing\global>sqlplus /nolog
    SQL*Plus: Release 10.2.0.2.0 - Production on Wed Feb 20 12:19:50 2008
    Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.
    SQL> connect scott
    Enter password:
    Connected.
    SQL> drop table test_global purge;
    Table dropped.
    SQL> exit
    Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
    With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
    C:\Documents\dbmsdirect\Testing\global>imp
    Import: Release 10.2.0.2.0 - Production on Wed Feb 20 12:20:19 2008
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    Username: scott
    Password:
    Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
    With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
    Import file: EXPDAT.DMP > test_global.DMP
    Enter insert buffer size (minimum is 8192) 30720>
    Export file created by EXPORT:V10.02.01 via conventional path
    import done in WE8MSWIN1252 character set and AL16UTF16 NCHAR character set
    import server uses AL32UTF8 character set (possible charset conversion)
    List contents of import file only (yes/no): no >
    Ignore create error due to object existence (yes/no): no >
    Import grants (yes/no): yes >
    Import table data (yes/no): yes >
    Import entire export file (yes/no): no > yes
    . importing SCOTT's objects into SCOTT
    . importing SCOTT's objects into SCOTT
    Import terminated successfully without warnings.
    C:\Documents\dbmsdirect\Testing\global>sqlplus /nolog
    SQL*Plus: Release 10.2.0.2.0 - Production on Wed Feb 20 12:22:44 2008
    Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.
    SQL> connect scott
    Enter password:
    Connected.
    SQL>
    SQL> select table_name,temporary from user_tables;
    TABLE_NAME                     T
    DEPT                           N
    EMP                            N
    BONUS                          N
    SALGRADE                       N
    TEST_GLOBAL                    Y
    SQL> insert into TEST_GLOBAL values (sysdate,sysdate,'test1');
    1 row created.
    SQL> select * from TEST_GLOBAL;
    STARTDATE ENDDATE   CLASS
    20-FEB-08 20-FEB-08 test1
    SQL> commit;
    Commit complete.
    SQL> select * from TEST_GLOBAL;
    no rows selected
    SQL>  select table_name,temporary from user_tables where table_name='TEST_GLOBAL';
    TABLE_NAME                     T
    TEST_GLOBAL                    Y
    SQL>

  • Create and insert into temporary table

    Dear all,
    I want to create an temporary table and insert data from select statement and order data by field in that table, at the end i want to drop temporary table.
    CURSOR rob_twin
    IS
    SELECT t.tarj, s.b24, date, status, fii, acnt, mbr, pviv, type
    FROM
    p6.tarj t
    p6.stb24 s
    p6.cuet c
    WHERE .......
    --now I want to create table and insert above data (from cursor rob_twin)
    --after that I need to order data by t.tary from new table
    --finally I want to drop this table
    Thank you for your help.
    Regards,
    Robert

    The point is in Oracle you do not create the temporary table at run-time, use it, and drop it again.
    But you can create a GTT (Global Temporary Table) once and then it stays in the data dictionary, just like a normal table. The "temporary" part is simply that the data is temporary, can only be seen in this one session, and will go away either on commit or when the session ends.
    So first you create a global temporary table with the columns you wish. Using either ON COMMIT DELETE ROWS or ON COMMIT PRESERVE ROWS you decide whether data in this GTT should survive across transactions or not.
    Your logic could then be to populate this GTT with data from your remote database using INSERT INTO gtt_table SELECT ... FROM ...@dblink
    Then work with that data in the GTT as you would with any normal local table
    And finally either you simply commit your transaction and the data in the GTT goes away (if you did ON COMMIT DELETE ROWS), or you just DELETE gtt_table.
    You do not continually create and drop a GTT. The table definition is permanent - it is only the data that is temporary.
    Edit:
    PS: As Karthick stated above - for almost any usual purposes it is likely to be possible to solve the problem without having to use GTT's. Usually even with db_links it can be done with suitable SQL and joins without having to use a GTT. But if that turns out to be one of those rare occasions where that is hard - then the above is the way to go ;-)
    Edited by: Kim Berg Hansen on Sep 19, 2011 1:38 PM

  • Temporary tables in import

    Hi,
    i am following the below metalink notes which suggest to export and import first without rows and change the nls_length_semantics from byte to char and import with data.
    but i can see around 72 temporary tables created and not delted. does import creates temporary tables? we have not created any idea about this?
    313175.1     SCRIPT: Changing columns to CHAR length semantics

    of course it is 10.2.0.4 on windows.
    it is not bin tables . these are actual tables suffixed with tmp say i have table called employees and i have two tables one is employees and another employeestmp.
    now i have actual table AHILFANALYSEZEIT2 but i have AHILFANALYSEZEIT2TMP "the syntax show below from TOAD"
    CREATE GLOBAL TEMPORARY TABLE AHILFANALYSEZEIT2TMP
    descipton)
    ON COMMIT PRESERVE ROWS
    NOCACHE
    /

Maybe you are looking for