What is the best (global temporary Table or tables of Type Object)

Dear all,

I'll try to refine some code and find that we have a large loop that goes to loop over 100000 times and for each record, it in turn for validation of controls in individual tables.

I intend to implement all of the functionality of controls using join conditions. I.e. to empty all the data into a global temporary table or tables oracle object type and apply the conditions of verification using join operations, so that I can avoid the unnecessary check for each record.

If I want to implement this, I want to know what is best. A global temporary table or the Oracle Tables nested.

Appreciate your response.

Thank you
MK.

If you mean a global temporary table vs a variable from PL/SQL grouping, then 100 + lines is a lot to store in session memory a GTT would be so a more scalable solution. It will give you more options to manipulate the data using SQL.

Note that a 'table of type object', or 'table object type' can mean a table of database (no PL/SQL) for example "CREATE TABLE MyTable mytype". However, I don't think you mean that.

Tags: Database

Similar Questions

  • What are the best practices for creating only time data types, and not the Date

    Hi gurus,

    We use 12 c DB and we have a requirement to create the column with datatype of time only, if someone please describe what are the best practices for the creation of this.

    I would strongly appreciate ideas and suggestions.

    Kind regards
    Ranjan

    Hello

    How do you intend to use the time?

    If you are going to combine with DATEs or timestamps from a other source, then an INTERVAL DAY TO SECOND or NUMBER may be better.

    Will you need to perform arithmetic operations on time, for example, increase the time to 20%, or take an average?   If so, the NUMBER would be preferable.

    You are just going to display it?  In this case, DAY INTERVAL in SECONDS, DATE or VARCHAR2 would work.

    As Blushadow said, it depends.

  • declare a global temporary table

    Hello
    can I use the declare global temporary table (...) ststement of pl/sql, I need a temporary table for the current session.


    If not, what should be the alternative?

    Thank you...

    Published by: Amoeba on 23 August 2012 13:39

    Published by: Amoeba on 23 August 2012 13:41

    Hello

    >
    can I use declare global temporary table (...) as ststement of pl/sql, like I need a temporary table for the current session.

    If not, what should be the alternative?

    Thank you...
    >
    This query actually belongs to SQL and PL/SQL Forum. Please take care and post in the correct forum.

    In any case...
    CREATE TABLE TEMPORARY global is a DDL command. Once created TWGS will exist until he FELL. Try to create a TWG with the same name will fail. just like any table, view, etc. See http://docs.oracle.com/cd/B28359_01/server.111/b28310/tables003.htm#i1006400

    a: you can create a TWG once and use/re-use it anywhere in your code.
    (b) as it is a DDL you can not use in the DECLARE section. You can use BEGIN and EXCEPTION.

    See you soon,.

  • What to fill in 'field of the temporary table' for global temporary tables?

    Hello

    I use the Data Modeler 4.0.1.836 and everything that I put in the box 'the scope of the table temp' for a global temporary table doesn't seem to affect the DDL script about the ON COMMIT PRESERVE/DELETE the LINES option. The script poster ON COMMIT PRESERVE ROWS always anything.

    Yet, some of my temporary tables must be created as ON COMMIT DELETE ROWS.

    Using the Data Modeler wrote about it:

    Scope of the temporary Table:

    For a class as a temporary table, you can specify a scope, such as the Dimension or the Session.

    Not sure what 'Dimension' has to do with the scope here, but it makes no difference.

    I tried to put 'Session', 'Dimension', 'Operation', but no luck. So what is the text for the script generate ON COMMIT DELETE ROWS?

    Thank you

    Hello

    The temporary Scope of Table property (on page Types of Classification of the table properties dialog box) is purely documentary.

    To set ON COMMIT DELETE ROWS you must expand the browser for the relational model and find the node for the relevant Oracle physical model.  If you develop it you will find an entry there for your Table. Double-click on that to get the physical model properties dialog box for your table, and you will find a "Temporary" facility that has options (Preserve Rows), YES (Delete Rows) YES or no.

    David

  • What is the best, collection, or Global Temp tables?

    Hi all

    I have to deal with 1 lakh record in plsql, storage can I choose? Global temporary tables or plsql collection?

    Please advice, performance is very important!

    In other words, you will probably use only the data in the remote database through SQL - for example he will join your tables, filtering, etc.

    In one such case will consider a TWG or materialized view.

    A collection (structure memory PL/SQL) manipulated via a SQL (operating separately from the PL/SQL engine) engine, would usually be a very bad choice, performance, and scalability ito usability.

  • What is the syntax for creating a global temporary table using a select query

    HII
    I create a global temporary table using a select query... How to speak of "on commit preserve rows ' who?


    create a table temporary global t1 select * from trn_ordbase on the lines of commit preserve;

    but this is an invalid syntax, then how to talk on commit preserve rows in this? If I don't mention, by default its recital on the validation of deleted rows.

    Please help me on this problem.
    create global temporary table t1 on commit preserve rows
      2  as select * from dual;
    
    Table created.
    
    TUBBY_TUBBZ?
    
  • What is the best TWG or Pl/Sql Table

    Hello

    One of the best MNC asked me a question. for example,.

    What is the global temporary Table table / b/w difference Pl/Sql? What is the best to maintain the data manipulations?


    Pls advise me... !!

    for example, it is very useful.

    Adv.Thanks
    Prabhu

    As usual if you search for it you would have found your answer at this time.

    He has already been asked here before and responded. The link is

    PL/SQL table for the TWG vs

    Concerning

    REDA

  • Global temporary table Vs Table permanently to manipulate the transaction data

    Hi all

    Version of database - 10.2.0.4

    We need handle transactions, data in a table and put in an intermediate table (ie): to replicate the data in the tables of a schema of staging of the tables in the schema. Get info on transactions and handling.
    Can you please indicate which one of the below is the best option.

    Option 1:
    Create a global temporary table, each running process.

    Option 2:
    Create a table permanently and delete lines at the beginning of the process.

    Job expects every 5 minutes

    Thank you and best regards,
    Rakesh

    If data are transient and must be written to the disk (I'm not sure I follow your explanation for why written data on the disk are necessary - you have to touch table large transaction each time to fill the intermediate table) using a global temporary table. At least, you'll reduce the cost of writing the data to disk by generating less recovery.

    But ideally, you would not write the data on the drive at all and would be able to do it in SQL.

    Justin

  • What is the best way to deal with a 'Implicit coercion' in a table to a sprite?

    Hi all!

    With the continued support of this forum, I'm getting closer to have a programme of work. I can't wait to be able to help others like me once I've finished learning the ropes of AS3.

    I'll briefly explain what I want to achieve and then followed with my question.

    Background

    I created a random number of 12 x 9 grid that fills each cell with an image, based on the numeric value of each cell. I also have a random play button that makes random numbers in the grid. The problem I am running became my click event of button to erase the current images off the grid in order to allocate the new (for example by removing the objects display battery in order to place the new ones in the same places).

    Question

    My question is this: what is the best way to manage an implicit constraint from a table to a sprite? I pasted my complete code below so that you can see how the functions are supposed to work together. My sentence is apparently not being able to use a value from array with a sprite (sprite represents the real layout of the grid on the pile of display while the table starts as a number that is assigned an image that must be transmitted to the sprite).

    ============================================================================

    package
    {
    import flash.display.MovieClip;
    import flash.display.DisplayObject;
    import flash.events.MouseEvent;
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.utils.getDefinitionByName;

    SerializableAttribute public class extends MovieClip Blanko
    {
    Contains 12 * 9 grid of cells.
    var grid: Sprite;
    Maintains the shuffle button.
    var shuffleButton:Sprite;
    Is equal to 12 columns, 9 lines.
    var cols: int = 12;
    lines of the var: int = 9;
    Equal number of grid cells (108).
    cells var: int = COL * rows;
    Sets of cell width and height to 40 pixels.
    var cellW:int = 40;
    var cellH:int = 40;
    Contains 108 images of cell.
    var imageArray:Array = [];
    Contains 108 numerical values for the cells in the grid.
    var cellNumbers:Array = [];

    Constructor calls the functions "generateGrid" and "makeShuffleButton".
    public void Blanko()
    {
    generateGrid();
    makeShuffleButton();
    }

    Creates and displays the grid 12 * 9.
    private function generateGrid (): void
    {
    grid = new Sprite;
    var i: int = 0;


    for (i = 0; i < cells; i ++)
    {
    cellNumbers.push (i % 9 + 1);
    }
    trace ("before shuffle:", cellNumbers);
    shuffleCells (cellNumbers);
    trace ("after shuffle:", cellNumbers);
    var _cell:Sprite;

    for (i = 0; i < cells; i ++)
    {

    / / This line is where the implicit constraint occurs. '_cell' is a leprechaun trying

    on a temporary basis equal to a value from array.
    _cell = drawCells (cellNumbers [i]);
    _cell.x = (I % cols) * cellW;
    _cell.y = (I / COL) * cellH;

    grid.addChild (_cell);
    }
    }

    Creates a "shuffle" button and adds a mouse click event.
    private function makeShuffleButton (): void
    {
    var _label:TextField = new TextField();
    _label. AutoSize = 'center ';
    TextField (_label) .multiline = TextField (_label) .wordWrap = false;
    TextField (_label) .defaultTextFormat is new TextFormat ("Arial", 11, 0xFFFFFF, "bold");.
    _label. Text = "SHUFFLE";
    _label.x = 4;
    _label.y = 2;
    shuffleButton = new Sprite();
    shuffleButton.graphics.beginFill (0 x 484848);
    shuffleButton.graphics.drawRoundRect (0, 0, _label.width + _label.x * 2, _label.height +)
    _label.y * 2, 10);
    shuffleButton.addChild (_label);
    shuffleButton.buttonMode = shuffleButton.useHandCursor = true;
    shuffleButton.mouseChildren = false;
    shuffleButton.x = grid.x + 30 + grid.width - shuffleButton.width;
    shuffleButton.y = grid.y + grid.height + 10;
    this.addChild (shuffleButton);
    shuffleButton.addEventListener (MouseEvent.CLICK, onShuffleButtonClick);
    }

    Erase the images of the cell, mix of their numbers and then assigned these new images.
    private function onShuffleButtonClick (): void
    {
    eraseCells();
    shuffleCells (cellNumbers);
    trace ("after shuffle:", cellNumbers);


    for (var i: int = 0; i < cells; i ++)
    {
    drawCells (cellNumbers [i]);
    }
    }

    Deletes any existing cells in the battery of the display image.
    private void eraseCells(): void
    {
    While (imageArray.numChildren > 0)
    {
    imageArray.removeChildAt (0);
    }
    }

    Changes cell phones numbers (makes random table).
    private void shuffleCells(_array:Array):void
    {
    var _number:int = 0;
    var _a:int = 0;
    var _b:int = 0;
    var _rand:int = 0;

    for (var i: int = _array.length - 1; i > 0; i-)
    {
    _rand = Math.Random () * (i - 1);
    _A = _array [i];
    _B = _array [_rand];
    _ARRAY [i] = _b;
    [_Rand] _ARRAY = _a;
    }
    }

    Retrieves and sets a custom image to a cell based on its numerical value.
    private void drawCells(_numeral:int):Array
    {
    var _classRef: Class = Class (getDefinitionByName ("skin" + _numeral));
    _classRef.x = 30;
    imageArray.push (_classRef);
    imageArray.addChild (_classRef);
    return of demonstration;
    }
    }
    }

    ===========================================================================

    Any help with this is greatly appreciated. Thank you!

    If you want to have an array of Sprites that you later clear that is fine. But this does not mean that your function should return to it.

    You need your function to return the sprite so that you can add it to the display list and everything what you need.

    So just have the function get Sprite, push it in the "toBeClearedInTheFutureArray" and then return a reference to the currently acquired sprite.

  • order of the lines of the global temporary table

    I have a global temporary table "TMP_PAYMENT_ANNUITY" and I insert records in there with loop for each iteration of loop insert a row in the table.
    Now, I'm back records inserted user with cursor in this way:
       open o_annuity_payments for 
          select * from TMP_PAYMENT_ANNUITY;
    Can I be sure that the slider will have records in exactly the same order as inserted loop them?
    Or do I also insert rownumber column of my table that I filled with the loop iteration variable, and I'll be back slider like this:
       open o_annuity_payments for 
          select * from TMP_PAYMENT_ANNUITY
           order by ROWNUMBER;
    Currently, I have "ROWNUMBER"-column in the table, but maybe I should create then? ".
    The question is about the order of the rows, how this order will be without "in order to" - clause?

    Published by: CharlesRoos on June 2, 2010 03:03

    CharlesRoos wrote:
    >
    What makes the solution of the temporary table better?
    >

    1. This approach/solution is easier to read for other developers. Ugly hierarchical query with the function LAG is difficult to read and edit.

    I agree with you! It's one of the reasons when you should stop developing very sophisticated SQL statements. Even if the performance is slightly better.

    2-hierarchical-feature in sql is always slow and friendly error.

    I don't think that a hierarchical solution is necessary. but it may depend on your version of Oracle (think MODEL clause).

    3. it is easy to implement the "temporary table solution." with complex sql construction will be time-consuming and bug-friendly and complex.
    3. I'm not sure the question of perfomance, here I may be wrong, I test/compare.

    ...

    CharlesRoos wrote:
    1 can someone confirm that I don't need "ORDER byclause?

    I never would implement it WITHOUT a prescription by cluase. Why depend on such a solution?
    One of your strong points would improve maintainability. It is against this requirement.
    Imagine this happening, for example, when another developer decided to move from a temporary to a normal table. Maybe by adding a field 'user '.
    In such a scenario, you can find ways where the output is sorted not more properly.

    I can't find Google evidence.

    2. what happens if I order by as:

    select * from TMP_PAYMENT_ANNUITY
    ORDER BY ROWID;
    

    This approach maybe gives me the order of the rows as they are in the table?

    main problem is that you cannot test if it STILL works without order. But you will need to find not only one rare case that breaks it.

    * In a multiuser environment, the table could put a few lines where another session comes to delete certain lines. This could influence the agenda.
    * oracle could change something for the release of "like orders ' (I did they did already in the GROUP BY clause from 9i to 10g).

  • Retrieve the DDL for temporary Table existing global

    HI: I'm on 10.2.0.3.

    Anyone know how to recover the DDL for TWG? For an ordinary table, I select dbms_metadata.get_ddl ('TABLE', '< table_name >', '< OWNER >') of double;

    Does not work for GTT! TIA.

    Can you elaborate a bit on "does not work"? Are you an Oracle error, for example? If so, what is the error?

    Seems to work for me on 10.2.0.1

    SQL> select * from v$version;
    
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
    PL/SQL Release 10.2.0.1.0 - Production
    CORE    10.2.0.1.0      Production
    TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
    
    SQL> create global temporary table gtt_foo (
      2  col1 number
      3  );
    
    Table created.
    
    SQL> select object_type from user_objects
      2  where object_name = 'GTT_FOO';
    
    OBJECT_TYPE
    -------------------
    TABLE
    
    SQL> select dbms_metadata.get_ddl( 'TABLE', 'GTT_FOO' )
      2    from dual;
    
    DBMS_METADATA.GET_DDL('TABLE','GTT_FOO')
    -----------------------------------------------------------
    
      CREATE GLOBAL TEMPORARY TABLE "SCOTT"."GTT_FOO"
       (    "COL1" NUMBER
       ) ON C
    

    Justin

  • What is the best way to have an indicator that scrolls the content of a table that is updated during the execution of a program?

    I have a program that runs continuously. During this time the errors are produced and I store them in a table. What is the best way to display the table in a window that the user can scroll upwards or downwards, while the program is running?

    Thank you.

    Hi chuck,

    If allowing you to feed two tables to the table you will see also all of these channels in the table

  • trigger on the global temporary table

    Hello

    I have a global temporary table

    CREATE GLOBAL TEMPORARY table to register)

    no_registre NUMBER primary key,

    date of create_time

    ) ON COMMIT DELETE ROWS.

    I have to write a trigger on the table every time that the insertion is made.

    create or replace trigger tri_register

    before inserting the REGISTER

    for each line

    Start

    : new create_Date: = sysdate;

    end;

    /

    This trigger can work on this registry table?

    Thank you

    913578 wrote:

    Sorry Karthik.

    the thing is that I did not have privelleges to test, I send the code to some dba who makes deployment.

    Sorry to hear that!

    Please tell me... We can write triggers on GTT?

    of course, you can!

    SQL > create a global temporary table registry
    () 2
    no_registre 3 number primary key,
    create_time date 4
    5)
    6 on the validation to delete lines;

    Table created.

    SQL > create or replace trigger register_trig before insert in the register for each line
    2 start
    3: new.create_time: = sysdate;
    4 end;
    5.

    Trigger created.

    SQL > insert into values of registry (no_registre) (1);

    1 line of creation.

    SQL > select * from registry;

    NO_REGISTRE CREATE_TI
    ----------- ---------
    1 8 JULY 13

  • How to insert into a GLOBAL TEMPORARY TABLE and get the data from it?

    The requrement is
    Split the string ENTRY point on the base and store it in a Collection. And the values of the collection will be stored in a global temporary table. Then, I'm updating some other table based on the data from the temporary table.

    There is in fact no error message. But there is no data in the temporary table and also no change in the update statement

    First of all, I'm creatiing a global temporary table only once outside the procedure.

    CREATE GLOBAL TEMPORARY table GLt (data_element number)


    create or replace procedure test_proc (p_in_string VARCHAR2) is
    i the number: = 0;
    number of POS: = 0;
    CLOB lv_str: = p_in_string;
    p_delim VARCHAR2 (1): = ', ';

    TYPE t_array IS TABLE OF VARCHAR2 (20) INDEX directory.
    t_array channels;

    BEGIN

    -cutting of string input and store in the strings (i) collection

    POS: = instr (lv_str, p_delim, 1, 1);
    WHILE (pos! = 0) LOOP
    i: = i + 1;
    Strings (i): = substr(lv_str,1,pos-1);
    lv_str: = substr (lv_str, pos + 1, length (lv_str));
    POS: = instr (lv_str, p_delim, 1, 1);
    IF pos = 0 THEN
    Strings (i + 1): = lv_str;
    END IF;
    END LOOP;

    run immediately "drop table TWG;
    run immediately ' CREATE GLOBAL TEMPORARY table (data_element number) TWG on commit preserve rows ";

    FORALL i in strings.first... Strings.Last
    INSERT INTO VALUES TWG (strings (i));
    commit;

    Update first_tbl set PIN is "XXX" where first_col in (select data_element from TWG);.
    commit;

    END test_proc;

    Published by: cedric b on January 25, 2013 12:59

    Remove the two execute immediate line. They are wrong.

    And then use the table in your code that you created at the beginning. The name is GLT.
    And delete the first commit. This validation would empty the temporary table of GLT.

    You get an error? Or it does not work as expected?

    Also, show how you call the procedure.

    Published by: Sven w. January 25, 2013 14:45

  • How can I write the trigger for the global temporary Table

    Hi Grus,
    How can I write the trigger for the global temporary Table.

    I created the TWG with trigger using the script below.


    CREATE A GLOBAL_TEMP GLOBAL TEMPORARY TABLE
    (
    EMP_C_NAME VARCHAR2 (20 BYTE)
    )
    ON COMMIT PRESERVE ROWS;


    CREATE OR REPLACE TRIGGER TRI_GLOBAL_TEMP
    BEFORE DELETE, UPDATE OR INSERT
    ON GLOBAL_TEMP
    REFERRING AGAIN AS NINE OLD AND OLD
    FOR EACH LINE
    BEGIN
    INSERT INTO VALUES EMPNAME (: OLD.) EMP_C_NAME);
    END;
    /


    trigger was created successfully, but her would not insert EMPNAME Table...

    Please guide if mistaken or not? If not wanting to give a correct syntax with example


    Thanks in advance,
    Arun M M
    BEGIN
    INSERT INTO EMPNAME VALUES (:OLD.EMP_C_NAME);
    END;
    
    you are referencing old value in insert stmt.
    
    BEGIN
    INSERT INTO EMPNAME VALUES (:new.EMP_C_NAME);
    END;
    

    then run your app, it works very well...

    CREATE GLOBAL TEMPORARY TABLE GLOBAL_TEMP
    (
    EMP_C_NAME VARCHAR2(20 BYTE)
    )
    ON COMMIT PRESERVE ROWS;
    
    CREATE OR REPLACE TRIGGER TRI_GLOBAL_TEMP
    BEFORE DELETE OR UPDATE OR INSERT
    ON GLOBAL_TEMP
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN
    dbms_output.put_line(:OLD.EMP_C_NAME||'yahoo');
    INSERT INTO EMPNAME VALUES (:new.EMP_C_NAME);
    dbms_output.put_line(:OLD.EMP_C_NAME);
    END;
    /
    
    create table EMPNAME as select * from GLOBAL_TEMP where 1=2
    
    insert into GLOBAL_TEMP values('fgfdgd');
    commit;
    select * from GLOBAL_TEMP;
    select * from EMPNAME;
    
    output:
    1 rows inserted
    commit succeeded.
    EMP_C_NAME
    --------------------
    fgfdgd               
    
    1 rows selected
    
    EMP_C_NAME
    --------------------
    fgfdgd               
    
    1 rows selected
    

    He got Arun

    Published by: OraclePLSQL on December 28, 2010 18:07

Maybe you are looking for