Middels de Call Procedure (OLEDB) stap van BPA Platform is het mogelijk om een stored procedure uit te voeren binnen een SQL database. Een van de functionaliteiten die deze stap heeft is het teruggeven van een recordset bij het uitvoeren van deze stap. Men kan op het tabblad "Recordset" van deze stap het hiervoor benodigde vinkje aanzetten om van deze instelling gebruik te maken.
(Afbeelding 1: De instelling binnen de Call Procedure (OLEDB) stap welke aangeeft dat deze procedure een recordset retourneert
Het is mogelijk dat men een procedure uitvoert welke geen recordset retourneert terwijl dit wel de verwachting was. Dit document detailleert de benodigde opzet van de stored procedure om een recordset correct te retourneren.
Oorzaak
Bij het uitvoeren van een stored procedure verwacht BPA Platform dat de eerste executie binnen de stored procedure de recordset retourneert die men wil gebruiken. Een executie is hierbij een actie op de database zoals een UPDATE, INSERT of SELECT. Neem onderstaande inhoud van een stored procedure als voorbeeld:
INSERT INTO Products VALUES ('ORBTC10','Orbis Taskcentre 10 taken editie')
INSERT INTO Products VALUES ('ORBTC25','Orbis Taskcentre 25 taken editie')
Select * FROM Products
In de bovenstaande query worden drie executies uitgevoerd. De eerste twee executies zijn de INSERT statement, gevolg door een derde executie is de vorm van de SELECT statement. Daar de eerste INSERT statement geen regels retourneert zal BPA Platform geen recordset vinden wanneer deze stored procedure aangeroepen wordt. Wanneer men de query echter omdraait zal BPA Platform wel resultaten vinden.
Select * FROM Products
INSERT INTO Products VALUES ('ORBTC10','Orbis Taskcentre 10 taken editie')
INSERT INTO Products VALUES ('ORBTC25','Orbis Taskcentre 25 taken editie')
Bij de bovenstaande query zijn de SELECT en INSERT statements omgedraaid. Daar de SELECT statement nu de eerste executie binnen de procedure is zal BPA Platform correct een recordset retourneren binnen de taak. Echter: door het omdraaien van de volgorde van de procedure veranderd ook de werking van de procedure. In deze situatie voegen we regels aan een tabel nadat we deze eerst opgehaald hebben. We zullen in de geretourneerde recordset dus niet de beschikking krijgen over de nieuwe data. Dit kan functioneel gezien onwenselijk zijn, waardoor een alternatieve oplossing een beter resultaat kan geven.
Oplossing
Binnen SQL bestaat de NOCOUNT functie welke men aan en uit kan zetten binnen een procedure. Deze NOCOUNT functie onderdrukt het retourneren van het aantal regels dat een executie oplevert wanneer deze uitgevoerd wordt.
Deze NOCOUNT kan ingezet worden om BPA Platform een recordset van een specifieke executie op te laten halen. Neem als voorbeeld onderstaande query:
SET NOCOUNT ON
INSERT INTO Products VALUES ('ORBTC10','Orbis Taskcentre 10 taken editie')
INSERT INTO Products VALUES ('ORBTC25','Orbis Taskcentre 25 taken editie')
SET NOCOUNT OFF
Select * FROM Products
In de bovenstaande query zetten we NOCOUNT aan voordat we regels gaan toevoegen in de database, en zetten we deze wederom uit zodra we de SELECT willen gebruiken om regels op te halen. Alle interacties met de database die omsloten worden door een NOCOUNT tellen niet als een executie vanuit het perspectief van BPA Platform: In de bovenstaande query zal de SELECT statement als eerste interactie met de database gezien worden, waardoor de "This procedure returns a recordset" optie correct data van de SELECT zal retourneren.