delphi客户端调用存储过程返回参数,请问怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi客户端调用存储过程返回参数,请问怎么解决相关的知识,希望对你有一定的参考价值。

开发环境:Delphi XE 10.1 Update 2
服务器:FDConnection1-->FDQuery1-->DataSetProvider1
客户端:SQLConnection1-->DSProviderConnection1-->ClientDataSet5

procedure TFrame01_Frame.Button3Click(Sender: TObject);
begin
ClientDataSet5.Close;
// FormID、Opid是传入值,doccode是传出值 注意参数不能带@,传出值不要加output,传入、传出类型已在CreateParam时指定了
ClientDataSet5.CommandText := ' Execute _sysP_NewDocCode :FormID,:Opid,:doccode ';
ClientDataSet5.Params.Clear;
ClientDataSet5.Params.CreateParam(ftString,'FormID',ptInput);
ClientDataSet5.Params.CreateParam(ftString,'Opid',ptInput);
ClientDataSet5.Params.CreateParam(ftString,'doccode',ptOutput);
ClientDataSet5.Params.ParamByName('FormID').Size := 30;
ClientDataSet5.Params.ParamByName('FormID').Value :='Sale2002';
ClientDataSet5.Params.ParamByName('Opid').Size := 20;
ClientDataSet5.Params.ParamByName('Opid').Value :='191025';
ClientDataSet5.Params.ParamByName('doccode').Size := 20;
ClientDataSet5.Execute;//如果不返回结果集,执行此语句
//ClientDataSet5.Open;
Edit2.Text := ClientDataSet5.Params.ParamByName('doccode').Value;
end;

特别注意:参数不能带@,传出值不要加output,传入、传出类型已在CreateParam时指定了,这两坑有点深耗费多天时间查询资料以及摸索。
希望能够对大家有用,少走些弯路,同大家结菩提缘
参考技术A outputdate在存储过程中要定义为OUTPUT类型的参数.TClientDataSet.CommandText:= ' Declare @OutputData int '#13#10'Excute StoredProc1 @OutputData Output'#13#10'Select @OutputData ';SELECT @outputdate 返回一个结不雅集,如同返回一个表一样,只有一个字段,一笔记录.YES.如不雅存储过程最后一行是select语句(返回结不雅集),方可用OPEN打开.同时返回记录和参数.不然只返回参数....clientdataset.Parambyname('@time1').Value := now;result := clientdataset.Parambyname('@get1').Value; 查看原帖>>本回答被提问者采纳

mysql 存储过程怎么赋值?

如图所以,我用游标查询出值赋值table_names 变量,现在我想把table_name 变量的值赋给下面那条语句,请问怎么赋值?我现在这样它table_name变量直接当表名了,报一个表不存在的错误。

DELIMITER $$
USE `test`$$
DROP PROCEDURE IF EXISTS `p_getAllTablesCount`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `p_getAllTablesCount`()
BEGIN
        DECLARE tableName VARCHAR (100);
        DECLARE tablesn VARCHAR (100);
        DECLARE tableCount INT;
        DECLARE stopFlag INT;
        DECLARE sqlStr VARCHAR(1000);
        -- 注意:请修改数据库名称
        DECLARE cursor_name CURSOR  FOR SELECT TABLE_NAME  FROM information_schema.tables WHERE table_schema='test';
        DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'  SET stopFlag=1;
        CREATE TABLE IF NOT EXISTS temp_table(table_name VARCHAR(100),table_count VARCHAR(100));   
        OPEN cursor_name;
        REPEAT
        FETCH cursor_name INTO tableName;
        SET sqlStr = CONCAT('SELECT COUNT(1) into @tableCount FROM ', tableName);
        SELECT sqlStr INTO @sqlStr;
        -- select  @sqlStr;
        SELECT @tableCount INTO tableCount;
        BEGIN
          PREPARE stepInsertIntoTable FROM @sqlStr;
          EXECUTE stepInsertIntoTable;
        END;
        SET sqlStr = CONCAT('insert into  temp_table values(''',CONCAT(tableName),''',''',CONCAT(tableCount),''');');
        SELECT sqlStr INTO @sqlStr;
        BEGIN
            PREPARE stepInsertIntoTable FROM @sqlStr;
            EXECUTE stepInsertIntoTable;
        END;
        UNTIL stopFlag  END REPEAT;
        CLOSE cursor_name;   
        SELECT table_name,table_count FROM temp_table ORDER BY table_count DESC;
        -- PREPARE step FROM @sql1;
        -- EXECUTE step;
        DROP TABLE  temp_table;
    END$$
DELIMITER ;

追问

是能赋值成功了,但是查询数据一直为0。。怎么回事?

追答

你的可以调试啊,用的是什么环境啊? 你需要编译执行啊!
BEGIN
PREPARE stepInsertIntoTable FROM @sqlStr;
EXECUTE stepInsertIntoTable;
END;

追问

调试工具 Debugger for MySQL,你需要可以给你发或者你百度下载一个。

我把语句换了就报这么一个错,意思是说:你有一个错误在您的sql语法,检查对应于您的mysql服务器版本的手册正确的语法使用“在1号线附近,你能看出什么问题不?蛋疼啊。实在不懂mysql。。。

追答

你debug的时候,为什么 没有打印完整啊?

追问

我也不清楚,反正调试的时候那个sqlstr就是显示那么多?如果我把where 条件去掉便成功。无语啊!!

追答

要不 你把整个 SQL脚本发给我,我调试看看?

追问

我明白了,声明变量的时候只声明了varchar(100),爆汗啊、、、。

参考技术A Mysql存储过程查询结果赋值到变量的方法

把查询结果赋值到变量,大部分情况下使用游标来完成,但是如果明确知道查询结果只有一行(例如统计记录的数量,某个字段求和等),其实可以使用set或into的方式来实现赋值。示例代码:

drop table if exists test_tbl;
create table test_tbl (name varchar(20), status int(2));
insert into test_tbl values('abc', 1),('edf', 2),('xyz', 3);
drop procedure IF EXISTS pro_test_3;
delimiter //
create procedure pro_test_3()
begin
DECLARE cnt INT DEFAULT 0;
select count(*) into cnt from test_tbl;
select cnt;
-- 多个列的情况下似乎只能用 into 方式
select max(status), avg(status) into @max, @avg from test_tbl;
select @max, @avg;
end
delimiter ;
call pro_test_3();
参考技术B insert into sddd(dsfsafa)values("dfdfdfe");

以上是关于delphi客户端调用存储过程返回参数,请问怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

请问如何用c++ 调用oracle存储过程?

请问MyBatis.net 如何执行一个不需要参数但返回结果集的oracle数据库的存储过程?

请问:delphi 中数组作为函数的参数传递,这样传过去的是地址,怎样把数组作为值传递过去?

delphi 获取网页js返回数据

delphi怎样在ADO里用ADOproc调用数据库sql server存储过程?,用ADODATASET或者ADOQUERY又怎样调用存储过程?

那位大侠教教我。delphi怎么调用sql 还有就是直接调用sql的存储过程