为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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
往表 test 中插入一条记录, 然后返回 res_id 值
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)
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 procedure func_test(v_name varchar)
AS
DECLARE
v_id int;
BEGIN
v_id:=seq_test_id.nextval;
insert into test values(v_id,v_name);
select v_id;
END;
/
select * from test ;
call func_test('a');
select * from test ;
call func_test('b');
select * from test ;
SQL> select * from test ;
SQL>
call func_test('a');
LINEID v_id
---------- -----------
1 1
SQL> select * from test ;
LINEID id name
---------- ----------- ----
1 1 a
SQL> call func_test('b');
LINEID v_id
---------- -----------
1 2
SQL> select * from test ;
LINEID id name
---------- ----------- ----
1 1 a
2 2 b
SQL>
你好!这函数中好像新增update语句,也是报“-7145: 无法在查询中执行DML操作” 错误
这个问题用存储过程是正解,应用中定义一个变量,然后用带?的方式去调用这个存储过程,用这个变量绑定返回参数即可,参考下面这个例子,虽然是绑定游标变量的。
https://blog.csdn.net/myth8860/article/details/108537765