在存储过程中使用了Cursor和其他多个参数,我使用TQuery控件调用的时候怎么都不行,请各位大虾小虾帮忙,谢谢!! (200分)

  • 主题发起人 主题发起人 bigfly
  • 开始时间 开始时间
B

bigfly

Unregistered / Unconfirmed
GUEST, unregistred user!
问题一 :在delphi中我使用Tstoreproc 控件调用存储过程是可以的,但是使用TQuery控件的时候
有问题。我用的是oracle 8i,BDE里面的设置应该没问题。

下面的是代码:

CREATE OR REPLACE PACKAGE Typedefine IS
TYPE mytype IS RECORD
(LOTID VARCHAR (40) ,
SHIFT VARCHAR (2) ,
PRODUCTNAME VARCHAR (40) );
TYPE my_cursor IS REF CURSOR RETURN mytype ;
END ;




CREATE OR REPLACE PROCEDURE sdb_test
(enddate IN VARCHAR2,startdate IN VARCHAR2,
Eqpid IN VARCHAR2,my_cursor IN OUT Typedefine.my_cursor)
IS
BEGIN
OPEN my_cursor FOR
SELECT lotid,shift,productname
FROM
temp_table
where shiftenddate=enddate
and shiftstartdate=startdate
ORDER BY txntimestamp ;
END ;



delphi中的程序是:
var
P1,P2,P3,P4:TParam ;
begin
Query1.Close ;
Query1.ParamCheck :=False ;
Query1.SQL.Clear ;

P1 := TParam.Create(Query1.Params, ptInput);
P2 := TParam.Create(Query1.Params, ptInput);
P3 := TParam.Create(Query1.Params, ptInput);
P4 := TParam.Create(Query1.Params, ptInputOutput);

Query1.Params[0].datatype := ftString ;
Query1.Params[1].datatype := ftString ;
Query1.Params[2].datatype := ftString ;
Query1.Params[3].datatype := ftCursor ;


Query1.SQL.Add('BEGIN sdb_test(:P1,:P2,:P3,:P4) ; END ;') ;
Query1.Params[0].AsString :='20021208' ;
Query1.Params[1].AsString :='20021201' ;
Query1.Params[2].AsString :='ABCD01' ;


Query1.ExecSQL ;
// Query1.Open ;
P1.Free ;
P2.free ;
P3.free ;
P4.free ;
end;


会报错,'can't find object ',应该就是不认识我设的参数 P1 P2 P3 ,
应该是我还是有不清楚的地方。


另,我用sqlplus 测试可以通过
variable v refcursor ;
execute sdb_test('20021208','20021201','ABCD01',:v) ;
 
如果是单引号
Query1.SQL.Add('begin SDB_TEST ('''20021208''','''20021201''','''ABCD01''') ; end ;') ;
如果是双引号
Query1.SQL.Add('begin SDB_TEST (''''20021208'''',''''20021201'''',''''ABCD01'''') ; end ;') ;
 
52free,这样不行,还是错误的。

有谁知道吗?
 
呵呵,好象是不可以用open 的吧。试试exesql
 
你用TStoredProc,
你用query好象不合适,就算可以,你想想用多少引号,增加了多少麻烦。
使用参数的时候你只要把自己在存储过程中设定的参数加上就可以了!
 
在query中这样调用存储过程
var
sqlstr:string;
begin
sqlstr:='execute (存储过程名(参数1,参数2,...))';
Qry.close;
Qry.sql.clear;
Qry.sql.add(sqlstr);
Qry.execSql;
end;
 
有知道错的原因的吗,分数可以再加,谢谢!!
 
谁要rm2.6给个地址发给你
 
问题一 :在delphi中我使用Tstoreproc 控件调用存储过程是可以的,但是使用TQuery控件的时候
有问题。我用的是oracle 8i,BDE里面的设置应该没问题。

下面的是代码:

CREATE OR REPLACE PACKAGE Typedefine IS
TYPE mytype IS RECORD
(LOTID VARCHAR (40) ,
SHIFT VARCHAR (2) ,
PRODUCTNAME VARCHAR (40) );
TYPE my_cursor IS REF CURSOR RETURN mytype ;
END ;




CREATE OR REPLACE PROCEDURE sdb_test
(enddate IN VARCHAR2,startdate IN VARCHAR2,
Eqpid IN VARCHAR2,my_cursor IN OUT Typedefine.my_cursor)
IS
BEGIN
OPEN my_cursor FOR
SELECT lotid,shift,productname
FROM
temp_table
where shiftenddate=enddate
and shiftstartdate=startdate
ORDER BY txntimestamp ;
END ;



Query1.SQL.Clear ;

{ P1 := TParam.Create(Query1.Params, ptInput);
P2 := TParam.Create(Query1.Params, ptInput);
P3 := TParam.Create(Query1.Params, ptInput);
P4 := TParam.Create(Query1.Params, ptInputOutput);

Query1.Params[0].datatype := ftString ;
Query1.Params[1].datatype := ftString ;
Query1.Params[2].datatype := ftString ;
Query1.Params[3].datatype := ftCursor ;}


Query1.SQL.Add('BEGIN sdb_test(:P1,:P2,:P3,:P4) ; END ;') ;
//这时会自动创建param
Query1.Params[0].AsString :='20021208' ;
Query1.Params[1].AsString :='20021201' ;
Query1.Params[2].AsString :='ABCD01' ;


Query1.ExecSQL ;
 
后退
顶部