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特殊点归纳相关推荐

  1. 读后感与机翻《基于理论的因果迁移:结合实例级的归纳和抽象级的结构学习》

    研究朱松纯FPICU体系的第 3 篇文章 <Theory-based Causal Transfer: Integrating Instance-level Induction and Abst ...

  2. Pandas SQL 语法归纳总结,真的太全了

    作者 | 俊欣 来源 | 关于数据分析与可视化 对于数据分析师而言,Pandas与SQL可能是大家用的比较多的两个工具,两者都可以对数据集进行深度的分析,挖掘出有价值的信息,但是二者的语法有着诸多的不 ...

  3. Teradata推出Vantage on Azure,可实现自助配置、快速部署,提供安全、可扩展的高性能分析

    云数据分析平台公司Teradata今日宣布推出全新Teradata Vantage on Azure 服务,帮助客户在部署其Teradata Vantage 环境时,将Vantage的强大功能与Mic ...

  4. mysql 二级什么意思_MySQL二级等级考试归纳——PHP篇

    终于到最后一篇了--累死宝宝了-- 基于二级考试的书写的php部分,不会太深,大概就是归纳一下书上有的内容,详细的PHP就科科 之前没接触过PHP,网上好多好教程,真后悔赶时间没去看那些教程直接跟着书 ...

  5. c语言中小数乘法怎样写程序,四年级下册lbrack;小数乘法rsqb;知识点归纳

    与<四年级下册[小数乘法]知识点归纳>相关的范文 北师大版小学数学一年级(上册)知识点归纳 本册教材的教学内容 1 北师大版一年级数学(下册)知识点 一年级下册知识领域及结构图 一. 生活 ...

  6. 网关拓扑结构与功能设计归纳

    引言 本文就网关拓扑结构和常见功能与设计点归纳整理. 一.网络拓扑与流量走向 1.网络拓扑架构 下面是一个比较通用的南北流量网关部署架构,各个层次如下: 终端服务层:公司提供的各种设备.APP等 四层 ...

  7. 异地多活实践与设计思考点归纳

    引言 在异地多活项目整体推过程中的一些注意事项和设计点归纳和整理,抛砖引玉,其中一些点还有待深入探讨和优化. 一.指导事项归纳 1.多活原因归纳 推动多活的原因大体可归纳为以下三种. 高可用架构部署 ...

  8. zookeeper版本更新_Zookeeper归纳

    写在开头: 本章是zookeeper学习归纳,着重于复习盘点zookeeper的大部分知识点. 文章内容输出来源:拉勾教育大数据高薪训练营. 1.什么是zookeeper? Zookeeper 是⼀个 ...

  9. 第五课.可变图结构下的归纳式学习图注意力

    目录 图采样聚合网络 Inductive and Transductive Learning GraphSAGE 算法流程 GraphSAGE与InductiveLearning的关系 损失函数 注意 ...

最新文章

  1. IC/FPGA 设计资源整理推荐
  2. 打开sql server 验证
  3. jdbc之防sql注入攻击
  4. Scattering:将数据写入到buffer时,可以采用buffer数组,依次写入 [分散] || Gathering: 从buffer读取数据时,可以采用buffer数组,依次读
  5. 【科技金融】风控命门——第三届互联网金融风控大会会后复盘
  6. 什么是梯度爆炸/梯度消失?
  7. jQuery.sap.getModulePath(cus.crm.opportunity.css.Opportunity, .css)
  8. 什么是序列化? 您需要通过示例解释的有关Java序列化的所有知识
  9. ARM 汇编语言入门
  10. 玩转LiteOS组件:玩转Librws
  11. thinkphp自动验证分析
  12. Oracle11g x64使用Oracle SQL Developer报错:Unable to find a Java Virtual Machine
  13. Windows Phone标准中文字体
  14. win11无线网络适配器出现感叹号怎么办 windows11无线网络适配器出现感叹号的解决方法
  15. Mysql建数据库建表语法实践
  16. 【信号处理】基于Matlab实现男女音变声系统
  17. 告别第三方检测,教你用Windows自带工具检测!
  18. 线程池 ExecutorService 的使用例子
  19. SpringBoot使用elasticsearch-rest-high-level-client操作ElasticSearch
  20. Jenkins ——你很神气

热门文章

  1. vim开启粘贴板功能
  2. 支付宝签名php,支付宝支付之php后台签名实现方法
  3. 在JS中利用for...in循环遍历对象
  4. 用vscode调试远程服务器的php
  5. 开发中常见的算法汇总之-基数排序
  6. centos7查看oracle监听端口,CentOS 7开放及查看防火墙firewall的端口
  7. SpringBoot整合Gitee图床
  8. 博客开张+第1个项目:云云图书馆
  9. 文件操作系列之三——(windows中的文件操作)
  10. Windows之内存映射文件