Stored procedure transactions

I want to select message from a table (INBOX), put there id in a pending table and return those messages as a cursor.
FUNCTION nonPendingMessages
     RETURN pkg_delijn.ref_cursor AS
     nonPendingCursorRef pkg_delijn.ref_cursor;
     CURSOR nonPendingCursor IS select * from inbox where id not in (select id from pending);
BEGIN
     OPEN nonPendingCursorRef FOR select * from inbox where id not in (select id from pending);
     for nonPending in nonPendingCursor loop
          insert into pending (ID) values (nonPending.id);
     end loop;
     RETURN nonPendingCursorRef;
END;
the problem is than not alway all of the records that where inserted are returned to the cursor??? Can it be that between the query and the insert there are new records put in inbox.
my solution was:
FUNCTION nonPendingMessages
     RETURN pkg_delijn.ref_cursor AS
     nonPendingCursorRef pkg_delijn.ref_cursor;
     CURSOR nonPendingCursor IS select * from inbox where id not in (select id from pending);
          lTrancaction Number;
BEGIN
     select SEQ_Transaction.nextVal() into lTransaction from dummy;
     for nonPending in nonPendingCursor loop
          insert into pending (ID, TRANSACTION) values (nonPending.id, lTransaction);
     end loop;
     OPEN nonPendingCursorRef FOR select * from inbox where id in (select id from pending where Transaction = lTrancaction);
          RETURN nonPendingCursorRef;
END;
but then I have to add the extro column TRANSACTION, is there an other solution.

