У меня сделано через OCI.
Как в примере в Delphi по DOA:
library dept;
uses
SysUtils,
Oracle,
DeptDataModuleUnit in 'DeptDataModuleUnit.pas';
var
// The saved exit procedure
SaveExit: Pointer;
// The data module with a session and a query
DataModule: TDeptDataModule = nil;
// The OCI number result for the EmpCount function
EmpCountResult: TOCINumber = nil;
// Count the number of employees in the given department
function EmpCount(Context: Pointer; p_DeptNo: TOCINumber): TOCINumber; cdecl;
var
DeptNo: Integer;
begin
Result := nil;
with DataModule do
try
// Share the session of the caller with the TOracleSession
Session.ExtProcShare(Context);
// Convert the OCI number to a plain integer and set the variable
DeptNo := Session.OCINumberToInt(p_DeptNo);
EmpCountQuery.SetVariable('deptno', DeptNo);
// Execute the query that counts the employees
EmpCountQuery.Execute;
// Allocate an OCI number for the result if necessary
if EmpCountResult = nil then
EmpCountResult := Session.OCINumberCreate;
Result := EmpCountResult;
// Get the count from the result set
Session.OCINumberFromInt(Result, EmpCountQuery.Field('empcount'));
except
// Translate all Delphi exceptions to Oracle exceptions
on E: EOracleError do
Session.ExtProcRaise(E.ErrorCode, E.Message);
on E: Exception do
Session.ExtProcRaise(20000, E.Message);
end;
end;
// Free all preserved resources when the DLL is unloaded
procedure LibExit;
begin
if EmpCountResult <> nil then
DataModule.Session.OCINumberFree(EmpCountResult);
DataModule.Free;
// Restore the exit procedure
ExitProc := SaveExit;
end;
// Export the EmpCount function
exports
EmpCount;
begin
// Create the data module when the DLL is loaded
DataModule := TDeptDataModule.Create(nil);
// Save and override the exit procedure
SaveExit := ExitProc;
ExitProc := @LibExit;
end. |
|
Вот, все сделано как в help. Только функция другая :)....
Ну так вот, эту функцию мне надо будет в пределах одной оракловой сессии выполнять для разных значений.
В Oracle эта функция объявлена по типу того:
create or replace
function EmpCount(p_DeptNo in dept.deptno%type)
return number
as external language c
name "EmpCount"
library DeptLib
with context; |
|
а хочу вызывать эту функцию в цикле для разных отделов.
ну у меня для первого значения отрабатывает, а для всех остальных - нет