modify an existing table to selectively the partition interval range

I'm using Oracle 11.2.0.3.

I have an existing table that has parition interval range.

example:
 
create table Log( ts date, level  varchar2(20), scr varchar2(2000))PARTITION BY RANGE (TS)
INTERVAL( NUMTODSINTERVAL(1,'DAY'))
Currently, we have the log of the table that is the partition of the range by day and we drop old parition to a week. However, we want to change this to persist the records in the table of WHICH = LEVEL "IMPORTANT."

What is the best way to achieve this?

>
Is it possible to modify the existing interval partition table to add partition in the list?
>
Only using the DBMS_REDEFINITION to do online. And that always involves the creation of a "provisional" table

If you have a window of failure just to create a new partitioned table the way you want to and INSERT the data into it. You should be able to use a DEC to do if you want. You may not use swap partition since all data must be physically moved.
>
Can we do list-interval partition table i.e. (with partition interval as partition sup)?
>
No - subpartitioning of interval is not currently supported.

Here is the code example of a partitioned table by using the RANGE-interval LIST. It uses a VIRTUAL column, but you can ignore it for your use case

DROP TABLE mytable;

CREATE TABLE mytable
(
CREATION_DATE TIMESTAMP(6),
LAST_MODIFIED_DATE TIMESTAMP(6),
CREATION_DAY NUMBER(2) GENERATED ALWAYS AS (TO_NUMBER(TO_CHAR(CREATION_DATE, 'DD'))) VIRTUAL
)
PARTITION BY RANGE (LAST_MODIFIED_DATE) INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
SUBPARTITION BY LIST (CREATION_DAY)
   SUBPARTITION TEMPLATE
   ( SUBPARTITION days_1_5 VALUES (1,2,3,4,5)
   , SUBPARTITION days_6_10 VALUES (6,7,8,9,10)
   , SUBPARTITION days_11_15 VALUES (11,12,13,14,15)
   , SUBPARTITION days_16_20 VALUES (16,17,18,19,20)
   , SUBPARTITION days_21_25 VALUES (21,22,23,24,25)
   , SUBPARTITION days_26_31 VALUES (26,27,28,29,30,31)
   )
(
   PARTITION prior_to_2013 VALUES LESS THAN (TO_DATE('2013-01-01', 'YYYY-MM-DD'))
)

Tags: Database

