Before and After insert or update rowcount

Hi
I have several extract objects procs which are calling various build objects procs which in turn are inserting or updating the tables...now when i run these objects sometimes i get no errors and everything seems to be running perfectly but the tables do not get updated ? now what i am trying to achieve here is get some kind of summary where i can see the before and after rowcount..for that i have created a table of every extract object proc and another table with the coressponding tables being updated by tht proc...can anyone pls tell me how should i look into these procs and how do i get the rowcount for a particular table before and after the procedure was run ?
Thanks a lot in advance

Hi,
On which version of RDBMS are you working , because if you're on 10g then just enable auditing or even FGA on the tables were you want to see the changes,
Then query the DBA-AUDIT (not sure of the name anymore) view.
If not then create a audit package yourself.
something like
create or replace package pck$audit as
procedure prc$check_tablecount(p_tablename IN VARCHAR2, p_status IN VARCHAR2);
end;
create or replace package body pck$audit as
procedure prc$check_tablecount(p_tablename IN VARCHAR2,p_status IN VARCHAR2) IS
sqlstr VARCHAR2(100);
v_count NUMBER;
begin
sqlstr := 'SELECT COUNT(*) FROM '||p_tablename;
EXECUTE IMMEDIATE sqlstr into v_count; --could by 'using v_count' check syntax for this
INSERT INTO audit_table(table_name,total_count,status,time_stamp)
VALUES(p_tablename,v_count,p_status,SYSTIMESTAMP);
COMMIT;
end;
end;
you can elaborate on this creating additional procedure checking differences in total_count on same table at same time.
Now call this procedure before starting your insert-delete- on your table make sure you put the parameters correct eg p_status => 'begin procedure'
and call it again after your commit in your procedure.
Hope this helps you out
Erwin

