注册

请问下, 应用层如何获取存储过程的返回值

DM_878959 2022/07/18 1246 4

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:CentOS7
【CPU】:
【问题描述】*:
需求简化如下:
有张表 test, 数据如下

drop table if exists test cascade;
create table test(id int, name varchar);
drop sequence seq_test_id;
create sequence seq_test_id ;

CREATE OR REPLACE function func_test(v_name varchar) 
return int
AS
DECLARE 
    v_id int;
BEGIN
     v_id:=seq_test_id.nextval;
    insert into test values(v_id,v_name);
    return v_id;
END;

select func_test('a');
SQL> select func_test('a');
select func_test('a');
[-7145]:DML not supported in QUERY
-7145: func_test line 8 .

直接通过函数, 发现函数中不支持DML操作
然后转而使用 存储过程来实现

drop procedure pro_test;
CREATE OR REPLACE function pro_test(v_name varchar, v_id out int) 
return int
AS
DECLARE 
    
BEGIN
    v_id:=seq_test_id.nextval;
    insert into test values(v_id,v_name);
    commit;
END;
/

declare
    res int;
begin
    call pro_test('a',res);
    print('res='||res);
end;
/

执行结果:

declare
    res int;
begin
    call pro_test('a',res);
    print('res='||res);
end;
2   3   4   5   6   7   /
res=1

可是如何在 应用程序(比如C 或者 Python)中 通过函数或者说存储过程来实现

往表 test 中插入一条记录, 然后返回 res_id 值

下面是PG中的实现方式供参考

drop table if exists test cascade; create table test(id int, name varchar); drop sequence seq_test_id; create sequence seq_test_id; CREATE OR REPLACE FUNCTION func_test(v_name varchar) RETURNS INTEGER AS $BODY$ DECLARE v_id int; BEGIN v_id=nextval('seq_test_id'); insert into test(id,name) values(v_id, v_name) ; return v_id; END; $BODY$ LANGUAGE 'plpgsql' ; select * from func_test('zhangsan'); postgres=# select * from func_test('zhangsan'); func_test ---------- 1 (1 row) 应用层代码在执行 select * from func_test('zhangsan'); 这个SQL 之后, 可以直接获取返回值, 但是在 达梦中 函数里面不允许使用 DML 操作(当然也可能是我对达梦不熟悉, 可能有其他使用方式来实现DML操作), 那我想到的是通过存储过程来实现 DML 操作, 但是要返回值, 只能通过out 参数, 可是我不知道如果在应用层代码里面 调用存储过程之后, 获取到存储过程中的返回值 或者是否通过函数就能实现我的需求 postgres=# select * from test; id | name ----+---------- 1 | zhangsan (1 row)
回答 0
暂无回答
扫一扫
联系客服