转sql
最近在看db2,边读边写了一些,记下来,虽然写的乱七八糟。以备后用。
这些都写的很简单。我以为也算是一些简单的操做吧,有些也是摘自别人的blog具体是引用哪的就不太记得了。
1、DB2两种注释写法
-----注释
/*注释*/
注:看起来db2的数据库架构和oracle有些相像,有用户和数据库的概念。好比我刚刚在J_TEST这个数据库中建了个表形式以下,create table table_name(字段列表);而后我在对想视图中看到table_name的模式是abc(便是我登陆该操做系统的ID),而我若是查询select * from obpm_rt.table_name是查不出来的,便是表示table_name是属于abc这个账户其它用户不可见,虽然是处于同一个数据库中。
2、db2的基本数据类型
数值型
*小整型,SMALLINT: 整型是两个字节的整数,精度为 5 位。
*大整型,INTEGER: 或 INT 大整型是四个字节的整数,精度为 10 位。
*巨整型,BIGINT:巨整型是八个字节的整数,精度为 19 位。
*小数型,DECIMAL(p,s)、DEC(p,s)、NUMERIC(p,s) 或 NUM(p,s):
*单精度浮点数 REAL
*双精度浮点数 DOUBLE,DOUBLE PRECISION 或 FLOAT
字符串型
*定长字符串:CHARACTER(n) 或 CHAR(n):定长字符串的长度介于1 到254字节之间。默认1个字节。
*变长字符串,VARCHAR(n)、CHARACTER VARYING(n) 或 CHAR VARYING(n):VARCHAR(n) 类型的字符串是变长字符串,最长可达 32,672 字节。
*LONG VARCHAR:LONG VARCHAR 类型的字符串是变长字符串,最长可达 32,700 字节。
*字符大对象字符串 CLOB(n):CLOB 是变长字符串,最长能够达到 2,147,483,647 字节。若是只指定了 n,那么 n 的值就是最大长度。
*二进制大对象,BLOB(n[K|M|G]):二进制大对象是变长字符串,最长可达 2,147,483,647 字节。若是只指定了 n,那么 n 就是最大长度。
日期时间型数据类型
*DATE:DATE 是一个由三部分组成的值(年、月和日)。
*TIME:TIME 是一个由三部分组成的值(小时、分钟和秒)。
*TIMESTAMP:TIMESTAMP 是一个由七部分组成的值(年、月、日、小时、分钟、秒和微秒)。
*日期值的字符串表示是一个以数字开始,长度很多于 8 个字符的字符串。日期值的月份和日部分中前面的零能够省略。
*时间值的字符串表示是以数字开头,长度很多于 4 个字符的字符串。时间值的小时部分前面的零能够省略,秒部分能够彻底省略。若是秒的值没有指定,那么就认为是 0。
*时间戳记值的字符串表示是以数字开头,长度很多于 16 个字符的字符串。完整的时间戳记字符串表示形式为 yyyy-mm-dd-hh.mm.ss.nnnnnn。
时间戳记值的月、日或小时等几部分前面的零能够省略,微秒能够截断或彻底省略。若是任什么时候间戳记值的微秒部分尾零被省略掉了,那么将假定空缺的数位上是零。
example:
create table db2admin.t_test1(id smallint,name character(10),addr clob(1000),indate date);
insert into db2admin.t_test1(id,name,addr,indate) values(001,'jenny','ccccccccc','2009-10-01');
3、db2 sql 一些语法
declare :定义变量 和 定义出错处理 (declare必须要 begin后面才用,并且db2没有匿名块的概念)
格式:declare sql-var-name data-type default default-values
SET : SET 语句来为变量和数组元素赋值
格式:SET variable_name = value/expression/NULL;
例子:SET total = (select sum(c1) from table);
VALUE INTO: 为变量赋值
格式:VALUES 值 INTO 变量名;
例子:VALUES 'TEST' INTO v1;
SELECT INTO : 为变量赋值
格式:SELECT 字段/函数 INTO 变量名 FROM TABLE;
例子:SELECT COUNT(*) INTO var1 FROM T1;
返回当前日期和时间(专用寄存器实现),相似于oracle的sysdate之类的系统函数,能够在SQL 语句或 SQL PL 语句中访问和引用:
CURRENT DATE 也可写成 CURRENT_DATE
CURRENT TIME 也可写成 CURRENT_TIME
CURRENT TIMESTAMP 也可写成 CURRENT_TIMESTAMP
CURRENT USER 也可写成 CURRENT_USER
CURRENT PATH 也可写成 CURRENT_PATH
四,db2的行号写法
ROW_NUMBER() OVER () AS NUMBER
五,如何在命令符下提交存储过程
cmd -->db2cmd
在存储过程的最后加上@符号,而后在命令符下打入:db2 -td@ -vf procfile.sql 就能够生成过程。
非存储过程的SQL文件,在命令符下打入:db2 –tvf sqlfile.sql
六,db2游标
格式:DECLARE cursor_name CURSOR FOR Select-statement [WITHOUT HOLD]/[WITH HOLD] [WITHOUT RETURN]/[WITH RETURN] [TO CALLER]/[TO CLIENT]
关键字解释:
Select-statement: 是一条有效的 SQL SELECT 语句
WITHOUT HOLD/WITH HOLD: 选项定义 COMMIT 操做以后的游标状态(open/close)。默认状况下为 WITHOUT HOLD。
若是使用了 WITH HOLD 选项定义一个游标,那么在 COMMIT 操做以后,该游标保持 OPEN 状态。
在 ROLLBACK 操做以后,全部游标都将被关闭。
WITHOUT RETURN/WITH return 选项指定游标的结果表是否用于做为从一个过程当中返回的结果集。
WITH RETURN TO CALLER 选项指定未来自游标的结果集返回给调用者,后者能够是另外一个过程或一个客户机应用程序。这是默认选项。\
WITH RETURN TO CLIENT 选项指定未来自游标的结果集返回给客户机应用程序,绕过任何中间的嵌套过程。
若要从一个过程当中返回结果集,须要:
建立一个过程,建立时指定 DYNAMIC RESULT SETS 子句。
声明游标,声明时指定 WITH RETURN 子句。
打开该游标,并使之保持 open 状态。
若是关闭该游标,则结果集将不能返回给调用者应用程序。
游标处理
为了在一个过程当中处理一个游标的结果,须要作如下事情:
在存储过程块的开头部分 DECLARE 游标。
打开该游标。
将游标的结果取出到以前已声明的本地变量中。
关闭该游标。(注意:若是如今不关闭游标,当过程终止时将隐式地关闭游标)。
七.选择、分支、循环语法
1)if then else (和oracle写法同样)
IF 条件 THEN
语句
ELSEIF 条件 THEN
语句
ELSE
语句
END IF;
2)case (和oracle写法同样)
case
when 条件 then 语句
.
.
.
else 语句 end case;
3)loop 循环 (有四种LOOP,WHILE ,REPEAT ,FOR,这里只介绍loop和for )
loop_name: LOOP
SQL statements;
LEAVE loop_name;
END LOOP loop_name
典型的cursor loop格式:
OPEN cursor_name;
loop_name: LOOP
FETCH cursor_name INTO 变量名(能够多个之间用逗号分隔);
IF end_ <> 0 THEN -- 到达最后一行时退出循环
LEAVE loop_name;
END IF;
循环执行语句
END LOOP loop_name;
4)for 结果集上的隐式循环(db2admin.p_for_example)
FOR loop_name AS SELECT … FROM
DO
SQL statements;
END FOR;
8、存储过程
格式:CREATE PROCEDURE procedure_name([IN/OUT/INOUT paraname TYPE ])
SPECIFIC specific_name
DYNAMIC RESULT SETS integer
MODIFIES SQL DATA/CONTAINS SQL/READS SQL DATA
NOT DETERMINISTIC/DETERMINISTIC
CALLED ON NULL INPUT
LANGUAGE SQL
PARAMETER CCSID/ ASCII/UNICODE
BEGIN [NOT] ATOMIC
SQL-procedure-body:
END
关键字解释:
procedure-name: 存储过程的名字,在同一个数据库的同一模式下,不能存在存储过程名相同参数数目相同的存储过程,即便参数的类型不一样也不行。
(IN | OUT | INOUT parameter-name data-type,...) :传入参数
IN:输入参数
OUT:输出参数
INOUT:做为输入输出参数
parameter-name:参数名字,在此存储过程当中惟一的标识符。
data-type:参数类型,能够接收SQL类型和建立的表。不支持LONG VARCHAR, LONG VARGRAPHIC, DATALINK, REFERENCE和用户自定义类型。
SPECIFIC specific-name:惟一的特定名称(别名),能够用存储过程名代替,这个特定名称用于dorp存储过程,或者给存储过程添加注视用,但不能调用存储过程。若是不指定,则数据库会自动生成一个yymmddhhmmsshhn时间戳的名字。推荐给出别名。
DYNAMIC RESULT SETS integer:指定存储过程返回结果的最大数量。存储过程当中虽然没有return语句,可是却能返回结果集。
CONTAINS SQL, READS SQL DATA, MODIFIES SQL DATA: 指定存储过程当中的SQL访问级别
CONTAINS SQL: 表示存储过程能够执行中,既不可读取 SQL 数据,也不可修改 SQL 数据。
READS SQL DATA: 表示存储过程能够执行中,可读取SQL,但不可修改 SQL 数据。
MODIFIES SQL DATA: 表示存储过程能够执行任何 SQL 语句。能够对数据库中的数据进行增长、删除和修改。
DETERMINISTIC or NOT DETERMINISTIC:表示存储过程是动态或者非动态的。动态的返回的值是不肯定的。非动态的存储过程每次执行返回的值是相同的。
CALLED ON NULL INPUT:表示能够调用存储过程而无论任何的输入参数是否为NULL,而且,任何的OUT或者INOUT参数能够返回一个NULL或者非空值。检验参数是否为NULL是在过程当中进行的。
LANGUAGE SQL:指定程序的主体用的是SQL语言。
EXTERNAL ACTION or NO EXTERNAL ACTION:表示存储过程是否执行一些改变理数据库状态的活动,而不经过数据库管理器管。默认是
EXTERNAL ACTION。若是指定为NO EXTERNAL ACTION ,则数据库会肯定最最佳优化方案。
PARAMETER CCSID:指定全部输出字符串数据的编码,默认为UNICODE编码数据库为PARAMETER CCSID UNICODE,其余的数据库默认为PARAMETER CCSID 3 ASCII。
9、get db cfg for databasename 获取数据库的配置信息
update db cfg for testdatabase using logfilsiz 6000 修改日志文件大小
db2 ? sql964 根据错误码查看错误解释
10、SQL 函数(据实验不能用case语句)
CREATE FUNCTION [FunctionName] ( <<[ParameterName]> [InputDataType] ,...> )
RETURNS [[OutputDataType] |
TABLE ( [ColumnName] [ColumnDataType] ,... ) |
ROW ( [ColumnName] [ColumnDataType] ,... )]
<SPECIFIC [SpecificName]>
<LANGUAGE SQL>
<DETERMINISTIC | NOT DETERMINISTIC>
<EXTERNAL ACTION | NO EXTERNAL ACTION>
<CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA>
<STATIC DISPATCH>
<CALLED ON NULL INPUT>
[SQLStatements] | RETURN [ReturnStatement]
FunctionName 指定要建立的 SQL 函数的名称。
ParameterName 指定一个或多个函数参数的名称。
InputDataType 指定 ParameterName 所识别的参数所需的数据类型。
OutputDataType 指定函数返回的数据的类型,这种状况是返回单值
TABLE 指表函数,返回一个表,调用方法 select * from TABLE(function_name(parameter)) alias
ROW 行函数, 返回一行,调用方法暂时不详
ColumnName 指定函数返回的一列或多列的名称(若是此函数返回表或行的话)。
ColumnDataType 指定 ColumnName 所识别的列返回的数据类型。
SpecificName 指定分配给这个 UDF 的特定名称。这个名称能够用来引用或删除函数;可是,不能用来调用函数。
SQLStatements 指定在调用函数时执行的一个或多个 SQL 语句。这些语句组合成一个动态复合 SQL 语句。
ReturnStatement 指定用于返回调用函数的应用程序的 RETURN SQL 语句。(若是 SQL 函数体由动态复合语句组成, 那么它必须包含至少一个 RETURN 语句;在调用函数时,必须执行一个 RETURN 语句。若是函数是表函数或行函数, 那么只能包含一个 RETURN 语句,并且此语句必须是使用的最后一个语句)。
11、字符串相加和oracle一相用||
12、动态sql执行
相对于静态SQL 语句,动态SQL 在运行时是没法得知其所有的SQL 语句的。例如若是col1 和tabname 是语句中的两个变量,那么咱们正在处理动态SQL:
'SELECT ' || col1 || ' FROM ' || tabname;
在 DDL 中建议使用动态SQL,以免从属问题和包无效问题。执行递归操做时也须要动态SQL.
能够经过如下两种方法执行动态SQL:
• 使用 EXECUTE IMMEDATE 语句– 对于单独执行的SQL 这是理想的方法(和oracle同样,只不过oracel好像只有这一种执行方法)
• 在 EXECUTE 语句以前用PREPARE 语句 – 对于多重执行的SQL 语句此方法比较理想。
CREATE PROCEDURE dyn1 (IN value1 INT, IN value2 INT)
SPECIFIC dyn1
BEGIN
DECLARE stmt varchar(255);
DECLARE st STATEMENT;
SET stmt = 'INSERT INTO T2 VALUES (?, ?)';
PREPARE st FROM stmt;
EXECUTE st USING value1, value1;
EXECUTE st USING value2, value2;
SET stmt = INSERT INTO T2 VALUES (9,9)';
EXECUTE IMMEDIATE stmt;
END
十3、db2用单引号中的数据做为字符串,若是要输入单引号则需输入两个,第一个做为了转义字符(和oracle同样)
十4、db2的用户和oracle用户的比较
一个数据库只对应一个实例,可是一个实例能够有多个数据库(和oracle同样),差异比较大的应该是用户的定义不太同样
db2:必定得是系统用户
oracle:能够用具备dba权限的用户新建用户,不必定非得操做系统用户
db2:每一个用户新建的表都是从属于该用户,可是A用户能够新建查询更新B用户的数据。只须要前面增长B用户标识感受db2是全部数据都是放在同一个数据库,只是建表的时候把当前用户id看成了表名的一部分
oracle:每一个用户新建的表都是从属于该用户,别的用户不能对其它用户的数据进行增删改查,除非赋予了该用户能够对其它用户数据进行操做。oracle是彻底意义上的一个用户即一个独立数据库。
看存储过程文本
select text from syscat.procedures where procname='PROC1';
--看表结构
--describe table syscat.procedures describe select * from syscat.procedures
十5、实例操做
win cmd下输入: db2cmd -->db2icrt <实例名称> 即新建一个实例
db2ilist 显示该数据库有多少个实例
db2 get instance 显示当前运行的实例
set db2instance=实例名称 设置当前实例(也能够在win 环境变量中设置DB2INSTANCE变量)
db2start 启动当前实例
db2stop 中止当前实例
db2stop force 强制中止
db2idrop 删除一个实例
注:如须要显示实例或者数据库(用命令新加的)在控制中心中,须要在控制中心中手工添加(右键->添加->发现)
db2 create database 数据库名称 在当前实例下新建一个数据库
db2 list db directory 显示当实例的全部数据库
db2 drop database 数据库名称 删除一个数据库
db2 connect to <database_name> 链接数据库
随着数据库的建立,有几个默认的对象也同时被建立:表空间,表,缓冲池,日志文件。
默认几个表空间以下(基本和oracle差很少,不一样的只是名字而已)
SYSCATSPACE(oracle:system) 表空间包含目录表(Catalog),它包含不可更改和不可删除的系统信息,不然数据库没法正常工做
TEMPSPACE1(oracle:temp) 当DB2实现一些相似排序等须要额外空间的操做时会用到
USERSPACE1(oracle:users) 若是建立一个表的时候没有指定空间,系统一般会使用USERSPACE1 来存储您的数据库表。
SYSTOOLSPACE(oracle:SYSAUX) 系统工具类存放空间,
十6、db2配置
使用配置向导工具(configur)tion Advisor Tool)能够设置db2参数。在控制中心右键单击数据库并选择"Configuration Advisor",
根据您对系统资源和工做载荷的描述,配置向导会提供一个db2推荐参数列表,您能够阅读它们来得到更多关于db2配置的细节信息,也可直接使用配置向导提供的数值。
一个db2服务器能够在四个不一样层面上加以配置:
环境变量
数据库管理器配置文件(db cfg)
数据库配置文件(db cfg)
db2概要文件注册表
环境变量是在服务器的操做系统层设置的。数据库管理器配置文件变量是在实例层设置的。
数据库配置变量是在数据库层设置的。db2的概要文件注册则能够在操做系统层或实例层设置
1)环境变量
环境变量是在操做系统层设置的变量。db2instance是其中一个主要的环境变量。这个变量显示了当前活动的实例--即您的db2命令执行操做的实例。
例如,在命令窗口中设置一个活动的实例'myinst',您能够运行以下操做系统命令:set db2instance=myinst.
2)数据库管理器配置文件
数据库管理器配置文件(dbm cfg)包含一些参数,这些参数影响对应的实例和及其数据库。您能够经过命令行或者DB2 控制中心查看和修改数据库管理器配置文件。
想要从控制中心启动DBM CFG,能够在控制中心实例(instance)文件夹内选择实例对象,而后右键单击,在弹出菜单上选择配置参数(Configure Parameters)。
在选择配置参数(Configure Parameters)以后,屏幕会显示dbm cfg 参数列表,
不少参数都是动态的,当即生效;可是,有一些参数的修改须要重启实例。能够在命令行使用db2stop 和db2start 命令来实现。
在中止一个实例以前,必须断开全部应用与实例的链接。若是您但愿强制中止实例,可使用db2stop force 命令。
还能够经过控制中心来中止和启动实例——单击实例对象选择Stop 或Start 便可。
db2 get dbm cfg 从新获得dbm cfg 的信息
db2 update dbm cfg using <parameter_name> <value> 更新dbm cfg 的参数信息
3)数据库配置文件(db cfg)
数据库配置文件(db cfg)包含影响对应数据库的参数。数据库配置文件也能够经过命令行或者控制中心来查看或者修改。
从控制中心启动DB CFG,能够在数据库(database)文件夹中选择数据库对象,并右键单击弹出菜单,在菜单中选择配置参数(Configure Parameters)。
选择配置参数后(Configure Parameters),屏幕会显示一个db cfg 参数的清单
get db cfg for <database_name> 从新获得指定数据库的db cfg 信息
update db cfg for <database_name> using <parameter_name> <value> 更新db cfg 参数的值
4)DB2 概要文件注册表
DB2 概要文件注册表包含了与平台相关的全局(影响全部实例)或者实力层次(只影响某个实例)的参数。
十7、其它一些语句
db2 list applications show detail 查询当前正在链接数据库的链接详细信息
db2 list applications 查询当前正在链接数据库的链接
db2 force application all 切断全部链接数据库的链接
db2 force application () (<application> 填入程序“db2bp.exe”的句柄,该值由db2 list applications命令得到)
LOGSECOND —— 主日志文件占用满时,能够分配的二级日志文件的个数
十8、create table时能够指定列的默认值,格式以下 WITH DEFAULT 默认值
建立db2自动赋值的标识 subscriberID INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 100 INCREMENT BY 100),
建立系列及引用(和oracle同样第一次调用须要初始化,即第一次调用只能用nextval): 建立格式:CREATE SEQUENCE seq_name START WITH 10 INCREMENT BY 1 NO CYCLE
引用格式:nextval for seq_name(下一个值)/prevval for seq_name(当前值)
SYSIBM.SYSDUMMY1。这是一个包含一行一列的系统目录表。若是一个查询要求只获得一个输出,可使用该表。(如oracle的dual表)
• SYSCAT.TABLES
• SYSCAT.INDEXES
• SYSCAT.COLUMNS
• SYSCAT.FUNCTIONS
• SYSCAT.PROCEDURES数据库