Delphi 6,Oracle 10g。
三层系统,server端调用Tquery执行语句:{call pkg_inventorytaking.Quer()}
本意是要返回数据集到到client端界面。
oracle package结构为:
CREATE OR REPLACE PACKAGE pkg_inventorytaking
AS 
  type cur_index is ref cursor; 
   PROCEDURE Query (ResultCursor OUT cur_index); 
end pkg_inventorytaking;
/CREATE OR REPLACE PACKAGE BODY pkg_inventorytaking
AS 
procedure Query (ResultCursor OUT cur_index)
IS
v_sql             varchar2(32767);
BEGIN
v_sql :='select语句 ' ;
open ResultCursor FOR
  v_sql; 
END ;
  
end pkg_inventorytaking;
/在sqlplus下执行
var abc refcursor
execute inventorytaking.Query(:abc)
print abc
该PACKAGE 可以正常运行。但是在delphi下运行时server端报错:
Project xxx.exe raised exception class EDBEngineError with message 'General SQL Error.'.Process stopped. Use step or Run to continue.如果将Tquery执行语句改为v_sql中的select语句则可正常执行,但是这里使用PACKAGE的本意是为了传递相关条件参数到v_sql中的select语句,为了简化测试,所以这里已经将所有参数都去掉了。可是还是测试不通过。也有尝试将tquery改为:
object Query1: TQueryDatabaseName = 'UseProc'SQL.Strings = (
'begin'
' Query (ResultCursor =>:RecCur);'
'end;')
ParamData = <
item
DataType = ftCursor
Name = 'RecCur'
ParamType = ptInputOutput
end>end但是还是发生报错:SQL无法applicated.那位大大指点一下迷津,先在这里谢过了

解决方案 »

  1.   

    自己顶一下,如果没人回答,就只好不用package了~~~
      

  2.   

    如果你用的是ODAC的话应该是用TOraPackage调的,而不是用query
      

  3.   

    adoconnection connection string:
    Provider=MSDAORA.1;Password=xxx;User ID=xxx;Data Source=orcl;Persist Security Info=True使用ADODataSet1:
    ADODataSet1.Close;
    ADODataSet1.CommandText:='{call pkg_test.getlist}';
    ADODataSet1.Open;
      

  4.   

    参考一下我BCB的
    http://topic.csdn.net/t/20061124/10/5181888.html
      

  5.   

    用Tquery不可以实现吗?因为我从另一个例子里看到的,我基本follow那个结构做的。是否Tquery的执行语句有问题呢?
    tquery.commondtext:='{call pkg_inventorytaking.Query()}' ;会报语法出错。
    如果设为tquery.commondtext:='call pkg_inventorytaking.Query()' ;则会报参数的数量或type不匹配Query()。是否需要把游标参数设出来呢?如果需要的话要怎么设呢?我设成'call pkg_inventorytaking.Query(:cur_index)'可是报operation can't applicated