File : oci-thick-statement_pkg.adb
with
System,
OCI.Thread;
--with Text_IO,System.Address_Image; use Text_IO,System;
package body OCI.Thick.Statement_pkg is
use Lib;
use type Sword;
use type Ub4;
use type OCIHandle;
procedure Destroy(Object : in out Statement) is
begin
OCI.Thick.Free(Object.Handle,OCI_HTYPE_STMT);
-- Put_Line("Statement freed");
end;
function Get_Stmt_Attr(Stmt : Statement'Class; Attr : Ub4)
return Integer is
Result : aliased Integer := 0;
Rsize : aliased Ub4 := Integer'Size/System.Storage_Unit;
Rc : Sword := OCIAttrGet (Trgthndlp => Stmt.Handle,
Trghndltyp => OCI_HTYPE_STMT,
Attributep => Result'access,
Sizep => Rsize'access,
Attrtype => Attr,
Errhp => Thread.Error);
begin
Check_Error(Rc);
return Result;
end Get_Stmt_Attr;
function Number_Of_Columns(Stmt : Statement) return Natural
is
begin
return Get_Stmt_Attr(Stmt, OCI_ATTR_Param_Count);
end Number_Of_Columns;
function Statement_Type(Stmt : Statement'Class) return Natural
is
begin
return Get_Stmt_Attr(Stmt, OCI_ATTR_STMT_TYPE);
end Statement_Type;
function Prepare(Connect : Connection; Code : String) return Statement
is
H : OCIHandle := Alloc_Handle(Thread.Environment, OCI_HTYPE_STMT);
Rc : Sword;
begin
Rc := OCIStmtPrepare (OCIStmt(H),
Thread.Error,
C.To_C(Code),
Code'Length);
Check_Error(Rc);
return (RF.Controlled_Reference with Handle => H,
Connect=>Connect,
Executed => False);
end Prepare;
procedure Execute(Stmt : in out Statement) is
Stype : Integer := Statement_Type(Stmt);
Rc : Sword := OCIStmtExecute (
OCISvcCtx(Handle(Stmt.Connect)),
OCIStmt(Stmt.Handle),
Thread.Error,
Boolean'Pos(Stype/=OCI_STMT_SELECT));
begin
Check_Error(Rc);
Stmt.Executed := True;
end Execute;
function Execute(Connect : Connection; Code : String) return Statement is
Result : Statement := Prepare(Connect,Code);
begin
Execute(Result);
return Result;
end;
procedure Execute(Connect : Connection; Code : String) is
dummy : Statement := Prepare(Connect,Code);
begin
Execute(dummy);
end;
function Executed(Stmt : Statement) return boolean is
begin
return Stmt.Executed;
end;
function Fetch(Stmt : Statement) return Boolean is
Rc : Sword := OCIStmtFetch(OCIStmt(Stmt.Handle),
Thread.Error);
begin
Check_Error(Rc);
return Rc=OCI_SUCCESS;
end Fetch;
function Get_Connection(Stmt : Statement) return Connection is
begin
return Stmt.Connect;
end;
end OCI.Thick.Statement_pkg;