返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

GBA-02EX-0008
错误码
错误标识
错误信息
GBA-02EX-0008
ER_EXECUTOR_QU
ERY
Child process exited abnormally
错误出现原因
子进程异常退出
分析与建议
子进程异常退出,查看系统状态

打开参数behavior_compat_options='proc_outparam_override'后,JDBC 调用事先创建的
存储过程,步骤如下:
步骤1 调用Connection 的prepareCall 方法创建调用语句对象。
Connection conn = DriverManager.getConnection("url","user","password"); CallableStatement
cs = conn.prepareCall("{ CALL TEST_PROC(?,?,?) }");
步骤2 调用CallableStatement 的setInt 方法设置参数。
PGobject pGobject = new PGobject();
pGobject.setType("public.compfoo"); // 设置复合类型名,格式为“schema.typename”。
pGobject.setValue("(1,demo)"); // 绑定复合类型值,
格式为
“(value1,value2)”

cs.setObject(1,
pGobject);
步骤3 调用CallableStatement 的registerOutParameter 方法注册输出参数。
// 注册out 类型的参数,类型为复合类型,格式为“schema.typename”。
cs.registerOutParameter(2, Types.STRUCT, "public.compfoo");
步骤4 调用CallableStatement 的execute 执行方法调用。
cs.execute();
步骤5 调用CallableStatement 的getObject 方法获取输出参数。
PGobject result = (PGobject)cs.getObject(2);
// 获取out 参数
result.getValue(); // 获取复合类型字符串形式值。
result.getArrayValue(); //获取复合类型数组形式值,以复合数据类型字段顺序排序。
result.getStruct(); //获取复合类型子类型名,按创建顺序排序。
步骤6 调用CallableStatement 的close 方法关闭调用语句。
cs.close();

oracle 兼容模式开启参数后,调用存储过程必须使用{call proc_name(?,?,?)}形式调
用,调用函数必须使用{? = call func_name(?,?)}形式调用(等号左侧的“?”为函数
返回值的占位符,用于注册函数返回值)。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
80

参数behavior_compat_options='proc_outparam_override'行为变更后,业务需要重新
建立连接,否则无法正确调用存储过程和函数。

函数和存储过程中包含复合类型时,参数的绑定与注册需要使用schema.typename
形式。
// 在数据库创建复合数据类型。
CREATE TYPE compfoo AS (f1 int, f3 text);
// 在数据库中已创建了如下存储过程,它带有out 参数。
create or replace procedure test_proc (
psv_in in compfoo, psv_out out compfoo
)
as begin
psv_out := psv_in; end;
/
----结束

WHILE_LOOP 语句
语法图
只要条件表达式为真,WHILE 语句就会不停的在一系列语句上进行循环,在每次进入
循环体的时候进行条件判断。
示例
CREATE TABLE integertable(c1 integer) ;
CREATE OR REPLACE PROCEDURE proc_while_loop(maxval in integer)
AS
DECLARE
i int :=1;
BEGIN
WHILE i < maxval LOOP
INSERT INTO integertable VALUES(i);
i:=i+1;
END LOOP;
END;

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
650
/
--调用函数
CALL proc_while_loop(10);
--删除存储过程和表
DROP PROCEDURE proc_while_loop;
DROP TABLE integertable;