云数据库 GAUSSDB-执行SQL语句:Oracle兼容模式启用重载时,调用存储过程

时间:2024-11-02 18:52:46

Oracle兼容模式启用重载时,调用存储过程

打开参数behavior_compat_options='proc_outparam_override'后,JDBC调用事先创建的存储过程,步骤如下:

  1. 调用Connection的prepareCall方法创建调用语句对象。

    1
    2
    3
    4
    5
    6
    // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全;
    // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
    String userName = System.getenv("EXAMPLE_USERNAME_ENV");
    String password = System.getenv("EXAMPLE_PASSWORD_ENV");
    Connection conn = DriverManager.getConnection("url",userName,password);
    CallableStatement cs = conn.prepareCall("{ CALL TEST_PROC(?,?,?) }");
    

  2. 调用CallableStatement的setInt方法设置参数。

    1
    2
    3
    4
    PGobject pGobject = new PGobject();
    pGobject.setType("public.compfoo"); // 设置复合类型名,格式为“schema.typename”。
    pGobject.setValue("(1,demo)"); // 绑定复合类型值,格式为“(value1,value2)”。
    cs.setObject(1, pGobject);
    

  3. 调用CallableStatement的registerOutParameter方法注册输出参数。

    1
    2
    // 注册out类型的参数,类型为复合类型,格式为“schema.typename”。
    cs.registerOutParameter(2, Types.STRUCT, "public.compfoo");  
    

  4. 调用CallableStatement的execute执行方法调用。

    1
    cs.execute();
    

  5. 调用CallableStatement的getObject方法获取输出参数。

    1
    2
    3
    4
    PGobject result = (PGobject)cs.getObject(2);  // 获取out参数 
    result.getValue(); // 获取复合类型字符串形式值。
    result.getArrayValue(); //获取复合类型数组形式值,以复合数据类型字段顺序排序。
    result.getStruct(); //获取复合类型子类型名,按创建顺序排序。
    

  6. 调用CallableStatement的close方法关闭调用语句。

    1
    cs.close();
    
    • oracle兼容模式开启参数后,调用存储过程必须使用{call proc_name(?,?,?)}形式调用,调用函数必须使用{? = call func_name(?,?)}形式调用(等号左侧的“?”为函数返回值的占位符,用于注册函数返回值)。
    • 参数behavior_compat_options='proc_outparam_override'行为变更后,业务需要重新建立连接,否则无法正确调用存储过程和函数。
    • 函数和存储过程中包含复合类型时,参数的绑定与注册需要使用schema.typename形式。

示例:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 在数据库创建复合数据类型。
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;
/
support.huaweicloud.com/centralized-devg-v2-gaussdb/devg_03_0096.html