起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1561|回复: 4

存储过程的使用

[复制链接]
发表于 2004-4-6 16:19:43 | 显示全部楼层 |阅读模式
1、无需调整存储过程,直接提交后台执行

  Query1.Close;
  Query1.CommandText := P_INYEAR_CWYS 参数1, 参数2, 参数N';
  Query1.Execute;

2、create PROCEDURE P_INYEAR_CWYS (@AS_YEAR CHAR(4),@AS_YEAR1 CHAR(4),@AS_LCID VARCHAR(32)) AS
declare @as_return varchar(20)
INSERT TABLE_JH_ND_CWYSJH (ND,XH,XM,LCID) SELECT  @AS_YEAR1,XH,XM,@AS_LCID FROM TABLE_JH_ND_CWYSJH WHERE ND=@AS_YEAR
select @as_return

  或者 create PROCEDURE P_INYEAR_CWYS (@AS_YEAR CHAR(4),@AS_YEAR1 CHAR(4),@AS_LCID VARCHAR(32)) AS
declare @as_return varchar(20)
INSERT TABLE_JH_ND_CWYSJH (ND,XH,XM,LCID) SELECT  @AS_YEAR1,XH,XM,@AS_LCID FROM TABLE_JH_ND_CWYSJH WHERE ND=@AS_YEAR
select ''

然后:
var
  p1: TDataParam;
begin
  DataSetsp3.StoredProcName := 'dbo.Business3_5';
  DataSetsp3.Params.Clear;
  p1 := TDataParam.Create(DataSetsp3.Params, TParamType.ptInput);
  p1.Name := '@p1';
  p1.AsString := '4';
  try
    DataSetsp3.Open;
  finally
    p1.Free;
  end;
end;

  注意此时因为有返回结果集,要用Open而不是Exceute了。
回复

使用道具 举报

发表于 2004-7-6 10:42:46 | 显示全部楼层

在 SQLSERVER2000 中如何使用

环境SQLSERVER2000
这是一个存储过程和一段调用存储过程的例子

CREATE  PROCEDURE test1 (@input11 as varchar(10),@output11 as varchar(10) output) AS
declare @a integer
set @output11 = @input11
select 'return message'
return 1
GO

procedure TMainForm.Button1Click(Sender: TObject);
var
  lDataParam1, lDataParam2: TDataParam;
  ResultMessage: string;
begin
  try
    DataSetCCGCSJJ1.StoredProcName := 'dbo.test1';
    DataSetCCGCSJJ1.Params.Clear;
    lDataParam1 := DataSetCCGCSJJ1.Params.CreateParam(TFieldType.ftInteger, 'Result', TParamType.ptResult);
    lDataParam1 := DataSetCCGCSJJ1.Params.CreateParam(TFieldType.ftString, '@input11', TParamType.ptInput);
    lDataParam1.AsString := 'my name is input1';
    lDataParam2 := DataSetCCGCSJJ1.Params.CreateParam(TFieldType.ftString, '@output11', TParamType.ptOutput);
    DataSetCCGCSJJ1.Open;
     ResultMessage := DataSetCCGCSJJ1.Fields[0].AsString;
     Dialogs.ShowMessage(ResultMessage);
  finally
    lDataParam1.Free;
    lDataParam2.Free;
  end;
end;

使用存储过程数据集的时候需要注意2点
1、我们的存储过程数据集必须返回一个游标,可以在存储过程数据集中加一个“select '' ”返回一个空的游标来解决
2、在调用存储过程的时候,存储过程的名称要加上“dbo”
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-9-16 09:44:19 | 显示全部楼层

在 Oracle 中如何使用

连接到ORACLE时,推荐使用DBExpress连接到数据库。
但由于DBExpress对存储过程支持的BUG,用存储过程数据集调用ORACLE中返回游标的函数时,只能使用BDE连接到数据库。

但为了调用ORACLE中的返回游标的函数,可以在空间下新建一个使用BDE连接的数据库。
注意:这个数据库只为了给存储过程数据集提供数据库连接使用。其下不需要建立任何表定义。

