Stored Procedures mit FB_DBStoredProceduresRecordArray
Mithilfe des Funktionsbausteins FB_DBStoredProceduresRecordArray können Parameter als INPUT, OUTPUT oder INOUT deklariert werden und den gespeicherten Prozeduren (Stored Procedures) übergeben werden. So können komplexe SQL-Kommandos am Datenbank-Server vorprogrammiert und dann vom TwinCAT Database Server getriggert werden. Im Gegensatz zum FB_DBStoredProceduresRecordReturn-Baustein können mehrere Datensätze mit einem Aufruf zurückgeliefert werden.
Download: TcDBSrv_InfoSysSamples.zip
Verwendeter Datenbanktyp | MS SQL (MS SQL Server 2008) |
Kompatible Datenbanktypen | MS SQL, MySQL, Oracle |
Verwendete Funktionsbausteine | FB_DBStoredProceduresRecordArray |
Einzubindende Bibliotheken | Tc2_Database, Tc2_System, Tc2_Base, Tc2_Utilities |
Download Dateiliste | TcDBSrv_InfoSysSamples.tszip, CurrentConfigDataBase.xml |
Das folgende Beispiel zeigt den Aufruf einer einfachen gespeicherten Prozedur (Stored Procedure) mit einem Eingangsparameter und Rückgabedatensatz. Die Prozedur wurde an einem Microsoft SQL Server 2008 erstellt.
Code der Stored Procedure SP_GetAddressByCustomerID
CREATE PROCEDURE [SP_GetAddressByCustomerID]
@Customer_ID bigint
AS
BEGIN
SELECT tbl_Customer.ID, tbl_Customer.Name, tbl_Customer.Customer, tbl_Products.SerNum,
tbl_Products.Product, tbl_Products.Info, tbl_Pos.Timestamp
FROM
tbl_Pos JOIN tbl_Customer ON tbl_Pos.CustomerNum = tbl_Customer.ID
JOIN tbl_Products ON tbl_Pos.ProductNum = tbl_Products.SerNum
WHERE
tbl_Pos.CustomerNum = @Customer_ID;
END
Variablendeklaration in der SPS
PROGRAM MAIN
VAR
R_TRIG1 : R_TRIG;
bREAD : BOOL := FALSE;
nState : BYTE;
arrParaList : ARRAY [0..0] OF ST_DBParameter;
nCustomerID : DINT := 12345;
FB_DBStoredProceduresRecordArray1: FB_DBStoredProceduresRecordArray;
nCustomerID: DINT:= 12345;
nRecordStartIndex: UDINT;
stRecordArr : ARRAY [1..25] OF ST_Record;
nRecs : UDINT;
bBusy : BOOL;
bErr : BOOL;
nErrid : UDINT;
stSqlstate : ST_DBSQLError;
END_VAR
Datensatzstruktur in der SPS (ST_Record)
TYPE ST_Record :
STRUCT
nID : T_ULARGE_INTEGER;
sCustomer : STRING(50);
sName : STRING(50);
nProductNum : DINT;
sProductName: STRING(50);
sProductInfo: T_MaxString;
tTimestamp : DT;
END_STRUCT
END_TYPE
SPS-Programm
R_TRIG1(CLK:=bREAD);
IF R_TRIG1.Q AND NOT bBusy THEN
nState := 1;
END_IF
CASE nState OF
0:
;
1:(*Init of the parameters*)
arrParaList[0].sParameterName := '@Customer_ID';
arrParaList[0].eParameterDataType:= eDBColumn_Integer;
arrParaList[0].eParameterType := eDBParameter_Input;
arrParaList[0].cbParameterValue := SIZEOF(nCustomerID);
arrParaList[0].pParameterValue := ADR(nCustomerID);
nState := 2;
2:(*Start the stored procedure "SP_GetCustomerPosition"*)
FB_DBStoredProceduresRecordArray1(
sNetID:= ,
hDBID:= 1,
sProcedureName := 'SP_GetCustomerPositions',
cbParameterList := SIZEOF(arrParaList),
pParameterList := ADR(arrParaList),
nStartIndex := nRecordStartIndex,
nRecordCount := 25,
cbRecordArraySize:= SIZEOF(stRecordArr),
pDestAddr := ADR(stRecordArr),
bExecute := TRUE,
tTimeout := T#15s,
bBusy => bBusy,
bError => bErr,
nErrID => nErrid,
sSQLState => stSqlstate,
nRecords => nRecs);
IF NOT bBusy THEN
FB_DBStoredProceduresRecordReturn1(bExecute:= FALSE);
nState := 0;
END_IF
END_CASE
Visualisierung
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken |
---|---|---|
TwinCAT v3.0.0 | PC oder CX (x86) | Tc2_Database |