Please accept my apologies. I should have tested my previous post but I had to go to an after work meeting.
This ought to do what you want (but doesn't):
CREATE OR REPLACE FUNCTION nonPendingMessages
RETURN  dyn_fetch.ref_cur_t AS
  nonPendingCursorRef;
lrec t1%ROWTYPE;
BEGIN
OPEN nonPendingCursorRef
FOR SELECT * FROM inbox x WHERE id NOT IN (SELECT id FROM pending);
LOOP
   /* Fetch from cursor variable. */
   FETCH nonPendingCursorRef INTO lrec;
   EXIT WHEN nonPendingCursorRef%NOTFOUND; -- exit when last row is fetched
     INSERT INTO pending (col1) VALUES (lrec.id);
  END LOOP;
RETURN nonPendingCursorRef;
END;
However, a REF CURSOR is a pointer not an actual cache of rows. Once we have walked through the ref cursor the pointer is at the end of the array. So the above function returns an "empty" result set. Think of it as bullets in a six shooter.
So, if you really want to do this PENDING malarky you'll need to do it in the procedure that receives the REF CURSOR.
Remember to COMMIT the inserts.
Cheers, APC
BTW What is it with this schtick?
BTW. I can't change the table structure.I see a lot of it here. What this means is, I have a rubbish data structure and my boss is stupid or scary or both. Both is common. But you end up writing rubbish code and it's not good for the soul.

Similar Messages

  • Transaction Issue while calling a stored procedure in osb

    HI all ,
    I have created a wrapper  procedure to call "soa.delete_instances (this procedure will delete the instances from SOA_INFRA schema)" oy locall created user schema(ASG).
    If i execute  the wrapper procedure direclt in SqlDeveloper it's working fine cleaning the instances.
    i have called this procedure in OSB by using the DB adaptor JCA file, the wrapper procedure is executing fine, but not deleting instances from the SOA_INFRA schema.
    any help is apriciated.
    Thanks..

    Maaan, there could be so many reasons for that... just some things to check:
    1. How do you know the stored procedure executes fine? If you didn't get a failure response from a call to JCA, that means nothing.
    2. Do you log the procedure step by step? Did it reach its normal completion? How many rows (it believes) it found/deleted?
    3. What user is the stored procedure executed under from OSB (obviously -- user of the datasource)? Does this user have rights to see/delete those records?
    4. Are you executing the proxy in transaction, and if yes, didn't you get an error that rolled back that transaction?
    and so on, and so forth.
    Vlad
    http://vladimirdyuzhev.com

  • Stored procedure in a transaction problem

    hello to everybody
    I have an application under weblogic8.1 sp3.
    I have to call an Oracle stored procedure that populate a table and I have to see the new record anly at the end of the ejb service transaction ( a Container transaction ).When the procedure terminate I see the db data before the transaction end.So I have created a XA DataSource and changed the oracle 9.2 thin drivers in oracle 9.2 thin drivers XA.But Now I receive this Oracle Error:
    ORA-02089: COMMIT is not allowed in a subordinate session
    Why?How Can I resolve my problem?Can Anyone Help Me?Thanks...

    giorgio giustiniani wrote:
    hello to everybody
    I have an application under weblogic8.1 sp3.
    I have to call an Oracle stored procedure that populate a table and I have to see the new record anly at the end of the ejb service transaction ( a Container transaction ).When the procedure terminate I see the db data before the transaction end.So I have created a XA DataSource and changed the oracle 9.2 thin drivers in oracle 9.2 thin drivers XA.But Now I receive this Oracle Error:
    ORA-02089: COMMIT is not allowed in a subordinate session
    Why?How Can I resolve my problem?Can Anyone Help Me?Thanks...It sounds like you have transactional syntax embedded in your
    procedure. You can't do that and still include it in an XA
    transaction.
    Joe

  • Transaction in stored procedure

    I have a stored procedure like this:
    procedure test() as
    begin
    insert into table1.....
    insert into table2......
    insert into table3....
    exception
    when others then
    roolback;
    end;
    I have 3 question:
    1) it is correct my code? I want that in case of error in any insert, all the insert are rollback
    2)It is necessary to catch the exception or there is the stored procedure that automatically open transaction and to do commit or roolback?
    3)If error happen in second insert, the code jump to the exception or before execute the third insert and then go to the exception code?
    Thank you.
    Sara.

    I have a stored procedure like this:
    procedure test() as
    begin
    insert into table1.....
    insert into table2......
    insert into table3....
    exception
    when others then
    roolback;
    end;
    I have 3 question:
    1) it is correct my code? I want that in case of
    error in any insert, all the insert are rollbackIf an error happens during insert, the rows that inserted in the proc will be rolled back.
    2)It is necessary to catch the exception or there is
    the stored procedure that automatically open
    transaction and to do commit or roolback?It depends on your business rule. If your rules says that in case of any exception all work will ne rolled back, you will do as you mentioned. But ,usally, when an exception happens you can open an automus transaction to log the error in somewhere-DB-
    3)If error happen in second insert, the code jump to
    the exception or before execute the third insert and
    then go to the exception code?
    When an exception thrown in a program block, the exception will be propagated until it will cached. Suppose you have a function that call your procedure. If you do not handle the exception, the exception will propagated caller function. If function also could not handled it, it will be thrown. Or sometimes you can wrap up the exception with your business rules.
    Regards...

  • WL 6.0 using MS SQL Server 2000 - Transaction timeout when invoking stored procedure

    Hi,
    Facing a problem on WL6.0. We are connecting to MS SQL server 2000 using a stateless
    session bean
    using container managed transaction. The bean method does a few updates to the
    database and also
    calls a stored procedure that generates primary keys many times. This stored procedure
    (SP) is running
    in a transaction of its own since it has to increment a counter, update the database
    and then return the
    primary key.The primary key generator SP is working fine and does not lock the
    database in many bean
    methods.
    In some methods we find that the primary key generator SP has locked the database.
    We
    then see a lock on the database created due to this SP in the MS SQL client. The
    execution goes
    into the SP and gets stuck there till the bean's transaction times out. The error
    message given is
    ...... .. Exception Message - The transaction is no longer active
    (status = Rolling Back. [Reason = weblogic.transaction.internal.TimedOutExcepti
    on: Transaction timed out after 31seconds
    tx = transaction=(IdHash=1746718,Name = [EJB StructMgrBeanImpl.addStructure()],X
    id=10908:51e67e9d7185816a,Status=Active,numRepliesOwedMe=0,numRepliesOwedOthers=
    0,seconds since begin=31,seconds left=30,activeThread=Thread[ExecuteThread: '7'
    for queue: 'default',5,Thread Group for Queue: 'default'],ServerResourceInfo[web
    logic.jdbc.jts.Connection]=(state=started,assigned=none),SCInfo[myserver]=(state
    =active),properties=({weblogic.transaction.name=[EJB StructMgrBeanImpl.addStruct
    ure()], weblogic.jdbc=t3://10.200.15.136:7001}))]). No further JDBC access is
    al
    lowed within this transaction.
    What could be the potential problems in the method's code/SP that could be causing
    the timeout?
    Anyone faced similar problems?
    Thanks in advance,
    Sreeja

    Hi,
    Facing a problem on WL6.0. We are connecting to MS SQL server 2000 using a stateless
    session bean
    using container managed transaction. The bean method does a few updates to the
    database and also
    calls a stored procedure that generates primary keys many times. This stored procedure
    (SP) is running
    in a transaction of its own since it has to increment a counter, update the database
    and then return the
    primary key.The primary key generator SP is working fine and does not lock the
    database in many bean
    methods.
    In some methods we find that the primary key generator SP has locked the database.
    We
    then see a lock on the database created due to this SP in the MS SQL client. The
    execution goes
    into the SP and gets stuck there till the bean's transaction times out. The error
    message given is
    ...... .. Exception Message - The transaction is no longer active
    (status = Rolling Back. [Reason = weblogic.transaction.internal.TimedOutExcepti
    on: Transaction timed out after 31seconds
    tx = transaction=(IdHash=1746718,Name = [EJB StructMgrBeanImpl.addStructure()],X
    id=10908:51e67e9d7185816a,Status=Active,numRepliesOwedMe=0,numRepliesOwedOthers=
    0,seconds since begin=31,seconds left=30,activeThread=Thread[ExecuteThread: '7'
    for queue: 'default',5,Thread Group for Queue: 'default'],ServerResourceInfo[web
    logic.jdbc.jts.Connection]=(state=started,assigned=none),SCInfo[myserver]=(state
    =active),properties=({weblogic.transaction.name=[EJB StructMgrBeanImpl.addStruct
    ure()], weblogic.jdbc=t3://10.200.15.136:7001}))]). No further JDBC access is
    al
    lowed within this transaction.
    What could be the potential problems in the method's code/SP that could be causing
    the timeout?
    Anyone faced similar problems?
    Thanks in advance,
    Sreeja

  • Setting transaction isolation level on a replicated server stored procedure

    I have a SQL server that has replication turned onto to another server which is our reporting server. Replication is real-time (or close to it). On the report server I have a stored procedure that runs from a SRS report. My question is it possible or advisable
    or does it even make sense to set the "SET TRANSACTION ISOLATION LEVEL READ COMMITTED" on at the beginning of the stored procedure which selects data from the reporting server database? Is it possible for uncommitted data on the OLTP side of the
    house to be replicated before it is committed? We are having data issues with a report and have exhausted all options and was wondering if dirty data maybe the issue since the same parameters work for a report 1 sec and then next it doesnt.

    Only committed transactions are replicated to the subscriber.  But it is possible for the report to see dirty data if running in READ UNCOMMITTED or NOLOCK.  You should run your reports in READ COMMITTED or SNAPSHOT isolation , and your replication
    subscriber should be configured with READ COMMITTED SNAPSHOT ISLOATION eg
    alter database MySubscriber set allow_snapshot_isolation on;
    alter database MySubscriber set read_committed_snapshot on;
    as recommended here
    Enhance General Replication Performance.
    David
    David http://blogs.msdn.com/b/dbrowne/

  • JDO transaction, caching and stored procedures

    I currently retreive an existing object, update the object, and then call
    a stored procedure - all in one transaction. The issue I am running into
    is that the stored proc must have the modified data available when it
    selects the row (modified object) from the table. This is currently not
    happening. For example, if the initial field was null, then it is updated
    and the proc called, the proc only sees null. How do I specify that the
    changes should be processed w/in the transaction (not commited) and
    available for other processes reading the data in the same tx?
    Note: everything works perfect if I manually execute the update statement
    through a Statement on the connection for the stored proc. I have tried
    flush().
    Any ideas would be greatly appreciated!

    Here is a dumbed down version... I also tried doing a Query with JDO and
    that returns the modified value. Basically, the code below find the
    existing object, modifies a field, and then calls a stored proc to do some
    processing. Unfortunately, the stored proc needs to be able to "see" the
    modified data in the transaction.
    public void modifyFoo( UserToken userToken,
    Foo newFoo,
    Integer applicationId )
    PersistenceManager pm = null;
    Transaction tx = null;
    Integer applicationId = producerApplication.getId();
    try
    pm = JDOFactory.getPersistenceManager( userToken );
    tx = pm.currentTransaction();
    tx.begin();
    FooBoId appId = new FooBoId();
    appId.fooBolId = applicationId;
    FooBo appDbVo = (FooBo)pm.getObjectById( appId, true );
    appDbVo.setEffectiveDate( newFoo.getEffectiveDate() );
    String fooNumber = executeFooBar( userToken, applicationId
    appDbVo.setFooNumber( fooNumber );
    tx.commit();
    private String executeFooBar( UserToken userToken, Integer
    applicationId )
    throws PulsarSystemException, ValidationException
    String licenseNumber = null;
    try
    // Get a connection from the persistence manager
    Connection connection = JDOFactory.getConnection( userToken );
    connection.setAutoCommit( false );
    CallableStatement cs = connection.prepareCall( "{call
    sys_appl_pkg.fooBar(?,?,?,?,?,?)}" );
    // Register the type of the return value
    cs.registerOutParameter( 4, Types.NUMERIC );
    cs.registerOutParameter( 5, Types.NUMERIC );
    cs.registerOutParameter( 6, Types.VARCHAR );
    // Set parameters:
    cs.setString( 1, "Test" );
    cs.setInt( 2, applicationId.intValue() );
    cs.setInt( 3, 0 );
    catch( SQLException ex )
    ex.printStackTrace();
    return licenseNumber;
    Patrick Linskey wrote:
    Can you post the code that you're executing?
    -Patrick
    On Mon, 14 Jul 2003 20:38:09 +0000, Josh Zook wrote:
    I currently retreive an existing object, update the object, and then call
    a stored procedure - all in one transaction. The issue I am running into
    is that the stored proc must have the modified data available when it
    selects the row (modified object) from the table. This is currently not
    happening. For example, if the initial field was null, then it is updated
    and the proc called, the proc only sees null. How do I specify that the
    changes should be processed w/in the transaction (not commited) and
    available for other processes reading the data in the same tx?
    Note: everything works perfect if I manually execute the update statement
    through a Statement on the connection for the stored proc. I have tried
    flush().
    Any ideas would be greatly appreciated!
    Patrick Linskey
    SolarMetric Inc.

  • Transaction Handling via Multiple Stored Procedure Calls

    Hello,
    we have the requirement that we call severall stored procedures in a sequence. The problem now is to have one explicit transaction which is only commited in case all calls have been succesful. In case there is an error during one of the calls all already executed stored procedures should be rolled back.
    One idea would be to define transactional behavior in BPM within a block but I have some doubts whether this works as I have found the following warning in the SAP XI help section:
    "The transaction control mechanism for integration processes is not a central transaction manager for an entire system landscape. The transaction control mechanism cannot roll back any processing steps outside the Integration Server"
    Do you have any advice on this issue?
    Thanks a lot!

    The best solution would be to call the root SP from XI adaptor and handle the transaction commit logic in side this root SP. That way even BPM will not be in picture.
    BPM can not handle transaction roll back on external systems.
    VJ

  • I want to ecute multi stored procedure in one transaction..

    In one transaction, can I excute multi stored procedure?
    if sp2 fire exception then sp1 should be rollbacked?
    OracleConnection conn = null;
    OracleTransaction tran = null;
    OracleCommand cmd = null;
    try
    conn = new OracleConnection(ConnectionString);
    cmd = new OracleCommand();
    conn.Open();
    tran = conn.BeginTransaction();
    //sp 1
    cmd.CommandText = "sp_Insert";
    cmd.CommandType=CommandType.StoredProcedure;
    cmd.Parameters.Add(new OracleParameter("id",DbType.Varchar2,"test1"));
    int retval = cmd.ExecuteNonQuery();
    cmd.Parameters.Clear();
    // sp 2
    cmd.CommandText = "sp_update";
    cmd.CommandType=CommandType.StoredProcedure;
    cmd.Parameters.Add(new OracleParameter("id",DbType.Varchar2,"test2"));
    retval = cmd.ExecuteNonQuery();
    tran.Commit();
    catch (Exception ex)
    tran.Rollback();
    }

    CREATE PROCEDURE [dbo].[model_pro]
    @mdid as int=0,
    @mkid as int = 0,--for maker table PK, FK in this table And I dont want to display in gridview
    @mkcd as char(5)='',--for maker table which I want to display in gridview
    @mdcd as char(5)='',
    @desp as char(15)='',
    @status as varchar(50)=''
    )AS
    BEGIN
    SET NOCOUNT ON;
    if(@status = 'Display')
    begin
    --Select * from model--THESE FIELDS I WANT TO DISPLAY IN GRIDVIEW
    select md.mdid,md.mdcd,md.desp,mk.mkcd
    from model md left join maker mk
    on md.mkid=mk.mkid
    end
    else if(@status = 'Add')
    begin
    --Insert into maker(mkcd) values (@mkcd)
    --Insert into model(maker.mkcd,mdcd,desp) values (@mkcd,@mdcd,@desp)
    if not exists(select md.mdid,md.mdcd,md.desp,mk.mkcd
    from model md left join maker mk
    on md.mkid=mk.mkid
    where md.mdid=@mdid and
     --md.mdcd=@mdcd or
     mk.mkcd=@mkcd -- or  --md.desp=@desp
    begin 
    insert into model(mdcd,desp,mkid)
    values(@mdcd,@desp, SCOPE_IDENTITY());
    --insert into maker(mkcd)
    --values(@mkcd);
    end
    else
    RAISERROR('make model already exists',16,1);
    end
    else if(@status = 'Update')
    begin
    Update maker set mkcd=@mkcd where mkid=@mkid
    Update model set mdcd=@mdcd, desp=@desp 
    where mdid=@mdid
    end
    else if(@status = 'Delete')
    begin
    Delete from model where mdid=@mdid
    end
    END

  • Sp_executesql vs transaction statement within Stored Procedure

    Experts,
    Any difference between sp_executesql vs Transaction/Commit statement or try/catch block within Stored Procedure?
    What is the best practice to use and why?
    Thank You
    Regards,
    Kumar
    Please do let us know your feedback. Thank You - KG, MCTS

    Your question is a bit strange. sp_executesql is used for dynamic SQL. Unless the problem demands dynamic SQL and, therefore, sp_executesql, there is no need to use it.
    For a single statement I would not use transaction and try/catch. For multiple statements you do need to use transaction. It's up to you if you want to use try/catch in the SP or not and trap the error in the client application.
    For every expert, there is an equal and opposite expert. - Becker's Law
    My blog
    My TechNet articles

  • Migrating Transact SQL Stored Procedure & Funtions  to Oracle 9i Procedures

    Is it possible to Migrate Transact SQL Stored Procedure & Funtions in MS-SQL to Oracle 9i Procedures & Funtion . I am an Bigginer in Oracle and SQL.Is their any tool available for this?

    This feature is currently available in the Oracle Migration Workbench. with the Microsoft SQL Server plugins.
    Have you tried it?
    Regards,
    Niall

  • Transactional file output from a Java Stored Procedure invoked by trigger.

    I need to write information to a file from a Java Stored
    Procedure which is called from an insert trigger. This works OK
    except for the condition when a rollback is performed - the file
    is updated anyway.
    I need the Java Stored Procedure file output to be part of the
    transaction - performed on commit and skipped on rollback. Is
    there any way the Java Stored Procedure can be aware of the
    state of the transaction?

    i am Still facing the following problem:
    if i pass a parameter like :
    rm -f /test/menu.ksh
    then the required output is that the menu.ksh file gets deleted.
    but when i pass this command:
    ./test/menu.ksh
    It is supposed to execute the specified script but it does not.
    I have tried multiple things like giving chmod 777 rights to the following file and changing the command to /test/menu.ksh but nothing happens
    Can you kindly tell me what can the problem be. Is there any execution rights issue: i am executing these scripts from pl sql developer.
    You can find both the procedure and java method which is being called below
    ==========================================================================================
    create or replace procedure TEST_DISPLAY(filename in varchar2, result out varchar2, error out varchar2) is
    command varchar2(100);
    vRetChar varchar2(100);
    begin
    command := filename ;
    prc_host(command, vRetChar);
    result := vRetChar;
    dbms_output.put_line(result);
    Exception
    when No_Data_Found Then
    error := 'Command is not Found';
    dbms_output.put_line('Failure');
    return;
    end TEST_DISPLAY;
    ======================================================================
    create or replace and compile java source named host as
    import java.io.*;
    import java.lang.Runtime;
    import java.lang.Process;
    import java.io.IOException;
    import java.lang.InterruptedException;
    public class Host {
    public static void executeCommand(String command,String[] outString) {
    String RetVal;
    try {
    String[] finalCommand;
    final Process pr = Runtime.getRuntime().exec(command);
    // Capture output from STDERR...
    }

  • Block transaction in A/R Reserve Invoice via Stored Procedure

    Dear experts,
    I found in many threads the object id or object type of A/R Reserve Invoice to be 13 which is same as A/R Invoice. But when I use this object id in SP_Transaction_Notification stored procedure to block a transaction, A/R Reserve Invoice document is not affected by this object id. Also I noticed that the table the A/R Reserve Invoice is using is same as A/R Invoice.
    Can any one help on this issue?
    I want to block transaction to A/R Reserve Invoice as well as A/P Reserve Invoice if the line item's Item cost (OITM.AvgPrice) field is not specified in the Item Master Data.
    Regards
    Sanil

    Thanks a lot Gordon. I got the answer.

  • Problem: PL/SQL + Stored Procedure + Sequence + Trigger + Transaction + Violation Key

    I have a violation key when i insert some datas from a stored procedure. Why ???
    This is my script :
    1) The script of the table :
    CREATE TABLE OLLMULTI (
         IDO int NOT NULL ,
         IDL int NOT NULL ,
         T1 varchar2 (2) NOT NULL ,
         IDR int NOT NULL ,
         Constraint pk_outilsllmulti PRIMARY KEY (IDO, IDL, T1) ,
         Constraint u_outilsllmulti unique (IDR) );
    2) Now, i want to manage automatic increment field on IDR :
    I create a sequence :
    create sequence OLLMULTI_sequence increment by 1 start with 1;
    I create the trigger :
    create or replace trigger OLLMULTI_trigger
    before insert on OLLMULTI
    for each row when (new.IDR is null)
    begin
    select OLLMULTI_sequence.nextval into :new.IDR from dual;
    end;
    3) Now i create my store procedure and, in my procedure i want to insert 6 rows :
    Procedure Insert_OLLMULTI( i_IDO in OLLMULTI.IDO%type)
    is
    pragma AUTONOMOUS_TRANSACTION;
    BEGIN
    INSERT INTO OLLMULTI (IDO,IDL,T1)
    VALUES (i_IDO,2,'GJ');
    INSERT INTO OLLMULTI (IDO,IDL,T1)
    VALUES (i_IDO,5,'ND');
    INSERT INTO OLLMULTI (IDO,IDL,T1)
    VALUES (i_IDO,12,'AC');
    INSERT INTO OLLMULTI (IDO,IDL,T1)
    VALUES (i_IDO,120,'AH');
    INSERT INTO OLLMULTI (IDO,IDL,T1)
    VALUES (i_IDO,10,'ZG');
    INSERT INTO OLLMULTI (IDO,IDL,T1)
    VALUES (i_IDO,5,'RB');
    commit;
    EXCEPTION
    WHEN OTHERS THEN
    rollback;
    raise;
    END;
    END;
    4) The problem :
    The violation key on the constrainst u_outilsllmulti appears sometimes on a randome insert. Never the same !
    Why ? I think that the sequence is the problem... Or is the problem is the "pragma AUTONOMOUS_TRANSACTION" command ?
    Anyone can help me ?

    Two ideas:
    - Is it possible that there are already records in the table that were
    created without using the sequence? A sequence initially starts at 1,
    if you already got data you first have to increment it.
    - May it be that some inserts happen without your procedure? The trigger
    allows to create IDs without using the sequence. Correct, there are already records in my table !!
    Thanks. That's right.

  • SQL stored procedure Staging.GroomDwStagingData stuck in infinite loop, consuming excessive CPU

    Hello
    I'm hoping that someone here might be able to help or point me in the right direction. Apologies for the long post.
    Just to set the scene, I am a SQL Server DBA and have very limited experience with System Centre so please go easy on me.
    At the company I am currently working they are complaining about very poor performance when running reports (any).
    Quick look at the database server and CPU utilisation being a constant 90-95%, meant that you dont have to be Sherlock Holmes to realise there is a problem. The instance consuming the majority of the CPU is the instance hosting the datawarehouse and in particular
    a stored procedure in the DWStagingAndConfig database called Staging.GroomDwStagingData.
    This stored procedure executes continually for 2 hours performing 500,000,000 reads per execution before "timing out". It is then executed again for another 2 hours etc etc.
    After a bit of diagnosis it seems that the issue is either a bug or that there is something wrong with our data in that a stored procedure is stuck in an infinite loop
    System Center 2012 SP1 CU2 (5.0.7804.1300)
    Diagnosis details
    SQL connection details
    program name = SC DAL--GroomingWriteModule
    set quoted_identifier on
    set arithabort off
    set numeric_roundabort off
    set ansi_warnings on
    set ansi_padding on
    set ansi_nulls on
    set concat_null_yields_null on
    set cursor_close_on_commit off
    set implicit_transactions off
    set language us_english
    set dateformat mdy
    set datefirst 7
    set transaction isolation level read committed
    Store procedures executed
    1. dbo.p_GetDwStagingGroomingConfig (executes immediately)
    2. Staging.GroomDwStagingData (this is the procedure that executes in 2 hours before being cancelled)
    The 1st stored procedure seems to return a table with the "xml" / required parameters to execute Staging.GroomDwStagingData
    Sample xml below (cut right down)
    <Config>
    <Target>
    <ModuleName>TransformActivityDim</ModuleName>
    <WarehouseEntityName>ActivityDim</WarehouseEntityName>
    <RequiredWarehouseEntityName>MTV_System$WorkItem$Activity</RequiredWarehouseEntityName>
    <Watermark>2015-01-30T08:59:14.397</Watermark>
    </Target>
    <Target>
    <ModuleName>TransformActivityDim</ModuleName>
    <WarehouseEntityName>ActivityDim</WarehouseEntityName>
    <RequiredWarehouseEntityName>MTV_System$WorkItem$Activity</RequiredWarehouseEntityName>
    <ManagedTypeViewName>MTV_Microsoft$SystemCenter$Orchestrator$RunbookAutomationActivity</ManagedTypeViewName>
    <Watermark>2015-01-30T08:59:14.397</Watermark>
    </Target>
    </Config>
    If you look carefully you will see that the 1st <target> is missing the ManagedTypeViewName, which when "shredded" by the Staging.GroomDwStagingData returns the following result set
    Example
    DECLARE @Config xml
    DECLARE @GroomingCriteria NVARCHAR(MAX)
    SET @GroomingCriteria = '<Config><Target><ModuleName>TransformActivityDim</ModuleName><WarehouseEntityName>ActivityDim</WarehouseEntityName><RequiredWarehouseEntityName>MTV_System$WorkItem$Activity</RequiredWarehouseEntityName><Watermark>2015-01-30T08:59:14.397</Watermark></Target><Target><ModuleName>TransformActivityDim</ModuleName><WarehouseEntityName>ActivityDim</WarehouseEntityName><RequiredWarehouseEntityName>MTV_System$WorkItem$Activity</RequiredWarehouseEntityName><ManagedTypeViewName>MTV_Microsoft$SystemCenter$Orchestrator$RunbookAutomationActivity</ManagedTypeViewName><Watermark>2015-01-30T08:59:14.397</Watermark></Target></Config>'
    SET @Config = CONVERT(xml, @GroomingCriteria)
    SELECT
    ModuleName = p.value(N'child::ModuleName[1]', N'nvarchar(255)')
    ,WarehouseEntityName = p.value(N'child::WarehouseEntityName[1]', N'nvarchar(255)')
    ,RequiredWarehouseEntityName =p.value(N'child::RequiredWarehouseEntityName[1]', N'nvarchar(255)')
    ,ManagedTypeViewName = p.value(N'child::ManagedTypeViewName[1]', N'nvarchar(255)')
    ,Watermark = p.value(N'child::Watermark[1]', N'datetime')
    FROM @Config.nodes(N'/Config/*') Elem(p)
    /* RESULTS - NOTE THE NULL VALUE FOR ManagedTypeViewName
    ModuleName WarehouseEntityName RequiredWarehouseEntityName ManagedTypeViewName Watermark
    TransformActivityDim ActivityDim MTV_System$WorkItem$Activity NULL 2015-01-30 08:59:14.397
    TransformActivityDim ActivityDim MTV_System$WorkItem$Activity MTV_Microsoft$SystemCenter$Orchestrator$RunbookAutomationActivity 2015-01-30 08:59:14.397
    When the procedure enters the loop to build its dynamic SQL to delete relevant rows from the inbound schema tables it concatenates various options / variables into an executable string. However when adding a NULL value to a string the entire string becomes
    NULL which then gets executed.
    Whilst executing "EXEC(NULL)" would cause SQL to throw an error and be caught, executing the following doesnt
    DECLARE @null_string VARCHAR(100)
    SET @null_string = 'hello world ' + NULL
    EXEC(@null_string)
    SELECT @null_string
    So as it hasnt caused an error the next part of the procedure is to move to the next record and this is why its caught in an infinite loop
    DELETE @items WHERE ManagedTypeViewName = @View
    The value for the variable @View is the ManagedTypeViewName which is NULL, as ANSI_NULLS are set to ON in the connection and not overridded in the procedure then the above statement wont delete anything as it needs to handle NULL values differently (IS NULL),
    so we are now stuck in an infinite loop executing NULL for 2 hours until cancelled.
    I amended the stored procedure and added the following line before the loop statement which had the desired effect and "fixed" the performance issue for the time being
    DELETE @items WHERE ManagedTypeViewName IS NULL
    I also noticed that the following line in dbo.p_GetDwStagingGroomingConfig is commented out (no idea why as no notes in the procedure)
    --AND COALESCE(i.ManagedTypeViewName, j.RelationshipTypeViewName) IS NOT NULL
    There are obviously other ways to mitigate the dynamic SQL string being NULL, there's more than one way to skin a cat and thats not why I am asking this question, but what I am concerned about is that is there a reason that the xml / @GroomingCriteria is incomplete
    and / or that the procedures dont handle potential NULL values.
    I cant find any documentation, KBs, forum posts of anyone else having this issue which somewhat surprises me.
    Would be grateful of any help / advice that anyone can provide or if someone can look at their 2 stored procedures on a later version to see if it has already been fixed. Or is it simply that we have orphaned data, this is the bit that concerns most as I dont
    really want to be deleting / updating data when I have no idea what the knock on effect might be
    Many many thanks
    Andy

    First thing I would do is upgrade to 2012 R2 UR5. If you are running non-US dates you need the UR5 hotfix also.
    Rob Ford scsmnz.net
    Cireson www.cireson.com
    For a free SCSM 2012 Notify Analyst app click
    here

Maybe you are looking for

  • Status of Schedule Line in Sales Order

    Which field in which of the tables shows the status of a schedule line for an item in the Sales Order?

  • How can i write and read the same data

    hi,          i have attached my program to this mail. i have some problems in this program. problems: 1. I want to select the threshold for the rms,varience and s.d. But what i used is not doing that. i want to fix the upper threshold value and lower

  • Sun Directory Editor - errors on edit form

    I've installed directory editor, which seems to run fine except for the edit form. I've got the following errors in the server.log (running Sun Java System Application Server Platform Edition 8.2) and can't find any doc on how to solve this. [#|2009-

  • Itunes acting up in one user

    Hello all, I have two users in my mac and iTunes is getting ridiculously slow in one of the users. With he other user is fast as it should be, no complains. I tried deleting the preference file (plist) and import all over again like starting from scr

  • Move light room from one pc to another

    how do i remove light room from one pc and reinstall it on another pc