只要指定存储过程的数据库为BDE连接的数据库后,就可以正常使用了。


更多信息:
目前“存储过程数据集”有以下约束:
  1、在ORACLE中必须是一个返回游标的函数,在SQLServer中必须是一个返回游标的过程。
  2、对于返回游标的函数(或过程),目前只支持输入参数,而不支持输出参数。

使用“存储过程数据集”调用ORACLE中的函数,其必须是一个返回游标的函数。
在ORACLE中写这样的函数可以使用下面的方法:

  1、在程序包中定义游标类型。

    CREATE OR REPLACE  PACKAGE "JUSTEPTEST"."USER_TYPE"  IS
      TYPE RETURN_CURSOR IS REF CURSOR;  
    END;

  2、定义不带参数的返回游标的函数。(下面代码中SJJ_WZKCB为“物资库存表”数据表)

    CREATE OR REPLACE  FUNCTION "JUSTEPTEST"."USER_SELECT"     
    RETURN USER_TYPE.RETURN_CURSOR IS
      Result USER_TYPE.RETURN_CURSOR;
    BEGIN
      OPEN Result FOR SELECT * FROM SJJ_WZKCB;
      RETURN Result;  
    END;

  3、定义带输入参数的返回游标的函数。(下面代码中KF为“物资库存表.库房编号”字段)

    CREATE OR REPLACE  FUNCTION "JUSTEPTEST"."USER_SELECT_P"
    (v_kf in varchar2)
    RETURN USER_TYPE.RETURN_CURSOR IS
      Result USER_TYPE.RETURN_CURSOR;
    BEGIN
      OPEN Result FOR SELECT * FROM SJJ_WZKCB WHERE KF = v_kf;
      RETURN Result;  
    END;
  
  4、对函数的测试可以使用下面的命令。

    SELECT JUSTEPTEST.USER_SELECT FROM dual;

有了返回游标的存储过程后,就可以使用存储过程数据集来表现它返回的结果集了,例如:

  //使用的命名空间:Business.System, Business.Forms, Business.Model, Business.Data, Borland.Delphi.DB;

  //主窗体中测试按钮(Button1)的Click事件
  procedure TMainForm.Button1Click(Sender: TObject);
  var
    lStoredProcDataSet: TStoredProcDataSet;
    lParam: TDataParam;
  begin
    //获取存储过程数据集
    lStoredProcDataSet := TStoredProcDataSet(DataSetBroker1.DataSet);
    //关闭数据集
    lStoredProcDataSet.Close;
    //清除所有已定义的参数
    lStoredProcDataSet.Params.Clear;
    //创建参数 Result 和 v_kf
    lStoredProcDataSet.Params.CreateParam(TFieldType.ftCursor, 'Result', TParamType.ptResult);
    lStoredProcDataSet.Params.CreateParam(TFieldType.ftString, 'v_kf', TParamType.ptInput);
    //获取输入参数 v_kf
    lParam := lStoredProcDataSet.Params.FindParam('v_kf');
    if (lParam <> nil) and (cbxKF.ItemIndex >= 0) then
    begin
      //如果参数获取成功、并且 cbxKF.Text 中指定了“库房编号”,则设置输入参数,并打开数据集
      lParam.AsString := cbxKF.Text;
      //存储过程数据集只能使用Open打开数据集,而不能使用Execute去执行。
      lStoredProcDataSet.Open;
    end
    else
      Business.Forms.Dialogs.ShowMessage('参数 v_kf 不存在,或未指定“库房编号”。');
  end;
回复 支持 反对

使用道具 举报

发表于 2004-10-12 16:51:25 | 显示全部楼层
在ORACLE中使用QUERY调用存储过程应该加上begin.......end;
例如:
Query.CommandText :='BEGIN 存储过程名称 ( 参数1, 参数2, 参数3); END;';
回复 支持 反对

使用道具 举报

发表于 2004-12-12 15:49:36 | 显示全部楼层
ORACLE的存储过程带“输出参数”好使吗?怎么我用的时候返回都是空的呢。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-23 00:25 , Processed in 0.040256 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表