存储过程的参数以及一件怪事(50分)

  • 主题发起人 主题发起人 perfectsummer
  • 开始时间 开始时间
P

perfectsummer

Unregistered / Unconfirmed
GUEST, unregistred user!
1.在ORACLE中存储过程的参数是保存在哪里?我知道DESC可以看到,可是我想在程序中动态
的获得他的参数。

2.如下代码,走到query1.open时提示说:ACCESS VIOLATION,无论在这里写什么SQL
都错了,不知道是什么原因啊。谢谢啊。
procedure TForm1.Button1Click(Sender: TObject);
var id,iFileLength ,fHandle :integer;
fname :string;
buffer :pchar;
begin
if opendialog1.Execute then
begin
fname :=extractfilename(opendialog1.FileName);
fhandle :=fileopen(fname,fmOpenRead);
iFileLength :=fileseek(fhandle,0,2);
fileseek(fhandle,0,0);
buffer := PChar(AllocMem(iFileLength + 1));
fileread(fhandle,buffer,iFileLength);
fileclose(fhandle);
end;
with query1 do
begin
close;
sql.Clear;
sql.Add('select max(id)+1 from jjww');
open;
...
end;
end;
 
将Query的RequestLive = fAlse
 
query1.RequestLive = False
 
原来的RequestLive :=False;

这里改正一下,不是这里错了

procedure TForm1.Button1Click(Sender: TObject);
var tmpid :integer;
fname :string;
fhandle :integer;
buffer :pchar;
iFileLength :integer;
begin
if opendialog1.Execute then
begin
fname :=extractfilename(opendialog1.FileName);
fhandle :=fileopen(fname,fmOpenRead);
iFileLength :=fileseek(fhandle,0,2);
fileseek(fhandle,0,0);
buffer := PChar(AllocMem(iFileLength + 1));
fileread(fhandle,buffer,iFileLength);
fileclose(fhandle);
end;
with query1 do
begin
close;
sql.Clear;
sql.Add('select max(id)+1 from pomp');
open;
tmpid :=fields[0].AsInteger;
close;
end;
query2.Close;
with query2 do
begin
close;
Sql.Clear;
Sql.Add('insert into pomp values(:id ,:filename, :content)');
Params[0].AsInteger :=tmpid;
Params[1].AsString :=fname;
Params[2].AsBlob :=buffer;
ExecSQL;
end;

在params[0].AsInteger :=tmpid;时就出错了,说:
List out of bound,一直高不懂。谢谢指点啊
 
你在Query2当中定义参数了吗?
需要先定义好参数, 才可以使用!
把SQL语句直接写道 Query2的SQL里面insert into pomp values(:id ,:filename, :content)
选择Id,filename,conten的类型 设置成Input!
执行的时候直接给参数复值
Params[0].AsInteger :=tmpid;
Params[1].AsString :=fname;
Params[2].AsBlob :=buffer;
ExecSQL;
就可以了!
 
不对啊,当然应该可以直接在程序中写SQL啊,不过这个现在没关系了。

谢谢大家帮忙,现在我最想知道的就是第一个问题的答案了。

帮我想周围的人咨询一下好吗?

谢谢了!!!
 
我搞定了,不过有点麻烦,基本上是抄Delphi的

type
ProcParam =record
ParamName :string;
ParamType :TParamType;
DataType :TFieldType;
end;
VarProcParam =array of ProcParam;

function GetProcParam(Proc :TStoredProc) :VarProcParam;
var
Desc: SPParamDesc;
Cursor: HDBICur;
Buffer: DBISPNAME;
ParamName: string;
ParamDataType: TFieldType;
V_tmpParam :VarProcParam;
V_Count :integer;
begin
Result :=nil;
AnsiToNative(Proc.DBLocale, Proc.StoredProcName, Buffer, SizeOf(Buffer)-1);
if DbiOpenSPParamList(Proc.DBHandle, Buffer, False, Proc.OverLoad, Cursor) = 0 then
while DbiGetNextRecord(Cursor, dbiNOLOCK, @Desc, nil) = 0 do
begin
with Desc do
begin
NativeToAnsi(Proc.DBLocale, szName, ParamName);
if (TParamType(eParamType) = ptResult) and (ParamName = '') then
ParamName := SResultName;
if uFldType < MAXLOGFLDTYPES then
ParamDataType := DataTypeMap[uFldType]
else
ParamDataType := ftUnknown;

case uFldtype of
fldFloat:
if uSubType = fldstMONEY then
ParamDataType := ftCurrency;
fldBlob:
if (uSubType >= fldstMEMO) and (uSubType <= fldstBFILE) then
ParamDataType := BlobTypeMap[uSubType];
end; //end case uFldtype

with TParam(Proc.Params.Add) do
begin
ParamType := TParamType(eParamType);
DataType := ParamDataType;
Name := ParamName;
end; //end with TParam

SetLength(V_tmpParam,Proc.ParamCount);
for V_Count :=0 to Proc.ParamCount-1 do
begin
V_tmpParam[V_Count].ParamName :=Proc.Params[V_Count].Name;
V_tmpParam[V_Count].ParamType :=Proc.Params[V_Count].ParamType;
V_tmpParam[V_Count].DataType :=Proc.Params[V_Count].DataType;
end;
end; //end with desc
Result :=V_tmpParam;
end;
end;
 
谢谢大家了,以后有问题可以再来,可是就要没分 了
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
926
SUNSTONE的Delphi笔记
S
I
回复
0
查看
825
import
I
后退
顶部