GBase 8s
适配迁移
问答

在DataStudio工具创建测试函数成功,sql创建函数复制到sql中执行失败,创建函数如何创建?

发表于2026-01-16 10:59:32163次浏览20个评论

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

【GBase版本】:Gbase8sV8.8_3.6.3

【操作系统】:银河麒麟

【CPU】:英特尔

【问题描述】*:

数据库工具中点击创建函数提供的测试函数保存成功,但是用sql复制到执行窗口执行报错,是有啥限制么?我如何用sql创建自定义函数,语法规则是什么?

评论

登录后才可以发表评论
用户头像
路路路发表于 6个月前
稍等技术回复
笙歌发表于 6个月前
@路路路:没有技术答复解决此问题么?
用户头像
GBase用户28017发表于 6个月前
查看一下官方文档。
用户头像
GBase用户28017发表于 6个月前
成功了吗?
用户头像
小鱼不吐泡泡发表于 6个月前
选择oracle模式的话应该按照oracle的使用习惯走,这么写,能正常执行
create or replace function test(c in number) return number
is
begin
return 100;
end;
/
笙歌发表于 6个月前
@小鱼不吐泡泡:新建窗口是不行的,执行报错。
用户头像
小鱼不吐泡泡发表于 6个月前
@笙歌:配的是oracle模式么
用户头像
GBase用户28017发表于 6个月前
可以了吗
用户头像
GBase用户28017发表于 6个月前
好用了吗?
笙歌发表于 6个月前
@GBase用户28017:再工具中函数下,手动创建函数,复制代码可以,但是在新建查询窗口新建函数还是不行的
欣禾发表于 6个月前
可以尝试下这个格式,服务器版本:GBase8sV8.8_TL_3.6.3_3X2_1_783c8d,客户端win10:GBaseDataStudio_8.5.24.0


DROP FUNCTION IF EXISTS read_address ;

DELIMITER $$
CREATE FUNCTION read_address(val VARCHAR)
RETURN VARCHAR
as
v_res varchar;
begin
v_res := CONCAT(val, '!!!');
return v_res;
END;
DELIMITER $$



CALL gbasedbt.read_address('hello');


官方参考文档:https://www.gbase.cn/docs/gbase-8s/05%20%E6%95%B0%E6%8D%AE%E5%BA%93%E5%BC%80%E5%8F%91/03%20SQL%E6%8C%87%E5%8D%97%E8%AF%AD%E6%B3%95/03%20SPL%E8%BF%87%E7%A8%8B%E8%AF%AD%E5%8F%A5
笙歌发表于 6个月前
@欣禾:还是不行的,在客户端工具函数新建函数是可以的,但是在新建查询窗口执行创建函数时失败报错的,因为涉及升级过程中,升级批处理文件需要执行sql创建函数。不能每个函数需要工具函数中手动创建。
欣禾发表于 6个月前
@笙歌:那需要联系下官方的技术支持了,直接打电话好点,社区提问回复慢
用户头像
mittens发表于 6个月前
学习了
用户头像
mittens发表于 6个月前
学习一下
笙歌发表于 6个月前
执行时
delimiter %%
函数或者存储过程
%%
delimiter
GBase用户11306发表于 5个月前
@笙歌:是的,执行存储过程/函数 的时候,需要在其前后加上“定义语句分隔符”。
我试验了一下,加上分隔符定义后可以执行的。
GBase用户11306发表于 5个月前
@笙歌:客户端应该是按分号截断执行了,只执行到第一个分号的语句就报错语法错了。
create
or replace function test (c in number) return number is begin return 100;
GBase用户11306发表于 5个月前
我试验了一下,执行存储过程/函数时,需要在前后加上 分隔符的定义。
delimiter %%
create
or replace function test (c in number) return number is begin return 100;
end;
%%
我是这么写的,可以执行成功。
最佳回答
GBase用户11306发表于 5个月前
@GBase用户11306:delimiter /
create
or replace function test (c in number) return number is begin return 100;
end;
/
这样也管用