更新时间:2025-08-19 GMT+08:00
分享

完整示例

import com.huawei.gaussdb.jdbc.jdbc.PgArray;
import com.huawei.gaussdb.jdbc.util.PGobject;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.sql.DriverManager;
public class TypesTest {
 public static Connection getConnection() throws ClassNotFoundException, SQLException {
        String driver = "com.huawei.gaussdb.jdbc.Driver";
        // 指定数据库sourceURL($ip、$port、database根据实际业务进行修改)。
        String sourceURL = "jdbc:gaussdb://$ip:$port/database";
        // 用户名和密码从环境变量中获取。
        String userName = System.getenv("EXAMPLE_USERNAME_ENV");
        String password = System.getenv("EXAMPLE_PASSWORD_ENV");
        Class.forName(driver);
        return DriverManager.getConnection(sourceURL, userName, password);
    }
 public static void main(String[] args) {
  try {
   Connection conn = getConnection();
   Statement statement = conn.createStatement();
   statement.execute("set behavior_compat_options='proc_outparam_override'");
   statement.close();
   CallableStatement cs = conn.prepareCall("{CALL PUBLIC.TEST_PROC(?,?,?,?)}");
   // 设置参数。
   PGobject pgObject = new PGobject();
   pgObject.setType("public.compfoo"); // 设置复合类型名。
   pgObject.setValue("(1,demo)"); // 绑定复合类型值。
   cs.setObject(1, pgObject);
   pgObject = new PGobject();
   pgObject.setType("public.compfoo_table"); // 设置Table类型名。
   pgObject.setValue("{\"(10,demo10)\",\"(11,demo111)\"}"); // 绑定Table类型值,格式为"{\"(value1,value2)\",\"(value1,value2)\",...}"。
   cs.setObject(2, pgObject);
   // 注册出参。
   // 注册out类型的参数,类型为复合类型。
   cs.registerOutParameter(3, Types.STRUCT, "public.compfoo");
   // 注册out类型的参数,类型为Table类型。
   cs.registerOutParameter(4, Types.ARRAY, "public.compfoo_table");
   cs.execute();
   // 获取输出参数。
   // 返回结构是自定义类型。
   PGobject result = (PGobject) cs.getObject(3); // 获取out参数。
   result.getValue(); // 获取复合类型字符串形式值。
   String[] arrayValue = result.getArrayValue(); // 获取复合类型数组形式值,以复合数据类型字段顺序排序。
   result.getStruct(); // 获取复合类型子类型名,按创建顺序排序。
   result.getAttributes(); // 返回自定义类型每列组成类型的对象,对于array类型和Table类型返回的是PgArray,对于自定义类型,封装的是PGobject,对于其他类型数据存储方式为字符串类型。
   for (String s : arrayValue) {
    System.out.println(s);
   }
   PgArray pgArray = (PgArray) cs.getObject(4);
   ResultSet rs = pgArray.getResultSet();
   Object[] array = (Object[]) pgArray.getArray();
   for (Object element : array) {
    System.out.println(element);
   }
   cs.close();
   conn.close();
  } catch (ClassNotFoundException | SQLException e) {
   throw new RuntimeException(e);
  }
 }
}

结果验证

完整示例可以正确查询到自定类型的数据,完整示例的运行结果如下所示:

1
demo
(10,demo10)
(11,demo111)

回退方法

不涉及

相关文档