Similar Questions

  • Select to partition interval

    Oracle Database 11 g Enterprise Edition Release 11.2.0.3.0 - 64 bit Production

    I have a partitioned table of interval on a range of numbers and to select the data of a partition for a specific value is

    CREATE TABLE part_test(part_key       NUMBER
                          ,part_data      VARCHAR2(10)
                          )
    PARTITION BY RANGE (part_key)
      INTERVAL ( 1 )
      (PARTITION p_base VALUES LESS THAN (0));
    
    INSERT INTO part_test(part_key, part_data)
    VALUES      (-1, '-1');
    INSERT INTO part_test(part_key, part_data)
    VALUES      (0, '0');
    INSERT INTO part_test(part_key, part_data)
    VALUES      (1, '1');
    INSERT INTO part_test(part_key, part_data)
    VALUES      (2, '2');
    COMMIT;
    
    SELECT *
    FROM   part_test PARTITION FOR(1);
    

    What I really want to select the partition is based on a value in another table to be

    CREATE TABLE part_value (part_key NUMBER);
    
    INSERT INTO part_value(part_key)
    VALUES      (1);
    COMMIT;
    
    SELECT *
    FROM   part_test PARTITION FOR(select part_key from part_value);
    

    It gives ORA-00936: lack of expression.  I could use dynamic sql statements to create the query (or generate a view), but it would save instead.  Any ideas if this can be achieved by a simple sql statement?

    Thank you.

    You try something like:

    SELECT *.

    OF part_test pt, part_value pv

    where pt.part_key = pv.part_key

    In most cases a particular partition will be only accessible, no full table scans (not true in all scenarios, however)

  • Level lock table while truncating the partition?

    Below, I use the version of oracle.

    Oracle Database 11 g Enterprise Edition Release 11.2.0.2.0 - 64 bit Production
    PL/SQL Release 11.2.0.2.0 - Production
    CORE Production 11.2.0.2.0
    AMT for Linux: Version 11.2.0.2.0 - Production
    NLSRTL Version 11.2.0.2.0 - Production

    I have a script to truncate the partition as below. Is there a table-level lock while truncating the parition? Any input is appreicated.

    ALTER TABLE TEMP_RESPONSE_TIME TRUNCATE PARTITION part1

    >
    Is there a table-level lock while truncating the parition?
    >
    No - it will lock the partition being truncated.

    Is there a global index on the table? If so they will be marked UNUSABLE and must be rebuilt.

    See the VLDB and partitioning Guide
    http://Oracle.Su/docs/11g/server.112/e10837/part_oltp.htm
    >
    Impact of surgery Maintenance of Partition on a Table partitioned local index
    Whenever a partition maintenance operation takes place, Oracle locks the partitions of the table concerned for any DML operation. Data in the affected partitions, except a FALL or a TRUNCATION operation, are always fully available for any operation selection. Given that clues them are logically coupled with the (data) table partitions, only the local index partitions affected table partitions must be kept as part of a partition maintenance operation, which allows the optimal treatment for the index maintenance.

    For example, when you move an old score a level of high-end storage at a level of low-cost storage, data and index are always available for SELECT operations. the maintenance of the necessary index is either update the existing index partition to reflect the new physical location of the data or, more commonly, relocation and reconstruction of the index to a level of storage partition low cost as well. If you delete an older partition once you have collected it, then its local index partitions deleted, allowing a fraction of second partition maintenance operation that affects only the data dictionary.

    Impact of surgery Maintenance of Partition on Global Indexes

    Whenever a global index is defined on a table partitioned or not partitioned, there is no correlation between a separate partition of table and index. Therefore, any partition maintenance operation affects all global indices or index partitions. As for the tables containing indexes, the affected partitions are locked to prevent the DML operations against the scores of the affected table. However, unlike the index for the local index maintenance, no matter what overall index remains fully available for DML operations and does not affect the launch of the OLTP system. On the conceptual and technical level, the index maintenance for the overall index for a partition maintenance operation is comparable to the index maintenance which would become necessary for a semantically identical DML operation.

    For example, it is semantically equivalent to the removal of documents from the old partition using the SQL DELETE statement to drop old partition. In both cases, all the deleted data set index entries must be removed to any global index as a maintenance operation of normal index that does not affect the availability of an index to SELECT and DML operations. In this scenario, a drop operation represents the optimal approach: data is deleted without the expense of a conventional DELETE operation and the indices are maintained in a non-intrusive way.

  • Select the partition, it will work?

    Hi, I have a TT_table partiotined:

    CREATE THE TABLE RYBATEMP. T_STAT
    (DATE OF THE ACTDATE,
    COL_LIST, FORMAT_LIST...
    .....)
    TABLESPACE "RYBA_DATA" PARTITION BY RANGE
    ("ACTDATE")
    (PARTITION 'D_20100901' VALUES LESS THAN (TO_DATE (' 2010-09-02 00:00:00 ',' SYYYY-MM-DD HH24:MI:SS ',' NLS_CALENDAR = GREGORIAN '))...)

    I just somehow check that the statement select refer directly wanted partition as expected is not browsing through all the table:

    SELECT COL_LIST FROM T_STAT WHERE
    ACTDATE > = to_date ('01 - SEPT.-10 00:00:00 "," DD-MON-YY HH24:MI:SS') AND
    ACTDATE < = to_date ('01 - SEPT.-10 21:01:16 ',' DD-MON-YY HH24:MI:SS')


    This time the date setting confuses me, even after reading through defintionis where format partition involves with hh. Is there way of anay follow in Plan or something, he never did on Oracle.
    It will take more/less/signs?


    Thank you
    Trent

    Hi Trent,
    Yes you can how things work with partitions in the plans of the explain command.
    I don't know your version, but some explanations in example 9.2:
    http://download.Oracle.com/docs/CD/B10500_01/server.920/a96533/ex_plan.htm#7211
    If you want to know how to have the complete trace etc (for example in point 10.2):
    http://download.Oracle.com/docs/CD/B19306_01/server.102/b14211/SQLTrace.htm
    (Notice the partitioning does not avoid the need to index)
    Best regards
    Phil

  • Disable LOGGING for partition table based on the automatic INTERVAL

    Hello

    I created a database table of paritioned range interval with NOLOGGING as the default attribute for the table as well as the tablespace definition.

    When ORACLE automatically creates a new partition for this table, it activates the LOGGING for this automatic partition even if the table definition says anything else.

    How can I go about changing this behavior? Is it still possible?

    FYI my platform is 11 GR 1 (11.1.0.7) material on SUN SOLARIS 10 SPARC.

    Any help will be appreciated.

    Right, so refer to a new feature of Oracle 11 g partitioning called 'partitioning interval. "

    +"+
    + The interval partitioning: A new strategy of partitioning in Oracle Database 11g, +.
    + Interval partitioning extends the functionality of the method range to define equipartitioned +.
    + ranges using a definition of the interval. Rather than specify individual +.
    + going to explicitly, Oracle will create any partition automatically as needed.
    + every time the data of a partition are inserted for the first time. Interval +.
    + a lot of partitioning improves maneuverability of a partitioned table. For +.
    example, + a partitioned table interval could be set so that Oracle creates a +.
    + new partition for each month in a calendar year; a partition is then automatically +.
    + created for "September 2007" as soon as the first record in this month is inserted.
    + in the database. +
    + The techniques available for a partitioned table interval are interval, interval-+.
    + List, range-Hash, and interval range. +
    +"+

    In order to disable interval partitioning on the transactions table, use:
    
    ALTER TABLE transactions SET INTERVAL ();
    

    http://download.Oracle.com/docs/CD/B28359_01/server.111/b32024/part_admin.htm

    Disable partitioning interval on this table, create a procedure to run every day we'll say, to create a new partition and chop the old partition of the appropriate table. I presume that the automatic partitioning interval creates the partition with the logging by default option without checking the parameters in the table. I have seen no information on this in the Oracle documentation.

    Hope that helps.

    Ogan

  • What is the solution to add is not null to an existing table that has the data

    I have an employee table that contains the data that I want to change the column NOT NULL .i get error saying e-mail
    table cannot be changed when the data is there... any other solution for this?

    I have an employee table that contains the data that I want to change the column not NULL.
    I get error message saying table cannot be changed when the data is there... any other solution for this?

    Create a new column that can contain NULL.
    New column UPDATED with the old data
    remove the old column
    Rename new old column_name column

  • Select the partition to format RT?

    I currently use a NI PXI machine for my LabView code.  I would also like to be able to use it as a real-time target.  Hoping to do this, I created another partition on the hard disk to install the software in real time.  However, when I boot from the disc USB Utility and select "marker hard disk" I get three options: "1 reformat the first RT-compatible partition on the disk", "2 clear all Acha partitions a single partition. ' and '3. Cancel the Format.  Seem to be how to choose my partition created for these purposes.  If I select '1' I run the risk of losing my c:\ drive, or maybe the "Acronis" partition supplied with the computer.  Is there a way around this, or what I have to re-partition of my drive hard so that the new partition is 'before' the c:\ drive?

    Incidentally, most of the other options of the menu "1. Boot using software installed on the hard disk","2. Start in safe mode"etc. seem to prevent the computer to crash.  Each fixed for this?

    My disk USB Utility has been created with LabView 8.6 use MAX 4.5.0.

    Thank you

    Doug

    Hi Doug,.

    I'm happy to help you with your question! Start with, I would not recommend using the Desktop PC utility USB player with most of the PXI systems. Several recent of National Instruments PXI controllers are provided with the opportunity to start in the Mode of LabVIEW Real-time safe via an EEPROM (with any necessary USB external drive), and so it is generally a better option.

    What PXI controller do you use? If you enter the BIOS at startup of the system and see the real LabVIEW Real-time boot options, then you use one of the controllers with built-in LabVIEW of safe in real-time mode. A cautionary note: you need a LabVIEW Real-time Deployment license for run LabVIEW Real-time on your PXI controller. If you bought the controller and it delivered without LabVIEW Real-time installed, he probably didn't understand this license.

    Assuming you are using one of these controllers, you have two basic options:

    (1) install the files in time real LabVIEW and Windows on the same partition (FAT32). When you start your system, you can use the BIOS options to specify Windows or LabVIEW Real-time. The first time you start the system before loading files in time real LabVIEW, you start in safe mode and then install software of MAX. After this point, you will be able to run LabVIEW Real-time and your application at startup using the options in the BIOS.

    (2) install the files in time real LabVIEW and windows on different partitions. To do this, you can install Windows on the FAT32 partition of second or later on your system, or (more commonly) to install Windows on an NTFS partition. LabVIEW Real-time will use the first partition FAT32 or remedy available. Once more, you can use the BIOS options to specify Windows or LabVIEW Real-time to start.

    At the end of the day, you can use the USB of PC Desktop Utility player to install LabVIEW Real-time on any PC with supported hardware (assuming that you bought a LabVIEW Real-time Deployment license). However, this will cause the real-time system appears under MAX as a PC, and if you format using the command of the utility, you will need to replace the system boot record. It is possible to configure a system to dual-boot with bootloader like GRUB utilities, etc., but I highly recommend using the built-in OS BIOS selection if possible.

    Please let me know if you have any additional questions, and I'm happy to help you further. Have a great day of Doug!

    Kind regards

    Casey Weltzin

    Product Manager, LabVIEW Real-time

    National Instruments

  • How to recover the partition table (corrupt) for the partition in good health?

    Partition (drive H) was working fine, then I rebooted my system normally and the drive is now inaccessible.

    "An error occurred reading the file: the file or directory is corrupted and unreadable." (1392).

    Window CMD CHKDSK says NTFS file system and "unable to determine the State and version volume.»

    [This is a disk external drive with 2 partitions on it - H and Mr. the second partition (drive M) discs works fine.]
    [Vista Ultimate OS]

    Is there a way I can get it to work or get the data off of it?

    Try the procedure described in the article below

    http://www.ehow.com/how_7500292_recover-bad-partition-table.html

  • create table as select the number of lines

    Hi s/n,.

    IM using create table select this option to copy the table of which 400 million rows.is there anyway to watch how many lines it is actually processing (copied) as we do by using a query in import.

    You can see if there is something in v$ session_longops.

    You can also monitor the space consumed as dba_segments or dba_extents.

  • Cannot add the partition to an existing table.

    Hello

    I don't add the partition to an existing table that is not partitioned, get the error as a type of data not valid, then I'm not find syntax errors.

    ALTER TABLE MESSAGEX_XCHANGE

    ADD THE PARTITION OF RANGE (LAST_MODIFY_TIMESTAMP)

    (

    PARTITION old_data VALUES LESS THAN (To_TIMESTAMP('27/02/2014','DD/MM/YYYY')),

    You see for VALUES LESS THAN (To_TIMESTAMP('28/02/2014','DD/MM/YYYY')) of the PARTITION

    );

    Error report:

    SQL error: ORA-00902: invalid data type

    1. 00000 - "invalid data type".

    * Cause:

    * Action:

    Thank you

    Manon...

    You get this error because your edit statement has an invalid syntax. In addition, you cannot partition a table that is not already configured for partitioning!

    You have to physically re-create the partitioned table in order to add new partitions to it.

  • Try to convert the partitioned Table of interval in the range... Swap partition...

    Requirement:

    Interval of replacement partitioned Table by range partitioned Table
    DROP TABLE A;
    
    CREATE TABLE A
    (
       a              NUMBER,
       CreationDate   DATE
    )
    PARTITION BY RANGE (CreationDate)
       INTERVAL ( NUMTODSINTERVAL (30, 'DAY') )
       (PARTITION P_FIRST
           VALUES LESS THAN (TIMESTAMP ' 2001-01-01 00:00:00'));
    
    
    INSERT INTO A
         VALUES (1, SYSDATE);
    
    INSERT INTO A
         VALUES (1, SYSDATE - 30);
    
    INSERT INTO A
         VALUES (1, SYSDATE - 60);
    I need to change this partitioned Table apart to a partitioned range Table. I can do using the EXCHANGE PARTITION. Like if I use the classic method to create another table range partitioned, then:

    DROP TABLE A_Range
    CREATE TABLE A_Range
    (
    a NUMBER,
    CreationDate DATE
    )
    PARTITION BY RANGE (CreationDate)
       (partition MAX values less than (MAXVALUE));
    
    Insert  /*+ append */  into A_Range Select * from A; --This Step takes very very long..Trying to cut it short using Exchange Partition.
    Problems:

    I can't do
     ALTER TABLE A_Range
      EXCHANGE PARTITION MAX
      WITH TABLE A
      WITHOUT VALIDATION;
     
    ORA-14095: ALTER TABLE CHANGE requires a not partitioned table nonclustered
    This is because the tables are partitioned. So it does not allow me.

    If I instead:


    Create a table that is not partitioned for exchanging data by partition.
      Create Table A_Temp as Select * from A;
      
       ALTER TABLE A_Range
      EXCHANGE PARTITION MAX
      WITH TABLE A_TEMP
      WITHOUT VALIDATION;
       
      select count(*) from A_Range partition(MAX);
     
    -The problem is that all the data is in MAX Partition.
    Even after the creation of a large number of partitions by walls of separation, the data is still in MAX Partition only.

    So:

    -What we cannot replace a partitioned Table to the Table partitioned using the EXCHANGE PARTITION range interval. that is, we have to insert in...
    -We can do it, but I'm missing something here.
    -If all the data is in MAX Partition due to "WITHOUT VALIDATION", can say us be redistributed in the right type of range partitions.

    You must pre-create the partitions in a_range and then swap one for one for a tmp, and then to arange. With the help of your sample (thanks to proviing code, incidentally).

    SQL> CREATE TABLE A
      2  (
      3     a              NUMBER,
      4     CreationDate   DATE
      5  )
      6  PARTITION BY RANGE (CreationDate)
      7     INTERVAL ( NUMTODSINTERVAL (30, 'DAY') )
      8     (PARTITION P_FIRST
      9         VALUES LESS THAN (TIMESTAMP ' 2001-01-01 00:00:00'));
    
    Table created.
    
    SQL> INSERT INTO A VALUES (1, SYSDATE);
    
    1 row created.
    
    SQL> INSERT INTO A VALUES (1, SYSDATE - 30);
    
    1 row created.
    
    SQL> INSERT INTO A VALUES (1, SYSDATE - 60);
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.
    

    You can find the form of existing partitions assistance:

    SQL> select table_name, partition_name, high_value
      2  from user_tab_partitions
      3  where table_name = 'A';
    
    TABLE_NAME PARTITION_NAME HIGH_VALUE
    ---------- -------------- --------------------------------------------------------------------------------
    A          P_FIRST        TO_DATE(' 2001-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
    A          SYS_P44        TO_DATE(' 2013-01-28 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
    A          SYS_P45        TO_DATE(' 2012-12-29 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
    A          SYS_P46        TO_DATE(' 2012-11-29 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
    

    You can then create the table a_range with apporopriate partitions. Note that you may need to create additional in a_range partitions because the partitioning interval does not create the partitions has no data for, even if that leaves 'holes' in the partitioning scheme. So, on that basis:

    SQL> CREATE TABLE A_Range (
      2     a NUMBER,
      3     CreationDate DATE)
      4  PARTITION BY RANGE (CreationDate)
      5     (partition Nov_2012 values less than (to_date('30-nov-2012', 'dd-mon-yyyy')),
      6      partition Dec_2012 values less than (to_date('31-dec-2012', 'dd-mon-yyyy')),
      7      partition Jan_2013 values less than (to_date('31-jan-2013', 'dd-mon-yyyy')),
      8      partition MAX values less than (MAXVALUE));
    
    Table created.
    

    Now, create a regular table to use in the constituencies:

    SQL> CREATE TABLE A_tmp (
      2     a              NUMBER,
      3     CreationDate   DATE);
    
    Table created.
    

    and all partitions in Exchange:

    SQL> ALTER TABLE A
      2    EXCHANGE PARTITION sys_p44
      3    WITH TABLE A_tmp;
    
    Table altered.
    
    SQL> ALTER TABLE A_Range
      2    EXCHANGE PARTITION jan_2013
      3    WITH TABLE A_tmp;
    
    Table altered.
    
    SQL> ALTER TABLE A
      2    EXCHANGE PARTITION sys_p45
      3    WITH TABLE A_tmp;
    
    Table altered.
    
    SQL> ALTER TABLE A_Range
      2    EXCHANGE PARTITION dec_2012
      3    WITH TABLE A_tmp;
    
    Table altered.
    
    SQL> ALTER TABLE A
      2    EXCHANGE PARTITION sys_p46
      3    WITH TABLE A_tmp;
    
    Table altered.
    
    SQL> ALTER TABLE A_Range
      2    EXCHANGE PARTITION nov_2012
      3    WITH TABLE A_tmp;
    
    Table altered.
    
    SQL> select * from a;
    
    no rows selected
    
    SQL> select * from a_range;
    
             A CREATIOND
    ---------- ---------
             1 23-NOV-12
             1 23-DEC-12
             1 22-JAN-13
    

    John

  • Add the column to an existing table-based user-defined type

    Hello guys,.
    I am compiling my function that returns a type defined by the user based on an existing table. Throughout the process of initialization so my query returns an additional column - SCORE (1). Here is my package:

    create or replace
    PACKAGE STAFF_AGENCY_PKG AS

    TYPE TYPE_SEEKER_TABLE IS TABLE OF THE DRAW. SEEKER % ROWTYPE;
    FUNCTION GET_SEEKERS (IN_KEYWORD IN VARCHAR2)
    TYPE_SEEKER_TABLE RETURN PIPELINE;

    END STAFF_AGENCY_PKG;
    -------

    create or replace
    STAFF_AGENCY_PKG PACKAGE BODY
    AS

    FUNCTION GET_SEEKERS (IN_KEYWORD IN VARCHAR2)
    TYPE_SEEKER_TABLE RETURN PIPELINE
    IS
    R_TBL TYPE_SEEKER_TABLE; -to return
    BEGIN
    FOR R IN)
    SELECT Seeker.SEEKER_ID,
    Seeker.FIRSTNAME,
    Seeker.LASTNAME,
    Seeker.NATIONALITY,
    Seeker.ISELIGIBLE,
    Seeker.BIRTHDATE,
    Seeker.ISRECIEVEEMAILS,
    Seeker.HIGHESTDEGREE,
    Seeker.ETHNICITY,
    Seeker.GENDER,
    Seeker.ISDISABILITY,
    Seeker.DISABILITY,
    Seeker.CV,
    Seeker.PASSWORD,
    Seeker.PREFFERED_CITY,
    SEEKER. E-mail
    SEEKER. JOB_PREFERENCES_ID,
    SCORE (1)
    THE APPLICANT Seeker
    WHERE CONTAINS (CV, ' < query >)
    < textquery lang 'grammar' = 'context' = > ' |
    GET_RELATED_CATEGORIES (IN_KEYWORD) |
    ' < / textquery >
    < score datatype = "INTEGER" / >
    (< / query > ', 1) > 0
    )
    LOOP
    PIPE ROW (R); -Error (38,10): PLS-00382: expression is of the wrong type
    END LOOP;
    RETURN;

    END GET_SEEKERS;
    END STAFF_AGENCY_PKG;

    How do I change my user type to be sufficient?

    Oracle version 11.2.0.1.0
    Thanks in advance!

    >
    How do I change my user type to be sufficient?
    >
    You will need to create two new TYPEs. The one who has all the columns of the draw. The REQUESTOR table and the new column SCORE, then a TYPE which is an array of the first type.

    See example 12-22 using a Pipelined Table function for a Transformation in the PL/SQl language reference

    http://docs.Oracle.com/CD/B28359_01/AppDev.111/b28370/tuning.htm#i53120

    Here's the first part

    -- Define the ref cursor types and function
    CREATE OR REPLACE PACKAGE refcur_pkg IS
      TYPE refcur_t IS REF CURSOR RETURN employees%ROWTYPE;
      TYPE outrec_typ IS RECORD (
        var_num    NUMBER(6),
        var_char1  VARCHAR2(30),
        var_char2  VARCHAR2(30));
      TYPE outrecset IS TABLE OF outrec_typ;
     FUNCTION f_trans(p refcur_t)
          RETURN outrecset PIPELINED;
    END refcur_pkg;
    /
    
    CREATE OR REPLACE PACKAGE BODY refcur_pkg IS
      FUNCTION f_trans(p refcur_t)
       RETURN outrecset PIPELINED IS
        out_rec outrec_typ;
        in_rec  p%ROWTYPE;
      BEGIN
    

    Change

      TYPE outrec_typ IS RECORD (
        var_num    NUMBER(6),
        var_char1  VARCHAR2(30),
        var_char2  VARCHAR2(30));
      TYPE outrecset IS TABLE OF outrec_typ;
    

    to include all the columns you need. Unfortunately, you have to manually list all the columns in the draw. The REQUESTOR table. If you think you need this same structure in other places you must create them as SQL types instead of PL/SQL types.

    This example should be enough to show you how to modify your code to do something similar.

  • Partition on existing Tables

    Hello

    I want to archive a database due to too much data into DB everymonth, so I have to delete the records from the previous month, which is about 4 million.

    Can someone give me idea to delete records as soon as possible. My opinion is to create the partition on the table and drop the partition once he becomes older.
    But if I want to introduce the partition then I have to create a partition in an existing table. So please give me the best way to introduce the partition of the existing table.

    It would really help that may suggest meanings.

    Thank you

    Spengler

    Here is an example

    CREATE TABLE my_table (
      id           NUMBER,
      description  VARCHAR2(50),
      create_date date
    )PARTITION BY RANGE (create_date)
    (PARTITION id_id0 VALUES LESS THAN (TO_DATE('26/08/2009', 'DD/MM/YYYY')) TABLESPACE users,
     PARTITION id_id1 VALUES LESS THAN (TO_DATE('27/08/2009', 'DD/MM/YYYY')) TABLESPACE users,
     PARTITION id_id2 VALUES LESS THAN (TO_DATE('28/08/2009', 'DD/MM/YYYY')) TABLESPACE users,
     PARTITION id_id3 VALUES LESS THAN (TO_DATE('29/08/2009', 'DD/MM/YYYY')) TABLESPACE users,
    PARTITION id_id4 VALUES LESS THAN (TO_DATE('30/08/2009', 'DD/MM/YYYY')) TABLESPACE users,
    PARTITION id_max  VALUES LESS THAN  (MAXVALUE) TABLESPACE users);
    

    -Insert the sample data

     INSERT INTO my_table  VALUES (0, 'ZERO',sysdate);
    INSERT INTO my_table  VALUES (1, 'One',sysdate+1);
    INSERT INTO my_table  VALUES (2, 'Two',sysdate+2);
    INSERT INTO my_table  VALUES (3, 'Three',sysdate+3);
    INSERT INTO my_table  VALUES (4, 'Four',sysdate+4);
    COMMIT;
    

    -You can run these queries to check the output.

    select * from my_table;
    select * from my_table partition(id_id0);
    select * from my_table partition(id_id1);
    select * from my_table partition(id_id2);
    select * from my_table partition(id_id3);
    select * from my_table partition(id_id4);
    select * from my_table partition(id_max);
    

    -Split partition

    ALTER TABLE my_table SPLIT PARTITION id_max AT (TO_DATE('01/09/2009', 'DD/MM/YYYY'))
    INTO (PARTITION id_id5 TABLESPACE users,PARTITION id_max TABLESPACE users);
    

    -Insert data into the new partition

    INSERT INTO my_table  VALUES (5, 'FIVE',sysdate+5);
    commit;
    

    -check

    select * from my_table partition(id_id5);
    
  • Use of the partition in select query

    Hello friends,

    I have a table in which the partitions are created on the date field, so for the month of February, I have 28 scores. Now I want to select records in more than one partition, may come from a range of partitions?

    How can I do? I want to avoid things like

    Select * from table_1 partition (p_01_feb_2014)

    Union of all the

    Select * from table_1 partition (p_02_feb_2014)

    Thank you

    As suggested by other members of the forum

    Use can use the date_column > 31 January 2014 ' and date_column< '01-mar-2014'="" in="" where="">

    You can also see this query plan to understand in detail how to find oracle table data.

    EXPLAIN PLAN FOR

    SELECT * FROM TABLE_1 WHERE DATE_COLUMN > 31 JANUARY 2014 ' AND DATE_COLUMN<>

    SELECT * FROM TABLE (DBMS_XPLAN. DISPLAY);

  • Need to create the Partition in the history table

    Hello

    I have an audit table that stores the data for the last 8 years in it and the customer wants to retain the data for the last 8 years. Now as adding data to this table is increasing, there is a delay in execution of report which are acquired by querying on this table.

    Basically, they go a from date and to date. Then these date are compared with two columns of dates in the table. The condition of the query will be as below

    TRUNC (NVL (DATE1, DATE2)) > = TRUNC (TO_DATE (?, ' dd/mm/yyyy ""))

    AND TRUNC (NVL (DATE1, DATE2)) < = TRUNC (TO_DATE (?, ' dd/mm/yyyy ""))

    Users can query for any date range.

    I am thinking of creating a Partition of the range on this table for each month during the 8 years of data. Please suggest on the question of whether I should use partition interval range to make it more effective. And would also create an Index on this partition for the above two day columns.

    12 (months) SO * 8 (years) = 98 would be created partitions. This will not overload the schema of database/Tablespace? Y at - it another effective way to set the table.

    Please suggest and let me know for any clarification.

    There are 2 approaches (but not limited to 2) to create the Partition on an existing table:

    Note: There is no ALTER TABLE statement to convert a heap table to a partitioned table.

    1. create a temporary Partitioned table with the same types of data in the column. Take a dump of the original table (HEAP) export and import the dump into the newly created partitioned intermediate table. After checking the data file the original and rename the interim even as the original table.

    2 using the package Oracle DBMS_REDEFINITION automates the steps above from said (not exactly the same steps, however) and its done online - which means there is no required downtime, the original table may undergo DML operations during this process of redefinition. View partitioning of a table online with DBMS_REDEFINITION | Oracle instructor

    According to my understanding if let us know as a partition interval then in April if there is an inserted record then it will create a new partition for the month of April will be of value less than 30 April 2014 "and all other documents created in April will pass under it"

    Yes, it's a feature of 11g, which Oracle manages adding partitions as needed. In earlier versions DBA can add partitions manually from time to time. Reference www.gavinsoorma.com/2009/09/11g-interval-partitioning/

    Here the reason for check the sent_out_datetime NVL will be NULL for few records, so in this case we want to get the records for dates of mapping them to received_datetime

    In addition, try to replace the NVL with COALESCE and test it. This would help improve performance.

Maybe you are looking for