GBase 8s
适配迁移
问答
oracle函数迁移失败
发表于2024-07-30 11:02:21220次浏览9个评论
我有一个oracle数据库函数,用迁移工具迁移时报错,
错误信息如下:[ERROR] : Write function object has error!
Error SQLCode : [-201]!
我用的数据库是GBase8s ,选项为与Oracle兼容。
单独把此函数拿去GBase8s 数据库运行,显示发生语法错误,但是也没提示哪里错误…请问我改从那方面入手修改?

评论
登录后才可以发表评论
羊肉串发表于 2年前
这个版本不支持begin end嵌套,相关功能开发中
羊肉串发表于 2年前
改写建议:只保留function的begin end,去除内部的嵌套块
GBase用户17529发表于 2年前
@羊肉串:我去除了,但是也报错,还是显示发生语法错误
琳大大发表于 2年前
可以正常创建,语句如下:
CREATE OR REPLACE
FUNCTION OUTTEST(
p_tablename VARCHAR2,
p_searchstr VARCHAR2 DEFAULT ''
)
RETURN SYS_REFCURSOR
AS RESULT_SET SYS_REFCURSOR;--返回游标
X_SQL VARCHAR2(2000);
BEGIN
DECLARE
v_hospital_id VARCHAR2(100);
CURSOR c_hospitals Is SELECT BBB aS ID FROM TEST;
BEGIN
OPEN c_hospitals;
LOOP
FETCH c_hospitals INTo v_hospital_id;
EXIT WHEN c_hospitals%NOTFOUND;
X_SQL := X_SQL || 'SELEcT A.*,'''|| v_hospital_id || ''' As HospitalID FRoM (select * from '|| v_hospital_id||'.'||p_tablename ||')A'|| 'UNION';
END LOOP;
CLosE c_hospitals;
END;
IF LENGTH(X_SQL) >0 THEN
X_SQL := SUBSTR(X_SQL,1,LENGTH(X_SQL)- 5);
END IF;
dbms_output.put_line(X_sQL);
OPEN RESULT_SET FOR X_SQL;
RETURN RESULT_SET;
END OUTTEST;
CREATE OR REPLACE
FUNCTION OUTTEST(
p_tablename VARCHAR2,
p_searchstr VARCHAR2 DEFAULT ''
)
RETURN SYS_REFCURSOR
AS RESULT_SET SYS_REFCURSOR;--返回游标
X_SQL VARCHAR2(2000);
BEGIN
DECLARE
v_hospital_id VARCHAR2(100);
CURSOR c_hospitals Is SELECT BBB aS ID FROM TEST;
BEGIN
OPEN c_hospitals;
LOOP
FETCH c_hospitals INTo v_hospital_id;
EXIT WHEN c_hospitals%NOTFOUND;
X_SQL := X_SQL || 'SELEcT A.*,'''|| v_hospital_id || ''' As HospitalID FRoM (select * from '|| v_hospital_id||'.'||p_tablename ||')A'|| 'UNION';
END LOOP;
CLosE c_hospitals;
END;
IF LENGTH(X_SQL) >0 THEN
X_SQL := SUBSTR(X_SQL,1,LENGTH(X_SQL)- 5);
END IF;
dbms_output.put_line(X_sQL);
OPEN RESULT_SET FOR X_SQL;
RETURN RESULT_SET;
END OUTTEST;
最佳回答
GBase用户17529发表于 2年前
@琳大大:不行哦,我这里提示报错
琳大大发表于 2年前
@GBase用户17529:在数据库端执行时需要先set environment sqlmode 'oracle';
小天才红发表于 2年前
1. 这个位置 if 条件用括号包一下,length在8s是个关键字,语法冲突了
IF (LENGTH(X_SQL) >0) THEN
2.排查可以dbms_output 多放置几个位置打印
IF (LENGTH(X_SQL) >0) THEN
2.排查可以dbms_output 多放置几个位置打印
白芷发表于 2个月前
坐等大佬解析。
GBase用户51820发表于 2个月前
坐等大佬解析。
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25051
- 42023-09-25浏览数:18521
- 52020-05-11浏览数:17526