Similar Messages

  • SQL merge and after insert or update on ... for each row fires too often?

    Hello,
    there is a base table, which has a companion history table
    - lets say USER_DATA & USER_DATA_HIST.
    For each update on USER_DATA there has to be recorded the old condition of the USER_DATA record into the USER_DATA_HIST (insert new record)
    - to have the history of changes to USER_DATA.
    The first approach was to do the insert for the row trigger:
    trigger user_data_tr_aiu after insert or update on user_data for each rowBut the performance was bad, because for a bulk update to USER_DATA, there have been individual inserts per records.
    So i tried a trick:
    Instead of doing the real insert into USER_DATA_HIST, i collect the USER_DATA_HIST data into a pl/sql collection first.
    And later i do a bulk insert for the collection in the USER_DATA_HIST table with stmt trigger:
    trigger user_data_tr_ra after insert or update on user_dataBut sometimes i recognize, that the list of entries saved in the pl/sql collection are more than my USER_DATA records being updated.
    (BTW, for the update i use SQL merge, because it's driven by another table.)
    As there is a uniq tracking_id in USER_DATA record, i could identify, that there are duplicates.
    If i sort for the tracking_id and remove duplicate i get exactly the #no of records updated by the SQL merge.
    So how comes, that there are duplicates?
    I can try to make a sample 'sqlplus' program, but it will take some time.
    But maybe somebody knows already about some issues here(?!)
    - many thanks!
    best regards,
    Frank

    Hello
    Not sure really. Although it shouldn't take long to do a test case - it only took me 10 mins....
    SQL>
    SQL> create table USER_DATA
      2  (   id      number,
      3      col1    varchar2(100)
      4  )
      5  /
    Table created.
    SQL>
    SQL> CREATE TABLE USER_DATA_HIST
      2  (   id      number,
      3      col1    varchar2(100),
      4      tmsp    timestamp
      5  )
      6  /
    Table created.
    SQL>
    SQL> CREATE OR REPLACE PACKAGE pkg_audit_user_data
      2  IS
      3
      4      PROCEDURE p_Init;
      5
      6      PROCEDURE p_Log
      7      (   air_UserData        IN user_data%ROWTYPE
      8      );
      9
    10      PROCEDURE p_Write;
    11  END;
    12  /
    Package created.
    SQL> CREATE OR REPLACE PACKAGE BODY pkg_audit_user_data
      2  IS
      3
      4      TYPE tt_UserData        IS TABLE OF user_data_hist%ROWTYPE INDEX BY BINARY_INTEGER;
      5
      6      pt_UserData             tt_UserData;
      7
      8      PROCEDURE p_Init
      9      IS
    10
    11      BEGIN
    12
    13
    14          IF pt_UserData.COUNT > 0 THEN
    15
    16              pt_UserData.DELETE;
    17
    18          END IF;
    19
    20      END;
    21
    22      PROCEDURE p_Log
    23      (   air_UserData        IN user_data%ROWTYPE
    24      )
    25      IS
    26          ln_Idx              BINARY_INTEGER;
    27
    28      BEGIN
    29
    30          ln_Idx := pt_UserData.COUNT + 1;
    31
    32          pt_UserData(ln_Idx).id     := air_UserData.id;
    33          pt_UserData(ln_Idx).col1   := air_UserData.col1;
    34          pt_UserData(ln_Idx).tmsp   := SYSTIMESTAMP;
    35
    36      END;
    37
    38      PROCEDURE p_Write
    39      IS
    40
    41      BEGIN
    42
    43          FORALL li_Idx IN INDICES OF pt_UserData
    44              INSERT
    45              INTO
    46                  user_data_hist
    47              VALUES
    48                  pt_UserData(li_Idx);
    49
    50      END;
    51  END;
    52  /
    Package body created.
    SQL>
    SQL> CREATE OR REPLACE TRIGGER preu_s_user_data BEFORE UPDATE ON user_data
      2  DECLARE
      3
      4  BEGIN
      5
      6      pkg_audit_user_data.p_Init;
      7
      8  END;
      9  /
    Trigger created.
    SQL> CREATE OR REPLACE TRIGGER preu_r_user_data BEFORE UPDATE ON user_data
      2  FOR EACH ROW
      3  DECLARE
      4
      5      lc_Row      user_data%ROWTYPE;
      6
      7  BEGIN
      8
      9      lc_Row.id   := :NEW.id;
    10      lc_Row.col1 := :NEW.col1;
    11
    12      pkg_audit_user_data.p_Log
    13      (   lc_Row
    14      );
    15
    16  END;
    17  /
    Trigger created.
    SQL> CREATE OR REPLACE TRIGGER postu_s_user_data AFTER UPDATE ON user_data
      2  DECLARE
      3
      4  BEGIN
      5
      6      pkg_audit_user_data.p_Write;
      7
      8  END;
      9  /
    Trigger created.
    SQL>
    SQL>
    SQL> insert
      2  into
      3      user_data
      4  select
      5      rownum,
      6      dbms_random.string('u',20)
      7  from
      8      dual
      9  connect by
    10      level <=10
    11  /
    10 rows created.
    SQL> select * from user_data
      2  /
            ID COL1
             1 GVZHKXSSJZHUSLLIDQTO
             2 QVNXLTGJXFUDUHGYKANI
             3 GTVHDCJAXLJFVTFSPFQI
             4 CNVEGOTDLZQJJPVUXWYJ
             5 FPOTZAWKMWHNOJMMIOKP
             6 BZKHAFATQDBUVFBCOSPT
             7 LAQAIDVREFJZWIQFUPMP
             8 DXFICIPCBCFTPAPKDGZF
             9 KKSMMRAQUORRPUBNJFCK
            10 GBLTFZJAOPKFZFCQPGYW
    10 rows selected.
    SQL> select * from user_data_hist
      2  /
    no rows selected
    SQL>
    SQL> MERGE
      2  INTO
      3      user_data a
      4  USING
      5  (   SELECT
      6          rownum + 8 id,
      7          dbms_random.string('u',20) col1
      8      FROM
      9          dual
    10      CONNECT BY
    11          level <= 10
    12  ) b
    13  ON (a.id = b.id)
    14  WHEN MATCHED THEN
    15      UPDATE SET a.col1 = b.col1
    16  WHEN NOT MATCHED THEN
    17      INSERT(a.id,a.col1)
    18      VALUES (b.id,b.col1)
    19  /
    10 rows merged.
    SQL> select * from user_data_hist
      2  /
            ID COL1                 TMSP
             9 XGURXHHZGSUKILYQKBNB 05-AUG-11 10.04.15.577989
            10 HLVUTUIFBAKGMXBDJTSL 05-AUG-11 10.04.15.578090
    SQL> select * from v$version
      2  /
    BANNER
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
    PL/SQL Release 10.2.0.4.0 - Production
    CORE    10.2.0.4.0      Production
    TNS for Linux: Version 10.2.0.4.0 - Production
    NLSRTL Version 10.2.0.4.0 - ProductionHTH
    David

  • Repairing permissions before and after updating software

    What is the reason to repair permissions before and after updating software? This may sound like a stupid question to many of you, but I am new to computers and I am trying to learn how and why of some of the things of my PowerBook. I installed some updates without repairing permissions. Did I install some software updates the wrong way? Thank you.

    This is a topic which will draw as many emphatic for and against responses as overnight shut down or not, defrag or not, optimise or not, and so on.
    I agree with Neil. I believe that OS X has progressed sufficiently that repair permissions has become redundant and so I do not do it on any regular basis.
    Some folk may refer you to an Apple Support Article 303602. That Article in its 4 May 2006 version, titled "Top 10 Tips to Keep Your Mac in Top Form" suggested Repair Permissions should be done "after upgrading or installing new software". The Article was however revised on 15 May 2006 to be titled "Top Tips to Keep Your Mac in Top Form" and the item on Repair Permissions [along with two other recommended maintenance tips] was removed. It is my view that the conclusion to be drawn here is that Apple no longer considers Repair Permissions to be a required maintenance procedure.
    Many users have adopted a "Repair Permissions" mantra for a cure-all over several years. I dropped it sometime in 10.3.
    But, to each his own.
    HTH
    TiPB 867   Mac OS X (10.4.6)  

  • Oracle Alert: Access before and after update values of a table column

    We have a requirement where a notification needs to be sent when 'END_DATE' attribute (column in a table X) is set, in an Oracle Applications form.
    I have defined an Event based Oracle Alert which fires 'On Update' of the table X.
    Could anyone please let me know as how to access the value of 'END_DATE' before and after update (i.e :new.END_DATE and :old.END_DATE) in the sql query of the alert.
    The need to use the before update and after update values of the attribute 'END_DATE' is that if we add the condition END_DATE is not null, the alert is sent even if any other attrbutes are updated in the Oracle form which is not the intended behavior.
    Appreciate any help.
    Thanks

    Hi
    use selectionlistener for your first table then add clientlistener and serverlistener so that you will get the rows on click in back bean.
    then get second table vo and and create and add row for that view object. add partial target to refresh your second table from back bean.
    on click of save call commit operation.

  • Everyone:  This time repair your permissions before and after 10.4.8 update

    Hello All,
    Just a reminder for all those who are updating to OS 10.4.8.
    While many people do ignore all the recommendations that we provide and still come through fine, please do consider observing the following to minimize your problems.
    To insure the best chance of success, please consider downloading the Combo Updater for your computer instead of using Software update.
    For PowerPC Mac's, this would be:
    http://www.apple.com/support/downloads/macosx1048comboupdateppc.html
    For Intel Macs, this would be:
    http://www.apple.com/support/downloads/macosx1048comboupdateintel.html
    The benefit of using the Combo Updater, is that it replaces all system files that have been changed since the last major release (in this case since 10.4.0).
    So, if you have any system files that have become corrupted, the Combo Updater will very likely over-write those, and spare you the headaches that come from updating an operating system that has problems that just haven't come to the surface yet.
    In many cases, you can have problems that have not come to the surface, and the "Delta" or Software update method will bring them out to bite you. The reason for this, is because the Delta / Software Update version only changes files that have changed since 10.4.7. And, it works more in a "patch" fashion. So, if there is a problem in one of the files being patched, then the update will cause you some major headaches.
    Going with the larger "Combo" update over-writes almost all the System files with clean versions instead of just making patches. So, it is frequently much more successful.
    Now, with that said, before you update, you should make sure your permissions are all set properly. If your permissions are wrong, then your update will likely have trouble.
    So, go into "Disk Utility" in the Applications --> Utilities folder and repair your permissions.
    Start by selecting your hard drive on the left window of Disk Utility. Then, go down and click on the "Repair Permissions" button. Once it's completed, then exit Disk Utility.
    Now, it is also extremely important to make sure all running programs are closed before you install any system update. So, go ahead and restart your computer.
    Restarting will make sure that all programs are closed, and that nothing weird is stuck in memory before you install.
    If you have anti-virus programs running, then disable or deactivate them first (you don't want them interpreting this as unauthorized modification or it might prevent certain files from being updated).
    Now, with your computer freshly restarted, install the Combo updater you downloaded.
    When prompted, click on the "Restart" button when prompted.
    Now, the computer will startup, but sit at the spinning wheel for several minutes. It will eventually restart again on it's own. And, finally, it will start-up all the way and you'll be back at your desktop.
    Now, immediately go back to Disk Utility and repair permissions as you did in the previous step. You will likely see several permissions that have been repaired. In my case, I had dozens of CoreAudio, Widgets, and other permissions that needed repair. Once permissions have been repaired, go ahead and restart one last time. This makes sure that everything is set and then cleaned-up.
    Once it reboots, begin using it and enjoy.
    Now, this may sound like a lot. But, it really is simple. It just reads like a lot of stuff.
    And, of course, you are free to ignore this and just install it however you like. Many people have their own ideas here. And, many people say you don't have to do anything to prepare. But, for those that have had huge problems in the past, these extra steps will usually save you the major headaches that tons of people inevitably have with every new update.
    Anyway, I hope this helps to save at least a few of you any problems. If you don't agree with the ideas above, just ignore it and do as you like.
    But, if you want a little extra piece-of-mind and a better chance at success, then please consider exercising this extra caution.
    And, for the record, I have updated my machines to 10.4.8 (within minutes of the update being available) and it is working perfectly smooth on my systems.
    I hope you find this helpful.

    mhunter, thanks and good that you take the time and effort again to remind everyone that it does take an effort to do a major OS update, to ensure maximum stability.
    So far my 10.4.8 Update is a-okay, and I have had many trouble-free updates since installing 10.4
    I too practice rigourously and "religiously" before and after an OS or Security Update, but I normally use Software Update, equally successful:
    1. Before Startup, UNPLUG all external devices, left only keyboard, mouse and internet connection, unless they are all wireless.
    2. Startup, disable NAV if any, Repair Disk Permission. Restart again, Repair Permission again.
    3. Do Software Update
    4. Restart, Repair Permission
    5. Shutdown, plug everything back
    6. Startup Mac, use Mac
    So far these steps have been keeping all my macs both at home and at work very very stable and healthy.
    Maybe, just maybe if everyone here, all mac users were to follow these steps, yes they can be a hassle, yes they can take up some time, but then there will be less less complains and "blasts" at Apple, just because perhaps themselves have been too careless or negligance in performing updates.
    Cheers

  • I'm unable to update my apps or download new apps to my Iphone. When I try I get a message "An unknown error has occurred".  It was happening before and after the last OS upgrade.  I've done a hard reboot with no effect.  Any suggestions???

    I'm unable to update my apps or download new apps to my Iphone. When I try I get a message "An unknown error has occurred".  It was happening before and after the last OS upgrade.  I've done a hard reboot with no effect.  Any suggestions???

    Have either of you had any luck with this issue.  It began happening to me today when I was trying to purchase music on iTunes.  I have purchased music and games in the past and have had no problem.  Any help would be appreciated.

  • Triggers before and after update

    Hi
    I would like to add triggers before and after update for the following code. I would be thankful if someone give some guidance
    update per_all_people_f a
    set start_date = (select min(effective_start_date)
    from per_all_people_f a1
    where a1.person_id = a.person_id)
    where person_id in (1114,115);Thanks
    anna

    Hi
    I was unable to answer you. I agree with Peter . Also i want to add
    that in HRMS you should check what triggers are already on that table and be carefull with creating your own one. With your own trigger you can influence on some application logic you know.
    ( And i hope that is a table first of all :) - but as i know _F at the end of table name means table  )
    T

  • Difference between Before INSERT and After INSERT trigger?

    What is difference between Before INSERT and After INSERT triggers? Can anyone give me a simple example from SCOTT schema for both of these triggers.

    The documentation gives a good explanation have you looked at....
    http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm#sthref1175

  • Data Loading(Before and After Image)

    I heard that a datasource which has both "Before and After Image " ,then the data can be sent directly to the infocube or from the DSO to the Infocube but where as
    If a datasource supports after image then first it has to be loaded to the DSO and then to the Infocube ,
    My question is how to know the image types of the datasource ?

    Hi Ravi,
    Check in ROOSOURCE tables in ECC. You can find the behvariaour options in DELTA field, so based on this table we can say will it support Cube/ODS.
        Delta Only Via Full Upload (ODS or InfoPackage Selection)
    A    ALE Update Pointer (Master Data)
    ABR    Complete Delta with Deletion Flag Via Delta Queue(Cube-Comp)
    ABR1    Like Method 'ABR' But Serialization Only by Requests
    ADD    Additive Extraction Via Extracto (e.g. LIS Info Structures)
    ADDD    Like 'ADD' But Via Delta Queue (Cube-Compatible)
    AIE    After-Images Via Extractor (FI-GL/AP/AR)
    AIED    After-Images with Deletion Flag Via Extractor (FI-GL/AP/AR)
    AIM    After-Images Via Delta Queue (e.g. FI-AP/AR)
    AIMD    After-Images with Deletion Flag Via Delta Queue (e.g. BtB)
    CUBE    InfoCube Extraction
    D    Unspecific Delta Via Delta Queue (Not ODS-Compatible)
    E    Unspecific Delta Via Extractor (Not ODS-Compatible)
    FIL0    Delta Via File Import with After-Images
    FIL1    Delta Via File Import with Delta Images
    NEWD    Only New Records (Inserts) Via Delta Queue (Cube-Compatible)
    NEWE    Only New Records (Inserts) Via Extractor (Cube-Compatible)
    O  
    ODS    ODS Extraction
    X    Delta Unspecified (Do Not Use!)

  • How to covert before and after image details from logdump to SQL

    Hi,
    Through logdump,i am able to retrieve below before and after image details for an update statement.
    Instead of below ascii format output, i need to know the complete sql statement before update and after update.
    Is there any command to covert below output to readable SQL sentence?
    2012/09/26 02:30:16.999.659 FieldComp Len 300 RBA 2528
    Name: TEST.TESTTABLE
    Before Image: Partition 4 GU m
    5e50 86f5 af70 9660 b6fa 785c e34f 8881 0497 9507 | ^P...p.`..x\.O......
    799f 2ee2 6399 d539 ea92 90de 828b 83d9 adc9 c8c4 | y...c..9............
    ca87 9632 7136 a5fc 826f 8cc7 6ddd 7f8a e02e 816a | ...2q6...o..m......j
    6ac4 739a 8011 5068 068a 4553 4937 93e7 cc5a d3d3 | j.s...Ph..ESI7...Z..
    6a2b 2540 3be9 1df7 6d0c 0f17 d795 efd4 e0c5 dae9 | j+%@;...m...........
    a488 a757 7c07 78a4 5f2a 1330 d2bb 5a05 7075 6b95 | ...W|.x._*.0..Z.puk.
    529c f681 97d8 df6f 58d5 37dc e36d 8bc0 19d5 c7f0 | R......oX.7..m......
    Bad compressed block, found length of 34549 (x86f5), RBA 2528
    Logdump 2335 >n
    Hdr-Ind : E (x45) Partition : . (x04)
    UndoFlag : . (x00) BeforeAfter: A (x41)
    RecLength : 300 (x012c) IO Time : 2012/09/26 02:30:16.999.659
    IOType : 15 (x0f) OrigNode : 255 (xff)
    TransInd : . (x01) FormatType : R (x52)
    SyskeyLen : 0 (x00) Incomplete : . (x00)
    AuditRBA : 24567 AuditPos : 4268948
    Continued : N (x00) RecCount : 1 (x01)
    2012/09/26 02:30:16.999.659 FieldComp Len 300 RBA 2947
    Name: TEST.TESTTABLE
    After Image: Partition 4 GU m
    5e50 86f5 af70 9660 b6fa 785c e34f 8881 0497 9507 | ^P...p.`..x\.O......
    799f 2ee2 6399 d539 ea92 90de 828b 83d9 adc9 c8c4 | y...c..9............
    ca87 9632 7136 a5fc 826f 8cc7 6ddd 7f8a e02e 816a | ...2q6...o..m......j
    6ac4 739a 8011 5068 068a 4553 4937 93e7 cc5a d3d3 | j.s...Ph..ESI7...Z..
    6a2b 2540 3be9 1df7 6d0c 0f17 d795 efd4 e0c5 dae9 | j+%@;...m...........
    a488 a757 7c07 78a4 5f2a 1330 d2bd 5a05 7075 6b95 | ...W|.x._*.0..Z.puk.
    529c f681 97d8 df6f 58d5 37dc e36d e8b8 19d5 1af0 | R......oX.7..m......
    Bad compressed block, found length of 34549 (x86f5), RBA 2947

    From the reference guide:
    *FORMATSQL*
    Valid for Extract
    Use the FORMATSQLparameter to output data in external SQL format, instead of the default
    Oracle GoldenGate canonical format. FORMATSQLgenerates SQLstatements (INSERT, UPDATE,
    DELETE) that can be applied to both SQLand Enscribe tables by utilities other than Oracle
    GoldenGate Replicat.
    NOTE Do not use FORMATSQL if the data will be processed by the Replicat process.
    Replicat expects the default canonical format. Do not use FORMATSQLif
    FORMATASCIIor FORMATXMLis being used.
    A FORMATSQL statement affects all extract files or trails defined after it.
    Default output
    Without options, FORMATSQLtransactions are output as follows, in comma-delimited format:
    ● The begin-transaction indicator, B.
    ● The timestamp at which the transaction was committed.
    ● The sequence number of the transaction log in which the commit was found.
    ● The relative byte address (RBA) of the commit record within the transaction log.
    ● The SQL statements.
    ● The commit indicator, C.
    ● A newline indicator.
    Every record in a transaction is contained between the begin and commit indicators. Each
    combination of commit timestamp and RBA isunique. You can customize the output
    format with optional arguments.
    Default See “Default output”
    Syntax FORMATSQL [<option>] [, ...]

  • Detecting Before and After Field Images

    Is there a way within ADDT to find the value of screen fields prior to update?  I've tried using the custom trigger BEFORE and STARTER events; BEFORE is too late, the field is already changed, STARTER is too early, the field value is NULL.
    I don't believe using straight PHP is an option either because I believe ADDT changes the names of the fields for occurence purposes.
    I would like to produce a detail log of the fields that change.  Comparing them before and after seems like the only way.

    Heya,
    I've really been having a hard time trying to understand exactly what it is you are trying to do. I read your post a few times and caught this line:
    I would like to produce a detail log of the fields that change.
    For this I would go about it by using an update record SB combined with insert into two tables SB. This would update the record of the user and also insert the info into a second table, the 'changed fields' table...
    In 'changed fields' table insert logged in users id via session variable, a timestamp, and whatever fields were updated in the update record SB form and there you'd have it - your record updated and a detailed record of what fields were updated and when with complete backlog for all users. Query 'changed fields' table sorted by user id and you'd see who changed what when.
    Hope that helps!

  • Why there is implicit commit before and after executing DDL Statements

    Hi Guys,
    Please let me know why there is implicit commit before and after executing DDL Statements ?
    Regards,
    sushmita

    Helyos wrote:
    This is because Oracle has design it like this.Come on Helyos, that's a bit of a weak answer. :)
    The reason is that it makes no sense to update the structure of the database whilst there is outstanding data updates that have not been committed.
    Imagine having a column that is VARCHAR2(50) that currently only has data that is up to 20 characters in size.
    Someone (person A) decides that it would make sense to alter the table and reduce the size of the column to varchar2(20) instead.
    Before they do that, someone else (person B) has inserted data that is 30 characters in size, but not yet committed it.
    As far as person B is concerned that insert statement has been successful as they received no error, and they are continuing on with their process until they reach a suitable point to commit.
    Person A then attempts to alter the database to make it varchar2(20).
    If the database allowed that to happen then the column would be varchar2(20) and the uncommitted data would no longer fit, even though the insert was successful. When is Person B going to find out about this? It would be wrong to tell them when they try and commit, because all their transactions were successful, so why should a commit fail.
    In this case, because it's two different people, then the database will recognise there is uncommitted transactions on that table and not let person B alter it.
    If it was just one person doing both things in the same session, then the data would be automatically committed, the alter statement executed and the person informed that they can't alter the database because there is (now) data exceeding the size they want to set it to.
    It makes perfect sense to have the database in a data consistent state before any alterations are made to it, hence why a commit is issued beforehand.
    Here's something I wrote the other day on the subject...
    DDL's issue a commit before carrying out the actual action
    As long as the DDL is syntactically ok (i.e. the parser is happy with it) then the commit is issued, even if the actual DDL cannot be executed for another reason.
    Example...
    We have a table with some data in it...
    SQL> create table xtest as select rownum rn from dual;
    Table created.
    SQL> select * from xtest;
            RN
             1We then delete the data but don't commit (demonstrated by the fact we can roll it back)
    SQL> delete from xtest;
    1 row deleted.
    SQL> select * from xtest;
    no rows selected
    SQL> rollback;
    Rollback complete.
    SQL> select * from xtest;
            RN
             1
    SQL> delete from xtest;
    1 row deleted.
    SQL> select * from xtest;
    no rows selectedSo now our data is deleted, but not committed, what if we issue a DDL that is syntactically incorrect...
    SQL> alter tab xtest blah;
    alter tab xtest blah
    ERROR at line 1:
    ORA-00940: invalid ALTER command
    SQL> rollback;
    Rollback complete.
    SQL> select * from xtest;
            RN
             1... the data can still be rolled back. This is because the parser was not happy with the syntax of the DDL statement.
    So let's delete the data again, without committing it, and issue a DDL that is syntactically correct, but cannot execute for another reason (i.e. the database object it refers to doesn't exist)...
    SQL> delete from xtest;
    1 row deleted.
    SQL> select * from xtest;
    no rows selected
    SQL> truncate table bob;
    truncate table bob
    ERROR at line 1:
    ORA-00942: table or view does not exist
    SQL> rollback;
    Rollback complete.
    SQL> select * from xtest;
    no rows selectedSo, there we have it. Just because the statement was syntactically correct, the deletion of the data was committed, even though the DDL couldn't be performed.
    This makes sense really, because if we are planning on altering the definition of the database where the data is stored, it can only really take place if the database is in a state where the data is where it should be rather than being in limbo. For example, imagine the confusion if you updated some data on a column and then altered that columns datatype to be a different size e.g. reducing a varchar2 column from 50 character down to 20 characters. If you had data that you'd just updated to larger than 20 characters whereas previously there wasn't, then the alter table command would not know about it, would alter the column size and then the data wouldn't be valid to fit whereas the update statement at the time didn't fail.
    Example...
    We have a table that only allows 20 characters in a column. If we try and insert more into that column we get an error for our insert statement as expected...
    SQL> create table xtest (x varchar2(20));
    Table created.
    SQL> insert into xtest values ('012345678901234567890123456789');
    insert into xtest values ('012345678901234567890123456789')
    ERROR at line 1:
    ORA-12899: value too large for column "SCOTT"."XTEST"."X" (actual: 30, maximum: 20)Now if our table allowed more characters our insert statement is successful. As far as our "application" goes we believe, nay, we have been told by the database, we have successfully inserted our data...
    SQL> alter table xtest modify (x varchar2(50));
    Table altered.
    SQL> insert into xtest values ('012345678901234567890123456789');
    1 row created.Now if we tried to alter our database column back to 20 characters and it didn't automatically commit the data beforehand then it would be happy to alter the column, but then when the data was committed it wouldn't fit. However the database has already told us that the data was inserted, so it can't go back on that now.
    Instead we can see that the data is committed first because the alter command returns an error telling us that the data in the table is too big, and also we cannot rollback the insert after the attempted alter statement...
    SQL> alter table xtest modify (x varchar2(20));
    alter table xtest modify (x varchar2(20))
    ERROR at line 1:
    ORA-01441: cannot decrease column length because some value is too big
    SQL> rollback;
    Rollback complete.
    SQL> select * from xtest;
    X
    012345678901234567890123456789
    SQL>Obviously, because a commit statement is for the existing session, if we had tried to alter the table column from another session we would have got
    SQL> alter table xtest modify (x varchar2(20));
    alter table xtest modify (x varchar2(20))
    ERROR at line 1:
    ORA-00054: resource busy and acquire with NOWAIT specified
    SQL>... which is basically saying that we can't alter the table because someone else is using it and they haven't committed their data yet.
    Once the other session has committed the data we get the expected error...
    ORA-01441: cannot decrease column length because some value is too bigHope that explains it

  • GREP: How can I place a (for example) "*" before and after bold text with GREP?

    Hi there.
    I have a string of text as such:
    I want to use GREP to insert a "*" (asterisk) before and after each bold part. Can I do that with GREP?
    (if asterisk is a problem, I can use a different character)
    Any help would be appreciated.

    Hi Schmaltzkopf,
    try this:
    Have fun

  • Compare BEFORE and AFTER image in replicat

    Do any of You experts know how to make the following code smaller?
    ...,p_kolonner=@STRCAT("ID='",@IF(@COLTEST(BEFORE.ID,PRESENT),BEFORE.ID,""),"'>'",@IF(@COLTEST(ID,PRESENT),ID,""),"'¤",
    "OBSOLETED_ON='",@IF(@COLTEST(BEFORE.OBSOLETED_ON,PRESENT),BEFORE.OBSOLETED_ON,""),"'>'",@IF(@COLTEST(OBSOLETED_ON,PRESENT),OBSOLETED_ON,""),"'¤",
    "SMRT_ID='",@IF(@COLTEST(BEFORE...The actual parameter would look like:
    P_KOLONNER:  ID=''>'11531'¤OBSOLETED_ON=''>''¤SMRT_ID=''>'1'¤SM_SMID=''>'2011X0074-00'¤SMT_ID=''>''...
    This code is part of the params section of a sqlexec in a replicat file where I want to concatenate before and after images of a table into one parameter. I have to replace all NULLs with '' or the whole string evaluates to NULL when one of the columns are NULL. I have a procedure receiving the parameter.
    How do I write this code shorter? I have to use less code to accomplish the same thing.

    Hi Yosemite:
      You're right, the correct term is "Key Fields", in the previous post I made a mistake when referring to it as "Key Part", I'm sorry for the confusion.
    Anyway, it is not clear to me if you managed to solve the problem or if you're still struggling with your data loads, if this is the case, Could you please elaborate?
    -Which is the data source you are working with?
    -Did you map the ROCANCEL field both to the 0STORNO and 0RECORDMODE InfoObjects?
    -Are you using Addition or Overwrite on the Update Rules/Transformation Rules to the DSO?
    -Have you applied any relevant SAP Note to fix this issue?
    In case you have not read the blog by Swapna Gollakota, take a look at it, you might find it useful.
    How does a datasource communicates "DELTA" with BW?
    /people/swapna.gollakota/blog/2007/12/27/how-does-a-datasource-communicates-delta-with-bw
    Regards,
    Francisco Milán.
    Edited by: Francisco Milan on Oct 29, 2010 12:31 PM

  • Count before and after to certain occurance.

    I am trying to count the amount of units  studied before and after a certain Course was taken.
    So ID 1 did PREP in 2013 in the first period and has and also had done a unit in 2009 so reult be before prerp count 1
    ID 2 did PREP in 2012 first period and also an OTHER course in the same period as well as a OTHER in period 2. So when a PREP course appear in the same period and year as an OTHER course I would like it to count it as AFTER Prep.(see below(so when equal count as after PREP))
    ID 3 has done one unit before before PREP which is in 2011 and 2 Units after the first PREP course.
    I attepted this with not in and in statments basic I know but to no luck.
    Any help is greatly appreciated.
    Thanks
    CREATE TABLE DAN_DIRK_2
    (ID     VARCHAR2(8),
    YEAR    VARCHAR2(8),
    PERIOD VARCHAR2(8),
    COURSE VARCHAR2(12),
    UNIT VARCHAR2(12));
    INSERT INTO DAN_DIRK_2 (ID, YEAR,PERIOD,COURSE,UNIT) VALUES (1,'2013','SP1','PREP','PLI');
    INSERT INTO DAN_DIRK_2 (ID, YEAR,PERIOD,COURSE,UNIT) VALUES (1,'2009','SP4','OTHER','DRI');
    INSERT INTO DAN_DIRK_2 (ID, YEAR,PERIOD,COURSE,UNIT) VALUES (2,'2012','SP1','OTHER','FER');
    INSERT INTO DAN_DIRK_2 (ID, YEAR,PERIOD,COURSE,UNIT) VALUES (2,'2012','SP2','OTHER','AQW');
    INSERT INTO DAN_DIRK_2 (ID, YEAR,PERIOD,COURSE,UNIT) VALUES (2,'2012','SP1','PREP','FGV');
    INSERT INTO DAN_DIRK_2 (ID, YEAR,PERIOD,COURSE,UNIT) VALUES (3,'2011','SP1','OTHER','GVW');
    INSERT INTO DAN_DIRK_2 (ID, YEAR,PERIOD,COURSE,UNIT) VALUES (3,'2012','SP2','PREP','FER');
    INSERT INTO DAN_DIRK_2 (ID, YEAR,PERIOD,COURSE,UNIT) VALUES (3,'2013','SP1','OTHER','FSW');
    INSERT INTO DAN_DIRK_2 (ID, YEAR,PERIOD,COURSE,UNIT) VALUES (3,'2013','SP1','PREP','FGH');
    GIVES:
    ID
    YEAR
    PERIOD
    COURSE
    UNIT
    1
    2013
    SP1
    PREP
    PLI
    1
    2009
    SP4
    OTHER
    DRI
    2
    2012
    SP1
    OTHER
    FER
    2
    2012
    SP2
    OTHER
    AQW
    2
    2012
    SP1
    PREP
    FGV
    3
    2011
    SP1
    OTHER
    GVW
    3
    2012
    SP2
    PREP
    FFR
    3
    2013
    SP1
    OTHER
    FSW
    3
    2013
    SP1
    PREP
    FGH
    WANT:
    ID
    BEFORE
    AFTER
    1
    1
    0
    2
    0
    2
    3
    1
    2

    Chloe_19 wrote:
    Get an Error
    ORA-32033: unsupported column aliasing
    32033. 00000 -  "unsupported column aliasing"
    *Cause:    column aliasing in WITH clause is not supported yet
    *Action:   specify aliasing in defintion subquery and retry
    Error at Line: 1 Column: 8
    Am using version:
    Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
    because you use 10g, try this :
    WITH tt AS (
    select 1 ID,  2013 YR,  'SP1' PERIOD,  'PREP' COURSE,  'PLI' UNIT from dual union all
    select 1,  2009,  'SP4',  'OTHER',  'DRI' from dual union all
    select 2,  2012,  'SP1',  'OTHER',  'FER' from dual union all
    select 2,  2012,  'SP2',  'OTHER',  'AQW' from dual union all
    select 2,  2012,  'SP1',  'PREP',  'FGV' from dual union all
    select 3,  2011,  'SP1',  'OTHER',  'GVW' from dual union all
    select 3,  2012,  'SP2',  'PREP',  'FFR' from dual union all
    select 3,  2013,  'SP1',  'OTHER',  'FSW' from dual union all
    select 3,  2013,  'SP1',  'PREP',  'FGH' from dual ),
    tt2 AS (
    SELECT t.ID,
           min(t.YR) minyr, 
           min(replace(t.PERIOD,'SP','')) KEEP(DENSE_RANK FIRST ORDER BY T.YR) minpr
    FROM  tt t
    WHERE t.COURSE = 'PREP'
    GROUP BY t.ID)
        SELECT ID,
               NVL(COUNT(BEF),0) BEFORE,
               NVL(COUNT(AFT),0) AFTER
               FROM(          
                        SELECT t1.ID,
                               (CASE WHEN t1.YR = t2.minyr AND replace(t1.PERIOD,'SP','')= t2.minpr AND t1.course='PREP' THEN NULL
                                     WHEN t1.YR = t2.minyr AND replace(t1.PERIOD,'SP','')= t2.minpr AND t1.course!='PREP' THEN NULL
                                     WHEN t1.YR < t2.minyr THEN -1
                                     WHEN t1.YR = t2.minyr AND replace(t1.PERIOD,'SP','')<= t2.minpr THEN -1
                                 END) BEF,
                               (CASE WHEN t1.YR = t2.minyr AND replace(t1.PERIOD,'SP','')= t2.minpr AND t1.course='PREP' THEN NULL
                                     WHEN t1.YR = t2.minyr AND replace(t1.PERIOD,'SP','')= t2.minpr AND t1.course!='PREP' THEN 1
                                     WHEN t1.YR > t2.minyr THEN 1
                                     WHEN t1.YR = t2.minyr AND replace(t1.PERIOD,'SP','')>= t2.minpr THEN 1
                                 END) AFT        
                         FROM tt t1
                        LEFT JOIN tt2 t2
                               ON t2.id = t1.id
        GROUP BY ID
        ORDER BY 1

Maybe you are looking for