
# 完整示例
```
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);
  }
 }
}
```
#### 结果验证
[完整示例](https://support.huaweicloud.com/bestpractice-gaussdb/gaussdb-22-0115.html#ZH-CN_TOPIC_0000002663779865)可以正确查询到自定类型的数据，[完整示例](https://support.huaweicloud.com/bestpractice-gaussdb/gaussdb-22-0115.html#ZH-CN_TOPIC_0000002663779865)的运行结果如下所示：
```
1
demo
(10,demo10)
(11,demo111)
```
#### 回退方法
不涉及
