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,
SreejaHi,
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, MCTSYour 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
SanilThanks a lot Gordon. I got the answer.
-
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. -
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
AndyFirst 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-
-
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