DECLARE TYPE type_name AS ROW (variable_name data_type,variable_name data_type,...);
复制
与 SQL/PL 中的 Records 类型相似,您可以自定义 SQL PL 中的行数据类型,且每一个行数据类型包含多个分量的名称及数据类型。在定义一个行数据类型时,我们可以分别定义分量的名称和数据类型,也可以直接声明一个基于表的行数据类型,其分量的字段名和数据类型与表中字段名和数据类型完全相同。
语法与示例
定义行数据类型
语法
示例
定义一个名为 transactiontype 的行数据类型。
DECLARE TYPE transactiontype AS ROW (v_acc_num STRING, v_trans_time STRING, v_price DOUBLE);
复制
声明行变量
语法
DECLARE <variable_name> <datatype_name>
复制
示例
声明一个数据类型为 transactiontype 的变量 transactionrow。
DECLARE transactionrow transactiontype
复制
行变量字段
语法
<variable_name>.<sub_variable_name>
复制
示例
行变量 transactionrow 包含行数据类型 transactiontype 的所有字段,可以用以下方式去调用。
transactiontype.v_acc_num;transactiontype.trans_time;transactiontype.price
复制
声明与赋值
行变量的赋值支持多种方式,在实际的应用中可以选择相应的方式进行赋值,本节中我们将以分别定义每一个分量的名称和数据类型的方式来声明一个行数据类型,并列举出几种常见赋值语句,可供参阅。
示例一:将一个元组赋值给一个行变量
此操作下,元组的元素和元素类型需要和行变量的行数据类型一致。
-- 打印出行变量 transactionrow 中的字段 transactionrow.v_trans_time 的值。 -- 打印出行变量 transactionrow 中的字段 transactionrow.v_price 的值。 !set plsqlUseSlash true BEGIN -- 定义一个行数据类型 transactiontype,包含了三个字段 v_acc_num,v_trans_time,v_price,其中字段 v_acc_num 的数据类型为 STRING,v_trans_time 的数据类型为 STRING,v_price 的数据类型为 DOUBLE。 DECLARE TYPE transactiontype AS ROW (v_acc_num STRING, v_trans_time STRING, v_price DOUBLE); -- 声明一个行变量transactionrow,其数据类型为transactiontype,该变量包含transactiontype类型的三个字段。 DECLARE transactionrow transactiontype; -- 将一个元组赋值给行变量 transactionrow,至此行变量 transactionrow 中的字段 transactionrow.v_acc_num,transactionrow.v_trans_time 和 transactionrow.v_price 的值分别为 0700735,20140916105811,11.11。 SET transactionrow = ('0700735','20140916105811',11.11); -- 打印出行变量 transactionrow 中的字段 transactionrow.v_acc_num 的值。 PUT_LINE('acc_num:'||transactionrow.v_acc_num); PUT_LINE('time:'||transactionrow.v_trans_time); PUT_LINE('price:'||transactionrow.v_price); END; /
复制
输出结果
+----------------------+ | output | +----------------------+ | acc_num:0700735 | | time:20140916105811 | | price:11.11 | +----------------------+
复制
示例二:将一个表达式赋值给行变量
在下述示例中,我们使用关键字 VALUES INTO 语句进行赋值。
!set plsqlUseSlash true BEGIN -- 定义一个行数据类型 transactiontype,包含了三个字段 v_acc_num , v_trans_time , v_price,其中字段 v_acc_num 的数据类型为 STRING,v_trans_time 的数据类型为 STRING,v_price 的数据类型为 DOUBLE。 DECLARE TYPE transactiontype AS ROW (v_acc_num STRING, v_trans_time STRING, v_price DOUBLE); -- 声明一个行变量 transactionrow,其数据类型为 transactiontype,该变量包含 transactiontype 类型的三个字段。 DECLARE transactionrow transactiontype; -- 将一个表达式通过 VALUES INTO 语句赋值给行变量 transactionrow,至此行变量 transactionrow 中的字段 transactionrow.v_acc_num,transactionrow.v_trans_time 和 transactionrow.v_price 的值分别为 0700735,20140916105811,11.11。 VALUES ('0700735','20140916105811',11.11) INTO transactionrow; -- 打印出行变量 transactionrow 中的字段 transactionrow.v_acc_num 的值。 PUT_LINE('acc_num:'||transactionrow.v_acc_num); -- 打印出行变量 transactionrow 中的字段 transactionrow.v_trans_time 的值。 PUT_LINE('time:'||transactionrow.v_trans_time); -- 打印出行变量 transactionrow 中的字段 transactionrow.v_price 的值。 PUT_LINE('price:'||transactionrow.v_price); END; /
复制
输出结果
+----------------------+ | output | +----------------------+ | acc_num:0700735 | | time:20140916105811 | | price:11.11 | +----------------------+
复制
示例三:分别给每一个行变量的字段赋值
!set plsqlUseSlash true BEGIN -- 定义一个行数据类型 transactiontype,包含了三个字段 v_acc_num,v_trans_time,v_price,其中字段 v_acc_num 的数据类型为 STRING,v_trans_time 的数据类型为 STRING,v_price 的数据类型为 DOUBLE。 DECLARE TYPE transactiontype AS ROW (v_acc_num STRING, v_trans_time STRING, v_price DOUBLE); -- 声明一个行变量 transactionrow,其数据类型为 transactiontype,该变量包含 transactiontype 类型的三个字段。 DECLARE transactionrow transactiontype; -- 给行变量 transactionrow 的字段 transactionrow.v_acc_num 赋值为 6513065。 SET transactionrow.v_acc_num = '6513065'; -- 给行变量 transactionrow 的字段 transactionrow.v_trans_time 赋值为 20140506133109。 SET transactionrow.v_trans_time = '20140506133109'; -- 给行变量 transactionrow 的字段 transactionrow.v_price 赋值为 12.13。 SET transactionrow.v_price = '12.13'; -- 打印出行变量 transactionrow 的字段 transactionrow.v_acc_num 的值。 PUT_LINE('acc_num:'||transactionrow.v_acc_num); -- 打印出行变量 transactionrow 的字段 transactionrow.v_trans_time 的值。 PUT_LINE('time:'||transactionrow.v_trans_time); -- 打印出行变量 transactionrow 的字段 transactionrow.v_price 的值。 PUT_LINE('price:'||transactionrow.v_price); END; /
复制
输出结果
+----------------------+ | output | +----------------------+ | acc_num:6513065 | | time:20140506133109 | | price:12.13 | +----------------------+
复制
示例四:将查询结果集的单行值赋值给一个行变量
!set plsqlUseSlash true BEGIN -- 定义一个行数据类型 transactiontype,包含了三个字段v_acc_num,v_trans_time,v_price,其中字段 v_acc_num 的数据类型为 STRING,v_trans_time 的数据类型为 STRING,v_price 的数据类型为 DOUBLE。 DECLARE TYPE transactiontype AS ROW (v_acc_num STRING, v_trans_time STRING, v_price DOUBLE); -- 声明一个行变量 transactionrow,其数据类型为transactiontype,该变量包含 transactiontype 类型的三个字段。 DECLARE transactionrow transactiontype; -- 查询表 transactions中交易号为648230055的账号,交易时间,价格,并赋值给行变量 transactionrow。 SET transactionrow = (SELECT acc_num,trans_time,price FROM transactions WHERE trans_id=648230055); -- 打印出行变量transactionrow中的字段transactionrow.v_acc_num 的值。 PUT_LINE('acc_num:'||transactionrow.v_acc_num); -- 打印出行变量transactionrow中的字段transactionrow.v_trans_time 的值。 PUT_LINE('time:'||transactionrow.v_trans_time); -- 打印出行变量transactionrow中的字段transactionrow.v_price 的值。 PUT_LINE('price:'||transactionrow.v_price); END; /
复制
输出结果
+----------------------+ | output | +----------------------+ | acc_num:0700735 | | time:20140315111111 | | price:22.66 | +----------------------+
复制
示例五:通过 SELECT INTO 将行值赋值给行变量
!set plsqlUseSlash true BEGIN -- 定义一个行数据类型transactiontype,包含了三个字段v_acc_num , v_trans_time , v_price,其中字段v_acc_num的数据类型为STRING,v_trans_time的数据类型为STRING,v_price的数据类型为DOUBLE。 DECLARE TYPE transactiontype AS ROW (v_acc_num STRING, v_trans_time STRING, v_price DOUBLE); -- 声明一个行变量transactionrow,其数据类型为transactiontype,该变量包含transactiontype类型的三个字段。 DECLARE transactionrow transactiontype; -- 通过SELECT INTO语句将表transactions中股票账号为GL2547626的账号,交易时间和价格放进行变量transactionrow中。 SELECT acc_num,trans_time,price INTO transactionrow FROM transactions WHERE stock_id='GL2547626'; -- 打印出行变量transactionrow中的字段transactionrow.v_acc_num的值。 PUT_LINE('acc_num:'||transactionrow.v_acc_num); -- 打印出行变量transactionrow中的字段transactionrow.v_trans_time的值。 PUT_LINE('time:'||transactionrow.v_trans_time); -- 打印出行变量transactionrow中的字段transactionrow.v_price的值。 PUT_LINE('price:'||transactionrow.v_price); END; /
复制
输出结果
+----------------------+ | output | +----------------------+ | acc_num:5224133 | | time:20140801110003 | | price:6.36 | +----------------------+
复制
基于表的行数据类型的声明
下述案例中,我们将基于表直接声明一个行数据类型,其分量的名称和数据类型与表中的字段名和数据类型完全相同。
示例
声明一个名为 transaction_row 的行数据类型,其分量的名称和数据类型与表 transactions 中的字段名和数据类型完全相同
!set plsqlUseSlash true BEGIN -- 声明一个与表transactions中的字段名和字段类型完全相同的行数据类型transaction_row。 DECLARE TYPE transaction_row as row anchor to row of transactions; -- 声明一个transaction_row类型的变量transactionrow。 DECLARE transactionrow transaction_row; -- 查询表transactions中股票账号为GL2547626的全部信息,并放进变量transactionrow里。 SELECT * INTO transactionrow FROM transactions WHERE stock_id='GL2547626'; -- 依次打印出变量transactionrow中的账号,交易时间和价格。 PUT_LINE('acc_num:'||transactionrow.acc_num); PUT_LINE('time:'||transactionrow.trans_time); PUT_LINE('price:'||transactionrow.price); END; /
复制
输出结果
+----------------------+ | output | +----------------------+ | acc_num:5224133 | | time:20140801110003 | | price:6.36 | +----------------------+
复制