Teradata特殊点归纳
Teradata索引
索引是物理模型中的一个概念,利用索引,可以直接存取表中的某一条记录而不需要搜索整个表。因此,索引提供了一条更快速访问数据记录的途径。
当在数据库中针对某个表创建一个索引时,系统将根据此索引建立一个相应的子表。相对原来的表(主表)而言,子表要小得多。它将存储索引的值以及一个与此索引对应的数据记录在主表中的存储位置,这好比一个指向数据记录物理位置的指针。因此,当搜索一条数据记录时,如果有相应的索引,则只要在索引子表中找到与此索引值匹配的记录,就找到了数据项在主表中的物理存储位置,这样不需要搜索整个主表就能迅速定位数据记录了。显然,建立索引需要占用额外的存储空间;另外,索引子表是由系统自动维护的,当主表的数据记录发生变化时,系统要自动更新索引子表的相应记录,从而占用系统资源。这就是使用索引的代价。
Teradata中的特殊命令
HELP 帮助用户了解数据库中各种对象的结构
SHOW 帮助用户了解某种对象的定义,即返回其DDL语句 EXPLAIN 返回一个SQL语句经优化处理后的执行步骤,注意并未真正执行
FALLBACK 对数据加以保护的一种方式,是冗余的备份
RENAME 对表重命名
NULLIFZERO 对数据作累计处理时,忽略零值
ZEROIFNULL 对数据作累计处理时,将空值作零处理
WITH...BY 对详细数据记录作分类统计(Sub-Total)时有用
MODIFY USER /DATABASE 对用户/数据库对象作动态修改而无需数据库重组
数据字典 目录
数据字典/目录(Data Dictionary/Directory)简称为DD/D,其中存储了数据库管理系统中所有的系统对象(表、视图与宏),从中可以得到有关用户、数据库、系统资源的使用情况、数据分布情况、安全规则、访问权限等各种信息。
在Teradata中,这些信息均存储在一个称为DBC的用户下面。
数据类型
查看表结构不是show create table,而是show table xxx
like中的限定词
限定词 含义
ANY 与一个或多个数值匹配
SOME (ANY的同义词) 同上
ALL 与列举的所有数值匹配
运算
** (求幂)
MOD(取模)
日期有关函数
EXTRACT
SELECT TIME; 14:52:32
SELECT EXTRACT (HOUR FROM TIME); 14
SELECT DATE; 96/11/07
SELECT EXTRACT (YEAR FROM DATE); 1996
ADD_MONTHS
SELECT DATE; 96/08/07
ADD_MONTHS的使用
SELECT ADD_MONTHS (DATE, 2); 1996-10-07
宏(Macro)的基本特征是:
可以包含一条或多条 SQL语句
可以包含多个 BTEQ语句
可以包含注解
存储在数据字典中
Teradata中用于宏的命令
CREATE MACRO macroname AS ( . . . ); 定义宏
EXECUTE macroname; 执行宏语句
SHOW MACRO macroname; 显示宏定义
REPLACE MACRO macroname AS (. . . ); 改变宏定义
DROP MACRO macroname; 从字典中删除宏定义
EXPLAIN EXEC macroname; 显示宏执行的解释
Format格式化
FORMAT短语中可以使用的格式化字符主要为:
$ 美元标识符
9 数字位
Z 将数字中的前缀零去除
, 在指定位置插入逗号
. 指定小数点位置
- 在指定位置插入连字号
/ 在指定位置插入斜线
% 在指定位置插入百分号
X 字符数据,每个 X代表一个字符
G 图形数据.一个 G代表一个逻辑字符(双字节)
B 在指定位置插入空格
下面是一些对日期进行格式化的例子。
FORMAT 'YYYY/MM/DD' 1996/03/27
FORMAT 'DDbMMMbYYYY' 27 Mar 1996
FORMAT 'mmmBdd,Byyyy' Mar 27, 1996
FORMAT 'DD.MM.YYYY' 27.03.1996
FORMAT 'MM/DD/YY' 03/27/96
FORMAT 'MMM.DD.YY' Mar.27.96
FORMAT 'yy -- mm -- dd' 96 -- 03 -- 27
具体如
SELECT last_name ,
first_name ,
hire_date (FORMAT 'mmmBdd,Byyyy')
FROM employee ORDER BY last_name;
结果如:
last_name first_name hire_date
Johnson Darlene Oct 15, 1976
创建表的可选项(Create Table Options)
Teradata DDL允许在创建表时指定表的物理属性,包括:
● 是否允许重复记录
❍ SET 不允许记录重复 CREATE SET TABLE table1 ...
❍ MULTISET 允许记录重复 CREATE MULTISET TABLE table1 ...
● 数据保护
数据保护要结合FALLBACK和JOURNAL (流水或日志)。
FALLBACK是Teradata的一种数据保护机制,数据表的每一条记录都同时存放两份,而且位于不同的AMP所控制的存储单元中;当数据发生问题或者AMP失败时,可以利用存放在其他AMP上的数据保证对数据表的访问。
- FALLBACK 使用FALLBACK保护机制
- NO FALLBACK 不使用FALLBACK保护机制
日志有BEFORE和AFTER两种,分别保存了一条记录变化前后的状态。当系统出错时,可以利用日志进行恢复。
字段属性
DEFAULT 当字段无数据时用默认值来替代NULL
WITH DEFAULT 用字段的系统默认值替换NULL
FORMAT 缺省的显示格式
TITLE 缺省的列标题
NOT NULL 不允许空值
CASESPECIFIC 字母大小写敏感
UPPERCASE 字母大小写不敏感,内部用大写字母存储
增加或删除字段
ALTER TABLE emp_data ADD educ_level CHAR(1), ADD insure_type SMALLINT;
ALTER TABLE emp_data DROP educ_level, DROP insure_type;
修改已有字段的属性
ALTER TABLE emp_data ADD birthdate FORMAT 'mmmBdd,Byyyy'';
例:对没有FALLBACK的表建立FALLBACK保护
ALTER TABLE emp_data, FALLBACK;
建索引
主索引只能在建表时创建,次索引可以后期增加
CREATE INDEX (job_code) ON emp_data;
插入数据
INSERT INTO birthdays
SELECT employee_number ,last_name, first_name, birthdate FROM employee;
更新数据
UPDATE employee SET
salary_amount = salary_amount * 1.10
WHERE employee.department_number = department.department_number
AND department_name LIKE '%Support%';
交易完整性
用BT和ET显示定义交易
.LOGON
BT;
INSERT row1; (txn #1)
INSERT row2;
COMMIT WORK;
ET;
.LOGOFF
在BT和ET之间的所有SQL是一个交易,只有最后的COMMIT WORK执行成功后,才会真正地更新数据库。执行过程中任何一个SQL语句失败,都会使整个交易失败,系统将自动进行恢复(Rollback)处理。
多参数宏
CREATE MACRO new_dept (dept INTEGER ,budget DEC(10,2) DEFAULT 0 ,name CHAR(30) ,mgr INTEGER)
AS (INSERT INTO department(department_number,department_name,budget_amount,manager_employee_number) VALUES(:dept,:name,:budget,:mgr);
利用宏限制参数完整性
CREATE MACRO new_employee ( number INTEGER ,MGR INTEGER ,dept INTEGER ,job INTEGER ,lastname CHAR (20) ,firstname VARCHAR (30) ,hired DATE ,birth DATE ,salary DECIMAL (10, 2)) AS
(ROLLBACK WORK `Invalid Hire' WHERE (:hired - :birth) / 365 < 21; ROLLBACK WORK `Invalid Department' WHERE :dept NOT IN (SELECT department_number FROM department WHERE department_number = :dept); ROLLBACK WORK `Invalid Job Code' WHERE :job NOT IN (SELECT job_code FROM job WHERE job_code = :job);
INSERT INTO employee (employee_number,manager_employee_number,department_number ,job_code,last_name,first_name,hire_date,birthdate,salary_amount ) VALUES (:number,:mgr ,:dept,:job,:lastname,:firstname,:hired,:birth,:salary ););
利用这个宏来录入新雇员时,必须满足如下条件:
! 受雇时应年满 21岁
! 应有一个合法的部门编号
! 应有一个合法的工作代码
实际上,在创建表时也可以定义参照完整性(约束),如:
CREATE TABLE employee (
employee_number INTEGER , ...... ,
salary_amount DECIMAL (10,2) ,
CHECK (hire_date - birthdate) /365 < 21) ,
FOREIGN KEY (department_number)
REFERENCES department (department_number) ,
FOREIGN KEY (job_code)
REFERENCES job (job_code) );
总计和小计
小计with by
WITH BY的主要特点包括:
! 它为明细数据表创建分类小计。
! 跟 GROUP BY不同的是,WITH BY没有剔除明细记录,而是在明细记录
后面按照分类增加小计行。
! 可以允许多于一个字段进行小计,即小计当中可以嵌套小计。
! 输出结果将根据 BY后面的所有字段自动进行排序。
! 它是 Teradata 的一个扩展特性。
SELECT last_name AS NAME ,salary_amount AS SALARY ,department_number AS DEPT
FROM employee
WITH SUM (salary) BY DEPT;
返回的报表如下所示:
NAME SALARY DEPT
Stein 29450.00 301
Kanieski 29250.00 301
-------------- Sum(SALARY)58700.00
Johnson 36300.00 401
Trader 37850.00 401
-------------- Sum(SALARY)74150.00
Villegas 49700.00 403
Ryan 31200.00 403
-------------- Sum(SALARY) 80900.00
多层小计
WITH BY多层小计 利用WITH BY进行多层小计时,越在后面的字段表明它的小计和排序层次越高。看下面的例子: 列出部门401和501所有雇员的编号和工资,要求按照部门进行工资小计,在同一部门中还要求按照工作代码进行小计。其语句如下:
SELECT department_number AS Dept ,job_code AS Job ,employee_number AS Emp ,salary_amount AS Sal
FROM employee
WHERE department_number IN (401, 501)
WITH SUM(salary_amount) (TITLE 'Job Total') BY Job
WITH SUM(salary_amount) (TITLE 'DEPT TOTAL') BY Dept; 返回结果如下:
Dept Job Emp Sal
401 411100 1003 37850.00
------------ Job Total 37850.00 401 412101 1004 36300.00
401 412101 1001 25525.00
401 412101 1010 46000.00
------------ Job Total 107825.00
401 412102 1013 24500.00
401 412102 1022 32300.00
------------ Job Total 56800.00
401 413201 1002 43100.00
------------ Job Total 43100.00
------------ DEPT TOTAL 245575.00
with最后总计
利用WITH语句产生最后的总计 语句产生最后的总计 语句产生最后的总计 语句产生最后的总计
如果在WITH语句中不带BY则只产生总计。如下面的例子:
列出部门301所有的雇员编号和其工资数,并对该部门的工资作统计,语句如下:
SELECT employee_number ,salary_amount
FROM employee
WHERE department_number = 301
WITH SUM(salary_amount) (TITLE 'GRAND TOTAL')
ORDER BY employee_number;
返回结果如下:
employee_number salary_amount
1006 29450.00
1008 29250.00
1019 57700.00
------------- GRAND TOTAL 116400.00
集合操作主要包括:
合并操作(UNION)、相交操作(INTERSECT)和排外操作(EXCEPT)
交互
SELECT manager_employee_number FROM employee
INTERSECT
SELECT manager_employee_number FROM department ORDER BY 1;
排外(前面排除外面)
SELECT manager_employee_number FROM department
EXCEPT
SELECT manager_employee_number FROM employee ORDER BY 1;
字符串函数:
截取
SUBSTRING函数用来从字符串中析取一个子字符串,其格式为:
SUBSTRING (<字符串表达式> FROM <开始位置> [ FOR <长度> ])
如:
SELECT SUBSTRING('catalog' FROM 5 FOR 3);
结果为log。
合并
字符串合并的符号是"||",它把两个字符串串联成一个字符串。其基本格式为:
<字符串1> || <字符串2>
字符串定位函数
SELECT INDEX('abc', 'b'); 返回结果2
相关子查询:
子查询是指在SQL语句限定子句(where)中嵌套的查询语句。
子查询分为两种类型:独立子查询和相关子查询。
独立子查询是单独执行,其结果参与外层的查询,整个查询中子查询只执行一次,执行完后再执行外层查询;
相关子查询是指子查询(内层查询)中引用了外层查询所引用表的字段,因此外层查询处理每一条记录时都必须执行一次子查询,因为子查询中引用的字段的值发生了变化。
eg:找出每个部门中薪水最高的雇员,显示姓和薪水
SELECT last_name ,salary_amount
FROM employee ee
WHERE salary_amount =(SELECT MAX (salary_amount) FROM employee em WHERE ee.department_number = em.department_number);
执行数据
1.读取雇员表的一条记录
2.执行子查询,得到该雇员所在部门的最高薪水数目
3.比较该雇员薪水和最高薪水
4.如果相等,输出该行信息
5.转到1
使用临时表
相关子查询的执行次数依赖于所引用的外部查询的记录行数,实际上我们可以利用临时表来减少子查询的执行次数而提高查询效率
1.首先创建一个临时表:
CREATE TABLE my_temp (avgsal DECIMAL (10,2));
操作,最后删除
4.删除临时表:
DROP TABLE my_temp;
Teradata支持单with子句,而且临时表名t1后面要列出列名,格式如下:
With t1(c1,c2,…)as (select…)
Select * from t1…
简单说,teradata支持单with,要列出列名。
在teradata摸索了一段时间,还以为teradata不支持with子句,今天才突然发现是支持的,
创建临时表简单方法
CREATE MULTISET VOLATILE TABLE VT_MP_WAYBILL_COST AS(
SELECT Prov_Cd,Price
FROM PV_PMART_CEO.MP_WAYBILL_COST
QUALIFY ROW_NUMBER () OVER(PARTITION BY Prov_Cd ORDER BY Year_Month DESC) = 1
)
WITH DATA
ON COMMIT PRESERVE ROWS;.IF ERRORCODE <> 0 THEN .GOTO QUITWITHERROR;
导出表(推荐)
临时表需要用单独的SQL语句来创建和维护,我们也可以使用导出表代替临时表。事实上,导出表就是一个命名的临时表,它在整个SQL语句中自动创建和删除。在定义导出表的整个SQL语句中都可以通过导出表名来引用它。
导出表一般由FROM子句导出表,语法为:
FROM (子查询) [AS] <导出表名称> [(列表)]
SELECT last_name ,salary_amount (FORMAT '$,$$$,$99.00') ,avgsal (FORMAT '$,$$$,$99.00')
FROM (SELECT AVG (salary_amount) FROM employee) my_temp (avgsal) ,employee
WHERE salary_amount > avgsal ORDER BY 2 DESC; 这里了名为my_temp的导出表,它只有一个字段即平均薪水。这个导出表在整
个SQL语句中都可以引用,如在SELECT部分引用了导出表的字段,在WHERE条
件子句中也引用了导出表的字段。
例如,显示所有薪水高于部门平均薪水的雇员信息。
SELECT last_name AS last ,salary_amount (FORMAT '$,$$$,$99.99') AS sal ,department_number AS dep ,avgsal (FORMAT '$,$$$,$99.99')
FROM (SELECT AVG (salary_amount) ,department_number FROM employee GROUP BY department_number) my_temp (avgsal, deptno) ,employee ee
WHERE sal > avgsal AND dep = deptno ORDER BY 2 DESC;
系统日历
系统中有个当日信息非常详细的表 sys_calendar.calendar。系统日历包含从1900-01-01到2100-12-31的每天的数据,每天在表中都有一行数据。可以配合今日日期 Date 配合使用。如Date -1 =sys_calendar.calendar.calendar_date。再取出后面一张表的周几,月份等等即可
显示1998年1季度item 10的销售总额。 解答
SELECT ,ds.itemid ,SUM(ds.sales)
FROM sys_calendar.calendar sc,daily_sales ds
WHERE sc.calendar_date = ds.salesdate AND sc.quarter_of_year = 1 AND sc.year_of_calendar = 1998AND ds.itemid = 10 GROUP BY 1;
表中有的列
calendar_date DATE UNIQUE (标准Teradata日期)
day_of_week BYTEINT, (1-7,星期几,1代表星期天)
day_of_month BYTEINT, (1-31,本月中的第几号)
day_of_year SMALLINT, (1-366,本年中的第几天)
day_of_calendar INTEGER, (从01/01/1900开始的天, 本日历中第几天)
weekday_of_month BYTEINT, (本月中该星期几出现的次数)
week_of_month BYTEINT, (本月中第几周,以星期天到星期六为一周。0,表示月的第一个不完整的周;1表示月的第一个完整的周)
week_of_year BYTEINT, (0-53) (本年中第几周,0表示第一个不完整的周)
week_of_calendar INTEGER, (0-n) (本日历中的第几周,0表示第一个不完整的周)
month_of_quarter BYTEINT, (1-3,本季度中第几月)
month_of_year BYTEINT, (1-12,本年中第几月)
month_of_calendar INTEGER, (1-n,本日历中第几月,从1900年1月起)
quarter_of_year BYTEINT, (1-4,本年中第几季度)
quarter_of_calendar INTEGER, (本日历中第几季度,从1900年1月起)
year_of_calendar SMALLINT, (年份,从1900起)
特有OLAP函数
OLAP函数和标准聚合函数(SUM, COUNT,AVG, MIN, MAX) 是不能在同一查询中兼容的
累计函数(CSUM)
计算一列的连续的累计的值。语法为: CSUM(colname, sort list)
SELECT salesdate,sales, csum(sales, salesdate)
FROM daily_sales
WHERE salesdate BETWEEN 980101 AND 980301
AND itemid = 10;
结果
salesdate sales Csum
98/01/01 150.00 150.00
98/01/02 200.00 350.00
98/01/03 250.00 600.00
98/01/05 350.00 950.00
98/01/10 550.00 1500.00
98/01/21 150.00 1650.00
累计汇总可以使用GROUP BY子句在特殊的点复位,即重新开始累计
创建item 10从1998年1月和2月的连续的日汇总报表,并且每月重新开始累
计。 解答
SELECT salesdate,sales, csum(sales, salesdate)
FROM daily_sales ds, sys_calendar.calendar sc
WHERE ds.salesdate = sc.calendar_dateAND sc.year_of_calendar = 1998 AND sc.month_of_year in (1,2) AND ds.itemid = 10
GROUP BY sc.month_of_year;
结果
salesdate sales Csum
98/01/01 150.00 150.00
98/01/02 200.00 350.00
98/01/03 250.00 600.00
98/01/05 350.00 950.00
98/01/10 550.00 1500.00
98/01/21 150.00 1650.00
98/01/25 200.00 1850.00
98/01/31 100.00 1950.00
98/02/01 150.00 150.00 重新累计
98/02/03 250.00 400.00
移动平均函数(MAVG)
基于预定的行数(查询宽度)计算一列的移动平均值。如果行数小于这个宽度,则基于前面已有的行计算平均值。使用移动平均的语法是:
MAVG(colname, n, sortlist)
colname = 计算移动平均值的列
n = 行数(< 4096),计算时将使用,包括当前行('n' 也称为平均宽度)
sortlist = 确定行顺序的列
显示item 10基于7天宽度的移动平均值。 解答
SELECT salesdate,itemid, sales,MAVG(sales, 7, salesdate)
FROM daily_sales;
结果
salesdate itemid sales MAvg
98/01/01 10 150.00 150.00
98/01/02 10 200.00 175.00 前2行的平均值
98/01/03 10 250.00 200.00
98/01/05 10 350.00 237.50
98/01/10 10 550.00 300.00
98/01/21 10 150.00 275.00
98/01/25 10 200.00 264.29 前7行的平均值 1850/7
98/01/31 10 100.00 257.14 前7行的平均值 1750/7 增加这一行数据,去掉了第一行的数据,(1850-150+100)/7
移动汇总函数(MSUM)
基于预定的查询宽度计算一列的移动汇总值。宽度决定有多少行合计到汇总值中。如果前面的行数小于n,则仅使用前面所有行。移动汇总函数的语法是:
MSUM(colname, n, sortlist)
问题
显示item 10基于3天宽度的移动汇总值。 解答
SELECT salesdate,itemid,sales,msum(sales, 3, salesdate)
FROM daily_sales; 结果
salesdate itemid sales MSum
98/01/01 10 150.00 150.00
98/01/02 10 200.00 350.00 前面2行的总和
98/01/03 10 250.00 600.00
98/01/05 10 350.00 800.00
98/01/10 10 550.00 1150.00
98/01/21 10 150.00 1050.00
98/01/25 10 200.00 900.00 前面3行的总和
98/01/31 10 100.00 450.00
移动差分函数(MDIFF)
基于预定的查询宽度计算一列的移动差分值。宽度决定有多少行参与计算。如果前面的行数小于n,则产生一个空值(null)代表差值。移动差分函数的语法是:
MDIFF(colname, n, sortlist)
宽度n<=4096
显示item 10基于3天宽度的移动差分值。
解答
SELECT salesdate, itemid,sales,mdiff(sales, 3, salesdate)
FROM daily_sales;
结果
salesdate itemid sales MDiff
98/01/01 10 150.00 ?
98/01/02 10 200.00 ?
98/01/03 10 250.00 ?
98/01/05 10 350.00 200.00 2行的差值
98/01/10 10 550.00 350.00
98/01/21 10 150.00 -100.00
排队函数
排队函数对一列进行排队,可以按照升序或者降序排队。缺省,输出结果按照降序排队,对应的排队名次是升序。换句话说,如果一个销售代表在某季度的销售额最高,其排名为1,这是一个最小的值。
排队函数(RANK)的语法是:
RANK(colname)
这里,colname表示排队的列名,其结果降序排列。
问题
显示商店1001的产品销售额排队。
解答
SELECT storeid,prodid,sales,RANK(sales)
FROM salestbl
WHERE storeid = 1001;
结果
storeid prodid sales Rank
1001 F 150000.00 1
1001 A 100000.00 2
1001 C 60000.00 3
1001 D 35000.00 4
如上所示,列Rank的最大值代表最低的销售额。
使用排队函数的规则包括:
! WHERE 子句限定参与排队的记录。
! 应用排队函数时,缺省最大的数名次最低。
! 缺省顺序是按排队列的降序。
带限定的排队
QUALIFY子句限制排队输出的最终结果。QUALIFY子句与HAVING子句类似,使输出限制在一定范围内。
按商店得到销售前3名的产品。 解答
SELECTstoreid, prodid, sales, rank(sales)
FROM salestbl
GROUP BY storeid
QUALIFY rank(sales) <= 3;
结果
storeid prodid sales Rank
1001 A 100000.00 1
1001 C 60000.00 2
1001 D 35000.00 3
1002 A 40000.00 1
1002 C 35000.00 2
1002 D 25000.00 3
1003 B 65000.00 1
1003 D 50000.00 2
1003 A 30000.00 3
上面的例子中,GROUP BY子句不是做聚合,它实际上是改变查询的范围,也引起排序。
带导出表的排序
得到销售最差的3种产品,跨所有商店,并按照产品号(prodid)排序。 解答
SELECT t.prodid,t.sumsales,rank(t.sumsales)
FROM (SELECT a.prodid, sum(a.sales) from salestbl a GROUP BY 1) as t(prodid, sumsales) QUALIFY RANK(sumsales asc) <= 3
ORDER BY 1; 结果
Prodid sumsales Rank
B 65000.00 5
C 115000.00 3
D 110000.00 4
看上面的结果,同样的3行数据,但顺序不一样。ORDER BY子句中的列prodid成为主排序列。
上面未完
从已有表创建新表
创建一个新表dept1,该表与department表有同样的定义。
解答
CREATE TABLE dept1 AS department WITH NO DATA;
创建一个新表dept1,该表与department表定义相同,且包含同样的数据。
CREATE TABLE dept1 AS department WITH DATA;
存储过程
下列存储过程测试一个输入参数,输出计算结果。
CREATE PROCEDURE test_value(IN p1 INTEGER, OUT pmsg CHAR(30))
BEGIN IF p1 > 0 THEN SET pmsg = 'Positive value';
ELSEIF p1 = 0 THEN SET pmsg = 'Zero Value';
ELSE SET pmsg = 'Negative Value';
END IF;
END;
要执行存储过程,使用CALL语句。
例
执行存储过程test_value。
CALL test_value(3, pmsg);
结果
pmsg
------------------------------
Positive value
Set语句
Set语句用于给说明的变量和参数赋值。Set语句的格式如下:
SET A = B;
过程调用过程
REPLACE PROCEDURE test_call2(IN w1 INTEGER, OUT w2 INTEGER)
BEGIN SET w2 = w1 + 100;
END; 创建一个过程,接收一个输入值,加2后,传递给过程test_call2。
REPLACE PROCEDURE test_call4(IN v1 INTEGER, OUT v2 INTEGER, OUT v3 INTEGER)
BEGIN
SET v2 = v1 + 2;
CALL test_call2(:v2,:v3);
END; CALL test_call4 (3, v2, v3); v2 v3 5 105
游标
在存储过程内,当SQL语句希望返回多行数据记录时,有必要声明游标。游标能够一次一行地处理返回的结果。下面的例子中显示了游标的语法
创建一个存储过程,返回所有雇员号小于1005的雇员,并返回记录行数。 REPLACE PROCEDURE sp_cur5 (OUT prowcount INTEGER)
BEGIN
DECLARE newvar BYTEINT DEFAULT 0;
FOR loopvar AS cur1 CURSOR FOR SELECT employee_number AS emp, department_number AS dept FROM employee WHERE employee_number < 1005 ORDER BY 1
DO SET newvar = newvar + 1; PRINT 'Row Count:' , newvar , 'EmpNo:', loopvar.emp;
END FOR;
SET prowcount = newvar;
END;
上面的例子示范了存储过程中使用游标的规则:
! 要赋予游标一个名字,例子中的名字为 cur1。
! 赋予循环一个名字 loopvar。
! END FOR语句以分号结束。
! SQL语句是游标声明的一部分,不以分号结束。
! 游标内不允许使用多语句请求,只能是单 SQL语句。
执行过程:
CALL sp_cur5(prowcount);
prowcount
-----------
5
SELECT INTO - 返回一行
当SELECT语句只返回一行数据时,没有必要使用游标。因为游标提供了一个浏览机制,能够顺序处理返回的数据记录。单行记录,没有必要使用这种机制。
SELECT INTO设计用于处理单行数据记录。
REPLACE PROCEDURE sel_into (IN empno INTEGER, OUT deptnum INTEGER, OUT lastnm CHAR(20)) BEGIN SELECT department_number , last_name INTO :deptnum, :lastnm FROM employee WHERE employee_number = :empno;
END; 上面的例子中示范了存储过程中使用SELECT INTO的规则:
! INOUT 和 OUT参数可以用作 INTO变量(不能使用说明的变量)。
! IN 和 INOUT 参数可以用作 WHERE 子句的变量(不能使用说明的变量)。
! INTO 和 WHERE 子句变量是宿主变量,前面必须带冒号。
! SQL以分号结束。 执行过程:
CALL sel_into (1008,deptnum,lastnm); 结果
deptnum lastnm
------- -------
301 Kanieski 如果没有记录返回,输出参数为空值。
如果SELECT INTO中返回多行数据记录,将发生错误
Teradata特殊点归纳相关推荐
- 读后感与机翻《基于理论的因果迁移:结合实例级的归纳和抽象级的结构学习》
研究朱松纯FPICU体系的第 3 篇文章 <Theory-based Causal Transfer: Integrating Instance-level Induction and Abst ...
- Pandas SQL 语法归纳总结,真的太全了
作者 | 俊欣 来源 | 关于数据分析与可视化 对于数据分析师而言,Pandas与SQL可能是大家用的比较多的两个工具,两者都可以对数据集进行深度的分析,挖掘出有价值的信息,但是二者的语法有着诸多的不 ...
- Teradata推出Vantage on Azure,可实现自助配置、快速部署,提供安全、可扩展的高性能分析
云数据分析平台公司Teradata今日宣布推出全新Teradata Vantage on Azure 服务,帮助客户在部署其Teradata Vantage 环境时,将Vantage的强大功能与Mic ...
- mysql 二级什么意思_MySQL二级等级考试归纳——PHP篇
终于到最后一篇了--累死宝宝了-- 基于二级考试的书写的php部分,不会太深,大概就是归纳一下书上有的内容,详细的PHP就科科 之前没接触过PHP,网上好多好教程,真后悔赶时间没去看那些教程直接跟着书 ...
- c语言中小数乘法怎样写程序,四年级下册lbrack;小数乘法rsqb;知识点归纳
与<四年级下册[小数乘法]知识点归纳>相关的范文 北师大版小学数学一年级(上册)知识点归纳 本册教材的教学内容 1 北师大版一年级数学(下册)知识点 一年级下册知识领域及结构图 一. 生活 ...
- 网关拓扑结构与功能设计归纳
引言 本文就网关拓扑结构和常见功能与设计点归纳整理. 一.网络拓扑与流量走向 1.网络拓扑架构 下面是一个比较通用的南北流量网关部署架构,各个层次如下: 终端服务层:公司提供的各种设备.APP等 四层 ...
- 异地多活实践与设计思考点归纳
引言 在异地多活项目整体推过程中的一些注意事项和设计点归纳和整理,抛砖引玉,其中一些点还有待深入探讨和优化. 一.指导事项归纳 1.多活原因归纳 推动多活的原因大体可归纳为以下三种. 高可用架构部署 ...
- zookeeper版本更新_Zookeeper归纳
写在开头: 本章是zookeeper学习归纳,着重于复习盘点zookeeper的大部分知识点. 文章内容输出来源:拉勾教育大数据高薪训练营. 1.什么是zookeeper? Zookeeper 是⼀个 ...
- 第五课.可变图结构下的归纳式学习图注意力
目录 图采样聚合网络 Inductive and Transductive Learning GraphSAGE 算法流程 GraphSAGE与InductiveLearning的关系 损失函数 注意 ...
最新文章
- IC/FPGA 设计资源整理推荐
- 打开sql server 验证
- jdbc之防sql注入攻击
- Scattering:将数据写入到buffer时,可以采用buffer数组,依次写入 [分散] || Gathering: 从buffer读取数据时,可以采用buffer数组,依次读
- 【科技金融】风控命门——第三届互联网金融风控大会会后复盘
- 什么是梯度爆炸/梯度消失?
- jQuery.sap.getModulePath(cus.crm.opportunity.css.Opportunity, .css)
- 什么是序列化? 您需要通过示例解释的有关Java序列化的所有知识
- ARM 汇编语言入门
- 玩转LiteOS组件:玩转Librws
- thinkphp自动验证分析
- Oracle11g x64使用Oracle SQL Developer报错:Unable to find a Java Virtual Machine
- Windows Phone标准中文字体
- win11无线网络适配器出现感叹号怎么办 windows11无线网络适配器出现感叹号的解决方法
- Mysql建数据库建表语法实践
- 【信号处理】基于Matlab实现男女音变声系统
- 告别第三方检测,教你用Windows自带工具检测!
- 线程池 ExecutorService 的使用例子
- SpringBoot使用elasticsearch-rest-high-level-client操作ElasticSearch
- Jenkins ——你很神气