主要是关于SQL。
通用的SQL就不写了,记录一些个人觉得同ORACLE或SQL SERVER不同的写法。
取TOP的写法
SELECT * FROM staff FETCH FIRST 10 ROWS ONLY
返回修改前的记录值,关键字 OLD TABLE 指定中间结果表应该包含数据修改操作之前的值
SELECT * FROM OLD TABLE (UPDATE employee SET salary = salary * 1.07 WHERE empno = '000220')
返回修改后的记录值,关键字 FINAL TABLE 指定中间结果表应该包含数据修改操作、引用完整性计算和触发操作后触发器之后的值。
SELECT * FROM FINAL TABLE ( INSERT INTO customers (cust_name) VALUES ('Lamarr'))
SELECT * FROM FINAL TABLE (UPDATE employee SET salary = salary * 1.07 WHERE empno = '000220')
自增长ID
CREATE TABLE customers (
cust_id INTEGER GENERATED ALWAYS AS IDENTITY (
START WITH 10001
),
cust_name VARCHAR(12),
PRIMARY KEY (cust_id)
);
执行SQL文件
db2 -td@ -vf createSQLproc.db2
db2 命令指定 -td 选项标志,这让命令行处理程序使用 @ 作为语句终止字符(因为在过程体内已经使用分号作为语句终止字符);
-v 选项标志让命令行处理程序将命令文本回显到标准输出;
-f 选项标志让命令行处理程序从指定的文件(而不是标准输入)读取命令输入。
createSQLproc.db2
CREATE PROCEDURE sales_status
(IN quota INTEGER, OUT sql_state CHAR(5))
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE SQLSTATE CHAR(5);
DECLARE rs CURSOR WITH RETURN FOR
SELECT sales_person, SUM(sales) AS total_sales
FROM sales
GROUP BY sales_person
HAVING SUM(sales) > quota;
OPEN rs;
SET sql_state = SQLSTATE;
END @
返回结果集的方法是:
1. 在 DYNAMIC RESULT SETS 子句中声明 SQL 过程返回的结果集数量。
2. 在过程体中为返回的每个结果集声明一个游标(使用 WITH RETURN FOR 子句)。
3. 打开返回的每个结果集的游标。
4. 当 SQL 过程返回时,让游标打开着。
db2 "CALL sales_status (25, ?)"
用户定义函数
CREATE function ca (r DOUBLE)
RETURNS DOUBLE
LANGUAGE SQL
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC
RETURN 3.14159 * (r * r);
NO EXTERNAL ACTION 子句指出这个函数不会对数据库管理程序不管理的对象的状态有任何影响。
DETERMINISTIC 关键字指出这个函数对于给定的参数值总是返回相同的结果。在查询优化期间会使用这个信息。
内置的 数据类型分为四类:数字、字符串、日期时间和 XML。
用户定义的数据类型分为:单值类型、结构化类型和引用类型。
复制表结构
CREATE TABLE MYBOOKS LIKE BOOKS
CREATE TABLE 语句将 BOOKS 表放在 BOOKINFO 表空间内:
CREATE TABLE BOOKS ( BOOKID INTEGER,
BOOKNAME VARCHAR(100),
ISBN CHAR(10) )
IN BOOKINFO
修改表
ALTER TABLE BOOKS ALTER BOOKNAME SET DATA TYPE VARCHAR(200) ALTER ISBN SET NOT NULL
聚集索引
可以创建象SQL SERVER 一样的聚集索引.
在索引中使用包含的列
CREATE UNIQUE INDEX IBOOKID ON BOOKS (BOOKID) INCLUDE(BOOKNAME)
包含额外的列数据,这些额外的列数据将与键存储在一起,但实际上它们不是键本身的一部分,所以不被排序。
看起来,象SQL SERVER的多一点。
通用的SQL就不写了,记录一些个人觉得同ORACLE或SQL SERVER不同的写法。
取TOP的写法
SELECT * FROM staff FETCH FIRST 10 ROWS ONLY
返回修改前的记录值,关键字 OLD TABLE 指定中间结果表应该包含数据修改操作之前的值
SELECT * FROM OLD TABLE (UPDATE employee SET salary = salary * 1.07 WHERE empno = '000220')
返回修改后的记录值,关键字 FINAL TABLE 指定中间结果表应该包含数据修改操作、引用完整性计算和触发操作后触发器之后的值。
SELECT * FROM FINAL TABLE ( INSERT INTO customers (cust_name) VALUES ('Lamarr'))
SELECT * FROM FINAL TABLE (UPDATE employee SET salary = salary * 1.07 WHERE empno = '000220')
自增长ID
CREATE TABLE customers (
cust_id INTEGER GENERATED ALWAYS AS IDENTITY (
START WITH 10001
),
cust_name VARCHAR(12),
PRIMARY KEY (cust_id)
);
执行SQL文件
db2 -td@ -vf createSQLproc.db2
db2 命令指定 -td 选项标志,这让命令行处理程序使用 @ 作为语句终止字符(因为在过程体内已经使用分号作为语句终止字符);
-v 选项标志让命令行处理程序将命令文本回显到标准输出;
-f 选项标志让命令行处理程序从指定的文件(而不是标准输入)读取命令输入。
createSQLproc.db2
CREATE PROCEDURE sales_status
(IN quota INTEGER, OUT sql_state CHAR(5))
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE SQLSTATE CHAR(5);
DECLARE rs CURSOR WITH RETURN FOR
SELECT sales_person, SUM(sales) AS total_sales
FROM sales
GROUP BY sales_person
HAVING SUM(sales) > quota;
OPEN rs;
SET sql_state = SQLSTATE;
END @
返回结果集的方法是:
1. 在 DYNAMIC RESULT SETS 子句中声明 SQL 过程返回的结果集数量。
2. 在过程体中为返回的每个结果集声明一个游标(使用 WITH RETURN FOR 子句)。
3. 打开返回的每个结果集的游标。
4. 当 SQL 过程返回时,让游标打开着。
db2 "CALL sales_status (25, ?)"
用户定义函数
CREATE function ca (r DOUBLE)
RETURNS DOUBLE
LANGUAGE SQL
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC
RETURN 3.14159 * (r * r);
NO EXTERNAL ACTION 子句指出这个函数不会对数据库管理程序不管理的对象的状态有任何影响。
DETERMINISTIC 关键字指出这个函数对于给定的参数值总是返回相同的结果。在查询优化期间会使用这个信息。
内置的 数据类型分为四类:数字、字符串、日期时间和 XML。
用户定义的数据类型分为:单值类型、结构化类型和引用类型。
复制表结构
CREATE TABLE MYBOOKS LIKE BOOKS
CREATE TABLE 语句将 BOOKS 表放在 BOOKINFO 表空间内:
CREATE TABLE BOOKS ( BOOKID INTEGER,
BOOKNAME VARCHAR(100),
ISBN CHAR(10) )
IN BOOKINFO
修改表
ALTER TABLE BOOKS ALTER BOOKNAME SET DATA TYPE VARCHAR(200) ALTER ISBN SET NOT NULL
聚集索引
可以创建象SQL SERVER 一样的聚集索引.
在索引中使用包含的列
CREATE UNIQUE INDEX IBOOKID ON BOOKS (BOOKID) INCLUDE(BOOKNAME)
包含额外的列数据,这些额外的列数据将与键存储在一起,但实际上它们不是键本身的一部分,所以不被排序。
看起来,象SQL SERVER的多一点。