gpt4 book ai didi

sql - 如何在 DB2 中使用嵌套结构化类型 (UDT)?

转载 作者:行者123 更新时间:2023-12-02 07:49:34 26 4
gpt4 key购买 nike

我正在尝试通过 DB2 使用嵌套结构化类型 (UDT),但遇到了一些问题。

以下是为用例创建类型、表、函数和转换的 SQL 语句。每个语句都执行得很好,但是在尝试执行简单的操作时会发生错误从 t_author 中选择 *:

CREATE TYPE u_street_type AS (
street VARCHAR(100),
no VARCHAR(30)
) INSTANTIABLE MODE DB2SQL;

CREATE TYPE u_address_type AS (
street u_street_type,
zip VARCHAR(50),
city VARCHAR(50),
country VARCHAR(50),
since DATE,
code INT
) INSTANTIABLE MODE DB2SQL;

CREATE TABLE t_author (
ID INT NOT NULL PRIMARY KEY,
FIRST_NAME VARCHAR(50),
LAST_NAME VARCHAR(50) NOT NULL,
DATE_OF_BIRTH DATE NOT NULL,
YEAR_OF_BIRTH INT,
ADDRESS u_address_type
);

CREATE FUNCTION f_u_street_type_transform (street u_street_type)
RETURNS ROW (
street VARCHAR(100),
no VARCHAR(30)
)
LANGUAGE SQL
RETURN VALUES (
street..street,
street..no
);

CREATE TRANSFORM FOR u_street_type db2_program
(FROM SQL WITH FUNCTION f_u_street_type_transform);

CREATE FUNCTION f_u_address_type_transform (address u_address_type)
RETURNS ROW (
street VARCHAR(100),
no VARCHAR(30),
zip VARCHAR(50),
city VARCHAR(50),
country VARCHAR(50),
since DATE,
code INT
)
LANGUAGE SQL
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC
RETURN VALUES (
address..street..street,
address..street..no,
address..zip,
address..city,
address..country,
address..since,
address..code
);

CREATE TRANSFORM FOR u_address_type db2_program
(FROM SQL WITH FUNCTION f_u_address_type_transform);

当我尝试执行 select * from t_author; 时出现以下错误:

The function "F_U_ADDRESS_TYPE_TRANSFORM" resolved to specific function 
"SQL101230131003100" that is not valid in the context where it is used..
SQLCODE=-390, SQLSTATE=42887, DRIVER=3.57.82

知道我做错了什么吗?

我正在使用 DB2 v9.5 (Linux)。

最佳答案

问题是 ADDRESS 列中的每个值都是标量值。当您想要将结构化类型的值绑定(bind)到客户端应用程序(如 DB2 CLP)时,因为您有类似“SELECT * FROM t_author”的查询,您必须使用标量转换函数,它将结构化值转换为单个 VARCHAR、CLOB 或您需要的任何类型的值。您不能通过转换函数将其扩展为多个值,因为那必须类似于多列。 (这是不可能的,因为不同的转换函数可能返回不同数量的值,从而为查询提供完全不同的模式;更不用说如果您将完全相同的查询用作具有另一种语义的子查询时的问题。)

返回具有超过 1 列的 ROW() 的转换函数只能在与外部 UDF(用 C/C++ 或 Java 编写)交换结构化类型的值时使用。

p.s:我的建议是您使用常规的、规范化的关系数据库设计并尽量避免结构化类型,除非您有充分的理由这样做。

关于sql - 如何在 DB2 中使用嵌套结构化类型 (UDT)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4562612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com