精华内容
下载资源
问答
  • DB2中常用sql语句语法

    2021-05-18 01:09:38
    DB2 提供了关连式资料库的查询语言sql(structured query language),是一种非常口语化、既易学又易懂的语法。此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操作,包含了资料的定义(ddl)以及资料的...

    DB2 提供了关连式资料库的查询语言sql(structured query language),是一种非常口语化、既易学又易懂的语法。此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操作,包含了资料的定义(ddl)以及资料的处理(dml)。sql原来拼成sequel,这语言的原型以"系统 r"的名字在 ibm 圣荷西实验室完成,经过ibm内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统r 的技术基础发展出来 ibm 的产品。而且美国国家标准学会(ansi)及国际标准化组织(iso)在1987遵循一个几乎是以 ibm sql 为基础的标准关连式资料语言定义。

    一、资料定义 DDL(data definition language)

    资料定语言是指对资料的格式和形态下定义的语言,他是每个资料库要建立时候时首先要面对的,举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。

    1、建表格:

    create table table_name(

    column1 datatype [not null] [not null primary key],

    column2 datatype [not null],

    ...)

    说明:

    datatype --是资料的格式,详见表。

    nut null --可不可以允许资料有空的(尚未有资料填入)。

    primary key --是本表的主键。

    2、更改表格

    alter table table_name

    add column column_name datatype

    说明:增加一个栏位(没有删除某个栏位的语法。

    alter table table_name

    add primary key (column_name)

    说明:更改表得的定义把某个栏位设为主键。

    alter table table_name

    drop primary key (column_name)

    说明:把主键的定义删除。

    3、建立索引

    create index index_name on table_name (column_name)

    说明:对某个表格的栏位建立索引以增加查询时的速度。

    4、删除

    drop table_name

    drop index_name

    二、DDL的资料形态 datatypes

    smallint 16 位元的整数。

    interger 32 位元的整数。

    decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点后有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。

    float 32位元的实数。

    double 64位元的实数。

    char(n) n 长度的字串,n不能超过 254。

    varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。

    graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。

    vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。

    date 包含了 年份、月份、日期。

    time 包含了 小时、分钟、秒。

    timestamp 包含了 年、月、日、时、分、秒、千分之一秒。

    三、资料操作DML (data manipulation language)

    资料定义好之後接下来的就是资料的操作。资料的操作不外乎增加资料(insert)、查询资料(query)、更改资料(update) 、删除资料(delete)四种模式,以下分 别介绍他们的语法:

    1、增加资料:

    insert into table_name (column1,column2,...)

    values ( value1,value2, ...)

    说明:

    1.若没有指定column 系统则会按表格内的栏位顺序填入资料。

    2.栏位的资料形态和所填入的资料必须吻合。

    3.table_name 也可以是景观 view_name。

    insert into table_name (column1,column2,...)

    select columnx,columny,... from another_table

    说明:也可以经过一个子查询(subquery)把别的表格的资料填入。

    2、查询资料:

    基本查询

    select column1,columns2,...

    from table_name

    说明:把table_name 的特定栏位资料全部列出来

    select *

    from table_name

    where column1 = xxx

    [and column2 > yyy] [or column3 <> zzz]

    说明:

    1.''''*''''表示全部的栏位都列出来。

    2.where 之後是接条件式,把符合条件的资料列出来。

    select column1,column2

    from table_name

    order by column2 [desc]

    说明:order by 是指定以某个栏位做排序,[desc]是指从大到小排列,若没有指明,则是从小到大排列

    组合查询

    组合查询是指所查询得资料来源并不只有单一的表格,而是联合一个以上的表格才能够得到结果的。

    select *

    from table1,table2

    where table1.colum1=table2.column1

    说明:

    1.查询两个表格中其中 column1 值相同的资料。

    2.当然两个表格相互比较的栏位,其资料形态必须相同。

    3.一个复杂的查询其动用到的表格可能会很多个。

    整合性的查询:

    select count (*)

    from table_name

    where column_name = xxx

    说明:查询符合条件的资料共有几笔。

    select sum(column1)

    from table_name

    说明:1.计算出总和,所选的栏位必须是可数的数字形态。

    2.除此以外还有 avg() 是计算平均、max()、min()计算最大最小值的整合性查询。

    select column1,avg(column2)

    from table_name

    group by column1

    having avg(column2) > xxx

    说明:1.group by: 以column1 为一组计算 column2 的平均值必须和 avg、sum等整合性查询的关键字一起使用。

    2.having : 必须和 group by 一起使用作为整合性的限制。

    复合性的查询

    select *

    from table_name1

    where exists (

    select *

    from table_name2

    where conditions )

    说明:1.where 的 conditions 可以是另外一个的 query。

    2.exists 在此是指存在与否。

    select *

    from table_name1

    where column1 in (

    select column1

    from table_name2

    where conditions )

    说明:1. in 後面接的是一个集合,表示column1 存在集合里面。

    2. select 出来的资料形态必须符合 column1。

    其他查询

    select *

    from table_name1

    where column1 like ''''x%''''

    说明:like 必须和後面的''''x%'''' 相呼应表示以 x为开头的字串。

    select *

    from table_name1

    where column1 in (''''xxx'''',''''yyy'''',..)

    说明:in 後面接的是一个集合,表示column1 存在集合里面。

    select *

    from table_name1

    where column1 between xx and yy

    说明:between 表示 column1 的值介於 xx 和 yy 之间。

    3、更改资料:

    update table_name

    set column1=''''xxx''''

    where conditoins

    说明:

    1.更改某个栏位设定其值为''''xxx''''。

    2.conditions 是所要符合的条件、若没有 where 则整个 table 的那个栏位都会全部被更改。

    4、删除资料:

    delete from table_name

    where conditions

    说明:删除符合条件的资料。

    说明:关于where条件后面如果包含有日期的比较,不同数据库有不同的表达式。具体如下:

    (1)如果是access数据库,则为:where mydate>#2000-01-01#

    (2)如果是oracle数据库,则为:where mydate>cast(''''2000-01-01'''' as date)

    或:where mydate>to_date(''''2000-01-01'''',''''yyyy-mm-dd'''')

    在delphi中写成:thedate=''''2000-01-01'''';

    query1.sql.add(''''select * from abc where mydate>cast(''''+''''''''''''''''+thedate+''''''''''''''''+'''' as date)'''');

    如果比较日期时间型,则为:where mydatetime>to_date(''''2000-01-01 10:00:01'''',''''yyyy-mm-dd hh24:mi:ss'''')

    审校by lei

    --------------

    1、组合语句执行

    BEGIN   ATOMIC

    表达式1 分号 空格/回车

    表达式2 分号 空格/回车

    END

    2、应该限制访问权限的表(应该撤销这些表PUBLIC SELECT访问权)

    SYSCAT.DBAUTH

    SYSCAT.TABAUTH

    SYSCAT.PACKAGEAUTH

    SYSCAT.INDEXAUTH

    SYSCAT.COLAUTH

    SYSCAT.PASSTHRUAUTH

    SYSCAT.SCHEMAAUTH

    比较有用的目录表

    SYSCAT.COLUMNS:包含每一行对应于表或视图中定义的列

    SYSCAT.INDEXCOLUSE:包含每一行包含的所有列

    SYSCAT.INDEXES:包含每一行对应于表或视图中定义的每个索引

    SYSCAT.TABLES:所创建每个表,视图,别名对应其中一行

    SYSCAT.VIEWS:所创建每个视图对应其中一行或几行

    通过索引保持数据唯一性:CREATE UNIQUE INDEX INDEXNAME ON TABLE (COLUMN)

    消除重复行:SELECT DISTINCT COLUMN FROM TABLE

    3、DB2关于时间的一些函数

    得到当前时间的年份、月份、天、小时等等:

    YEAR (current timestamp)

    MONTH (current timestamp)

    DAY (current timestamp)

    HOUR (current timestamp)

    MINUTE (current timestamp)

    SECOND (current timestamp)

    MICROSECOND (current timestamp)

    分别得到当时的日期和时间

    DATE (current timestamp)

    TIME (current timestamp)

    关于时间的一些计算:

    current date + 1 YEAR

    current date + 3 YEARS + 2 MONTHS + 15 DAYS

    current time + 5 HOURS - 3 MINUTES + 10 SECONDS

    计算两个日期之间有多少天:

    days (current date) - days (date(’1999-10-22′))

    得到去除毫秒的当前时间:

    CURRENT TIMESTAMP - MICROSECOND (current timestamp) MICROSECONDS

    将时间转换成字符串:

    char(current date)

    char(current time)

    char(current date + 12 hours)

    将字符串转换成时间:

    TIMESTAMP (’2002-10-20-12.00.00.000000′)

    TIMESTAMP (’2002-10-20 12:00:00′)

    DATE (’2002-10-20′)

    DATE (’10/20/2002′)

    TIME (’12:00:00′)

    TIME (’12.00.00′)

    注意:在DB2的命令编辑器中可以输入SQL语句和DB2中的内部命令。要想显示当前时间的话,不能直接输入current time,这个只能在SQL语言中引用,要想显示有下面方式:

    1) VALUES (current time)

    2) SELECT CURRENT TIME FROM SYSIBM.SYSDUMMY1

    这个与SQL SERVER2000中不一样,在SQL SERVER2000中可以输入Getdate()得到时间,既可以显示,也可以在语句SQL中用。

    4、所有返回前N条数据的表达式

    在SQL SERVER2000中使用TOP N 格式

    比如: SELECT TOP 10 CARDNO FROM CARD

    在DB2中使用fetch first N rows only 格式

    比如:SELECT CARDNO FROM SEALCARD fetch first 10 rows only

    5、函数使用

    查看系统函数: SELECT * FROM SYSibm.sysfunctions;

    比如:ABS(-89)可以作为值输入到SQL中,但是要想在命令编辑器中显示函数的结果的话可以用下列方式:

    1)SELECT ABS(-89) FROM SYSIBM.SYSDUMMY1;

    2)VALUES ABS(-89);

    6、存储过程

    在进行DB2存储过程开发时,我们可以利用很多DB2自带的工具,例如开发中心,控制中心等。但有时使用脚本能带给开发人员更大的灵活性和更高的工作效率。

    在开始开发一个新的或修改一个已存在的存储过程时,我们通常会进行下面一些准备工作:

    1.         查看该存储过程会用到的表的表结构、字段类型、相关索引和示例数据。

    2.         查看相关的存储过程或用户自定义函数(UDF)的定义。

    3.         查找无效的存储过程并生成绑定语句。

    4.         如某个表发生了改变,查看依赖于该表的所有视图、存储过程和用户自定义函数(UDF)

    虽然上述信息都可以通过DB2提供的开发工具和管理工具获得,但是通过脚本可以更快速的获得所需信息,并且可以重复执行。

    使用脚本完成上述任务的关键是理解和使用DB2的系统表。我们先简单回顾一下有关的DB2的系统表和视图:

    1.         syscat.routines:存储所有的存储过程和用户自定义函数(UDF)信息。其中routinename字段为存储过程或用户自定义函数(UDF)的名称,routinetype字段表示该记录表示的是存储过程(P)还是用户自定义函数(F),lib_id字段为存储过程编译后生成的包序列号,origin字段表示该存储过程或用户自定义函数的出处(Q表示是由SQL组成的,E表示用户定义的且是外部的),valid字段表示该存储过程或用户自定义函数是否有效,如果origin字段不是Q的话,该域为空。

    2.         syscat.packages:存储所有被绑定的程序包。其中pkgname表示包名称,valid字段表示该包是否合法。

    3.         syscat.packagedep:存储关于程序包的依赖关系。其中pkgname字段表示程序包名,btype字段表示被依赖对象的类型,bname字段表示被依赖对象的名称。

    4.         syscat.routinedep:存储关于程序(routine)的依赖关系。其中routinename字段表示程序名,btype字段表示被依赖对象的类型,bname字段表示被依赖对象的名称。

    5.         syscat.viewdep:存储了关于视图的依赖关系。其中viewname字段表示视图名,btype字段表示被依赖对象的类型,bname字段表示被依赖对象的名称。

    回顾并了解了上述系统表和视图,我们就可以很容易的创建脚本以完成前面提到的开发存储过程所要做的准备工作。

    1. 查看该表结构、字段类型、相关索引和示例数据

    虽然我们可以查询sysibm.systables表获得表结构,但有一种更简便的方法来获取表结构,即使用db2look工具。该工具可以生成创建该表和相关的索引的DDL。如我们要获取指定数据库中指定表的结构和前20条数据作为参考,可编写脚本viewtbl.cmd如下,传入参数分别为数据库名和表名。

    @echo ------------------ DDL of table %2 and related index(ex) ------------------

    @db2look -d %1 -t %2 -e

    @echo ------------------ fisrt 20 rows in table %2 ------------------

    @db2 select * from %2 fetch first 20 rows only

    2.查看已存在的存储过程和用户自定义函数(UDF)的定义,将结果存入文件并自动打开结果文件。

    可以从syscat.routines表中做简单查询实现脚本viewrtn.cmd。

    @db2 SELECT text FROM SYSCAT.ROUTINES WHERE ROUTINENAME=upper('%1') > %1.sql

    @start %1.sql

    3.查看所有无效的存储过程并生成绑定语句

    删除存储过程引用的表会引起该存储过程无效。无效存储过程可以采用查询syscat.routines和syscat.packages的方法获得:

    SELECT

    RTRIM(r.routineschema) || '.' || RTRIM(r.routinename) AS spname ,

    RTRIM(r.routineschema) || '.' || 'P'||SUBSTR(CHAR(r.lib_id+10000000),2) AS pkgname

    FROM

    SYSCAT.routines r

    WHERE

    r.routinetype = 'P'

    AND (

    (r.origin = 'Q' AND r.valid != 'Y')

    OR EXISTS (

    SELECT 1 FROM syscat.packages

    WHERE pkgschema = r.routineschema

    AND pkgname = 'P'||SUBSTR(CHAR(r.lib_id+10000000),2)

    AND valid !='Y'

    )

    )

    ORDER BY spname

    注意要同时查询syscat.routines和syscat.packages表,因为在程序包无效时syscat.routines中的valid值仍可能为Y。

    如果要自动生成重新绑定语句,只需将上述SQL改写并存成invalidSP.cmd:

    @echo off

    db2 "SELECT rebind package '|| RTRIM(r.routineschema) || '.' || 'P'||SUBSTR(CHAR(r.lib_id+10000000),2)||' resolve any' FROM SYSCAT.routines r WHERE r.routinetype = 'P' AND ((r.origin = 'Q' AND r.valid != 'Y') OR EXISTS (SELECT 1 FROM syscat.packages WHERE pkgschema = r.routineschema AND pkgname = 'P'||SUBSTR(CHAR(r.lib_id+10000000),2) AND valid !='Y') )" >rebindsp.bat

    4.查看某个表所依赖的视图、存储过程和用户自定义函数(UDF)

    使用上述系统视图,我们很容易编写出脚本:

    @echo off

    echo --- dependent SPs ---

    db2 "select proc.procschema, proc.procname from syscat.routines r, syscat.procedures proc, syscat.packagedep pdep where pdep.bname=upper('%2') and pdep.bschema=upper('%1') and r.specificname=proc.specificname AND pdep.pkgname = 'P'||SUBSTR(CHAR(r.lib_id+10000000),2)"

    echo --- dependent UDF ---

    db2 select routineschema, routinename from syscat.routinedep where bschema = upper('%1') and bname = upper('%2') and btype ='T' order by bname

    echo --- dependent view ---

    db2 select viewschema, viewname from syscat.viewdep where bschema = upper('%1') and bname = upper('%2') and btype ='T' order by bname

    行业借鉴经验:提高DB2存储过程性能和健壮性的3个最佳实践

    最佳实践1:在创建存储过程语句中提供必要的参数

    创建存储过程语句(CREATE PROCEDURE)可以包含很多参数,虽然从语法角度讲它们不是必须的,但是在创建存储过程时提供这些参数可以提高执行效率。下面是一些常用的参数:

    l         容许SQL(allowed-SQL)

    容许SQL(allowed-SQL)子句的值指定了存储过程是否会使用SQL语句,如果使用,其类型如何。它的可能值如下所示:

    NO SQL: 表示存储过程不能够执行任何SQL语句。

    CONTAINS SQL: 表示存储过程可以执行SQL语句,但不会读取SQL数据,也不会修改SQL数据。

    READS SQL DATA: 表示在存储过程中包含不会修改SQL数据的SQL语句。也就是说该储存过程只从数据库中读取数据。

    MODIFIES SQL DATA: 表示存储过程可以执行任何SQL语句。即可以对数据库中的数据进行增加、删除和修改。

    如果没有明确声明allowed-SQL,其默认值是MODIFIES SQL DATA。不同类型的存储过程执行的效率是不同的,其中NO SQL效率最好,MODIFIES SQL DATA最差。如果存储过程只是读取数据,但是因为没有声明allowed-SQL类型,它会被当作对数据进行修改的存储过程来执行,这显然会降低程序的执行效率。因此创建存储过程时,应当明确声明其allowed-SQL类型。

    l         返回结果集个数(DYNAMIC RESULT SETS n)

    存储过程能够返回0个或者多个结果集。为了从存储过程中返回结果集,需要执行如下步骤:

    在CREATE PROCEDURE 语句的DYNAMIC RESULT SETS子句中声明存储过程将要返回的结果集的数量。如果这里声明的返回结果集的数量小于存储过程中实际返回的结果集数量,在执行该存储过程的时候,DB2会返回一个警告。

    使用WITH RETURN子句,在存储过程体中声明游标。

    为结果集打开游标。当存储过程返回的时候,保持游标打开。

    在创建存储过程时指定返回结果集的个数可以帮助程序员验证存储过程是否返回了所期待数量的结果集,提高了程序的完整性。

    最佳实践2:对输入参数进行必要的的检查和预处理

    无论使用哪种编程语言,对输入参数的判断都是必须的。正确的参数验证是保证程序良好运行的前提。同样的,在DB2存储过程中对输入参数的验证和处理也是很重要的。正确的验证和预处理操作包括:

    如果输入参数错误,存储过程应返回一个明确的值告诉客户应用,然后客户应用可以根据返回的值进行处理,或者向存储过程提交新的参数,或者去调用其他的程序。

    根据业务逻辑,对输入参数作一定的预处理,如大小写的转换,NULL与空字符串或0的转换等。

    在DB2储存过程开发中,如需要遇到对空(NULL)进行初始化,我们可以使用COALESCE函数。该函数返回第一个非NULL的参数。例如,COALESCE(piName,''),如果变量piName为NULL,那么函数会返回'',否则就会返回piName本身的值。因此,可以用下面的代码检查piName是否非NULL并且非空字符串:

    SET poGenStatus = 0;

    SET piName   =RTRIM(COALESCE(piName, ''));

    IF (piName ='')

    THEN

    SET poGenStatus = 34100;

    RETURN poGenStatus;

    ENDIF;

    同理,使用COALESCE可以对任何类型的输入参数进行初始化或验证。下面是对参数初始化规则的一个总结:

    1.       输入参数为字符类型,且允许为NULL的,如希望缺省值为空字符串,可以使用COALESCE(inputParameter, '')把NULL转换成空字符串;

    2.       输入类型为整型,且允许为NULL的,如希望缺省值为0,可以使用COALESCE(inputParameter,0),把NULL转换成0;

    3.       输入参数为字符类型,且不允许是NULL或空字符串的,可以使用RTRIM(COALESCE(inputParameter, ''))把NULL转换成空字符串,然后验证函数返回值是否为空字符串;

    4.       输入类型为整型,且不允许是NULL的,不需要使用COALESCE函数,直接使用IS NULL进行验证。

    最佳实践3:异常(condition)处理

    在存储过程执行的过程中,经常因为数据或者其他问题产生异常(condition)。根据业务逻辑,存储过程应该对异常进行相应处理或直接返回给调用者。此处暂且将condition译为异常以方便理解。实际上有些异常(condition)并非是由于错误引起的。

    当存储过程中的语句返回的SQLSTATE

    ===============审校bylei===============

    1. 建立数据库DB2_GCB

    CREATE DATABASE DB2_GCB ON G: ALIAS DB2_GCB

    USING CODESET GBK TERRITORY CN COLLATE USING SYSTEM DFT_EXTENT_SZ 32

    2. 连接数据库

    connect to sample1 user db2admin using 8301206

    3. 建立别名

    create alias db2admin.tables for sysstat.tables;

    CREATE ALIAS DB2ADMIN.VIEWS FOR SYSCAT.VIEWS

    create alias db2admin.columns for syscat.columns;

    create alias guest.columns for syscat.columns;

    4. 建立表

    create table zjt_tables as

    (select * from tables) definition only;

    create table zjt_views as

    (select * from views) definition only;

    5. 插入记录

    insert into zjt_tables select * from tables;

    insert into zjt_views select * from views;

    6. 建立视图

    create view V_zjt_tables as select tabschema,tabname from zjt_tables;

    7. 建立触发器

    CREATE TRIGGER zjt_tables_del

    AFTER DELETE ON zjt_tables

    REFERENCING OLD AS O

    FOR EACH ROW MODE DB2SQL

    Insert into zjt_tables1 values(substr(o.tabschema,1,8),substr(o.tabname,1,10))

    8. 建立唯一性索引

    CREATE UNIQUE INDEX I_ztables_tabname

    ON zjt_tables(tabname);

    9. 查看表

    select tabname from tables

    where tabname='ZJT_TABLES';

    10. 查看列

    select SUBSTR(COLNAME,1,20) as 列名,TYPENAME as 类型,LENGTH as 长度

    from columns

    where tabname='ZJT_TABLES';

    11. 查看表结构

    db2 describe table user1.department

    db2 describe select * from user.tables

    12. 查看表的索引

    db2 describe indexes for table user1.department

    13. 查看视图

    select viewname from views

    where viewname='V_ZJT_TABLES';

    14. 查看索引

    select indname from indexes

    where indname='I_ZTABLES_TABNAME';

    15. 查看存贮过程

    SELECT SUBSTR(PROCSCHEMA,1,15),SUBSTR(PROCNAME,1,15)

    FROM SYSCAT.PROCEDURES;

    16. 类型转换(cast)

    ip datatype:varchar

    select cast(ip as integer)+50 from log_comm_failed

    17. 重新连接

    connect reset

    18. 中断数据库连接

    disconnect db2_gcb

    19. view application

    LIST APPLICATION;

    20. kill application

    FORCE APPLICATION(0);

    db2 force applications all (强迫所有应用程序从数据库断开)

    21. lock table

    lock table test in exclusive mode

    22. 共享

    lock table test in share mode

    23. 显示当前用户所有表

    list tables

    24. 列出所有的系统表

    list tables for system

    25. 显示当前活动数据库

    list active databases

    26. 查看命令选项

    list command options

    27. 系统数据库目录

    LIST DATABASE DIRECTORY

    28. 表空间

    list tablespaces

    29. 表空间容器

    LIST TABLESPACE CONTAINERS FOR

    Example: LIST TABLESPACE CONTAINERS FOR 1

    30. 显示用户数据库的存取权限

    GET AUTHORIZATIONS

    31. 启动实例

    DB2START

    32. 停止实例

    db2stop

    33. 表或视图特权

    grant select,delete,insert,update on tables to user

    grant all on tables to user WITH GRANT OPTION

    34. 程序包特权

    GRANT EXECUTE

    ON PACKAGE PACKAGE-name

    TO PUBLIC

    35. 模式特权

    GRANT CREATEIN ON SCHEMA SCHEMA-name TO USER

    36. 数据库特权

    grant connect,createtab,dbadm on database to user

    37. 索引特权

    grant control on index index-name to user

    38. 信息帮助 (? XXXnnnnn )

    例:? SQL30081

    39. SQL 帮助(说明 SQL 语句的语法)

    help statement

    例如,help SELECT

    40. SQLSTATE 帮助(说明 SQL 的状态和类别代码)

    ? sqlstate 或 ? class-code

    41. 更改与"管理服务器"相关的口令

    db2admin setid username password

    42. 创建 SAMPLE 数据库

    db2sampl

    db2sampl F:(指定安装盘)

    43. 使用操作系统命令

    ! dir

    44. 转换数据类型 (cast)

    SELECT EMPNO, CAST(RESUME AS VARCHAR(370))

    FROM EMP_RESUME

    WHERE RESUME_FORMAT = 'ascii'

    45. UDF

    要运行 DB2 Java 存储过程或 UDF,还需要更新服务器上的 DB2 数据库管理程序配置,以包括在该机器上安装 JDK 的路径

    db2 update dbm cfg using JDK11_PATH d:\sqllib\java\jdk

    TERMINATE

    update dbm cfg using SPM_NAME sample

    46. 检查 DB2 数据库管理程序配置

    db2 get dbm cfg

    47. 检索具有特权的所有授权名

    SELECT DISTINCT GRANTEE, GRANTEETYPE, 'DATABASE' FROM SYSCAT.DBAUTH

    UNION

    SELECT DISTINCT GRANTEE, GRANTEETYPE, 'TABLE ' FROM SYSCAT.TABAUTH

    UNION

    SELECT DISTINCT GRANTEE, GRANTEETYPE, 'PACKAGE ' FROM SYSCAT.PACKAGEAUTH

    UNION

    SELECT DISTINCT GRANTEE, GRANTEETYPE, 'INDEX ' FROM SYSCAT.INDEXAUTH

    UNION

    SELECT DISTINCT GRANTEE, GRANTEETYPE, 'COLUMN ' FROM SYSCAT.COLAUTH

    UNION

    SELECT DISTINCT GRANTEE, GRANTEETYPE, 'SCHEMA ' FROM SYSCAT.SCHEMAAUTH

    UNION

    SELECT DISTINCT GRANTEE, GRANTEETYPE, 'SERVER ' FROM SYSCAT.PASSTHRUAUTH

    ORDER BY GRANTEE, GRANTEETYPE, 3

    create table yhdab

    (id varchar(10),

    password varchar(10),

    ywlx varchar(10),

    kh varchar(10));

    create table ywlbb

    (ywlbbh varchar(8),

    ywmc varchar(60))

    48. 修改表结构

    alter table yhdab ALTER kh SET DATA TYPE varchar(13);

    alter table yhdab ALTER ID SET DATA TYPE varchar(13);

    alter table lst_bsi alter bsi_money set data type int;

    insert into yhdab values

    ('20000300001','123456','user01','20000300001'),

    ('20000300002','123456','user02','20000300002');

    49. 业务类型说明

    insert into ywlbb values

    ('user01','业务申请'),

    ('user02','业务撤消'),

    ('user03','费用查询'),

    ('user04','费用自缴'),

    ('user05','费用预存'),

    ('user06','密码修改'),

    ('user07','发票打印'),

    ('gl01','改用户基本信息'),

    ('gl02','更改支付信息'),

    ('gl03','日统计功能'),

    ('gl04','冲帐功能'),

    ('gl05','对帐功能'),

    ('gl06','计费功能'),

    ('gl07','综合统计')

    二. 目录视图说明

    说明   目录视图

    检查约束   SYSCAT.CHECKS

    列   SYSCAT.COLUMNS

    检查约束引用的列  SYSCAT.COLCHECKS

    关键字中使用的列  SYSCAT.KEYCOLUSE

    数据类型  SYSCAT.DATATYPES

    函数参数或函数结果  SYSCAT.FUNCPARMS

    参考约束  SYSCAT.REFERENCES

    模式 SYSCAT.SCHEMATA

    表约束  SYSCAT.TABCONST

    表  SYSCAT.TABLES

    触发器  SYSCAT.TRIGGERS

    用户定义函数 SYSCAT.FUNCTIONS

    视图  SYSCAT.VIEWS

    三. 字符串类型

    二进制大对象 (BLOB) 字符串。

    字符大对象 (CLOB) 字符串,它的字符序列可以是单字节字符或多字节字符,或这两者的组合。

    双字节字符大对象 (DBCLOB) 字符串,它的字符序列是双字节字符。

    四. 数据库范式

    第一种规范形式:表中的每一行和每一列均有一个值,永远不会是一组值。

    第二种规范形式:不在关键字中的每一列提供取决于整个关键字的事实。

    第三种规范形式:每个非关键字列提供与其他非关键字列无关并只取决于该关键字的事实。

    第四种规范形式:没有行包含有关一个实体的两个或更多个独立的多值事实。

    五. 数据类型

    数据类型 类型  特性  示例或范围

    CHAR(15) 定长字符串 最大长度为 254   'Sunny day '

    VARCHAR(15) 变长字符 最大长度为 4000   'Sunny day'

    SMALLINT  数字 长度为 2 字节精度为 5 位  范围为-32768 至 32767

    INTEGER  数字 长度为 4 字节精度为 10 位  范围为-2147483648 至 2147483647

    REAL  数字 单精度浮点32 位近似值  范围为-3.402E+38至-1.175E-37或 1.175E-37 至-3.402E+38或零

    DOUBLE  数字 双精度浮点64 位近似值 范围为-1.79769E+308 至-2.225E-307或 2.225E-307 至 1.79769E+308或零

    DECIMAL(5,2) 数字 精度为 5小数位为 2 范围为 -10**31+1 至 10**31-1

    DATE 日期时间  三部分值 1991-10-27

    TIME 日期时间  三部分值 13.30.05

    TIMESTAMP 日期时间  七部分值   1991-10-27-13.30.05.000000

    六. 列函数

    列函数对列中的一组值进行运算以得到单个结果值。下列就是一些列函数的示例。

    AVG

    返回某一组中的值除以该组中值的个数的和

    COUNT

    返回一组行或值中行或值的个数

    MAX

    返回一组值中的最大值

    MIN

    返回一组值中的最小值

    七. 标量函数

    标量函数对值进行某个运算以返回另一个值。下列就是一些由DB2 通用数据库提供的标量函数的示例。

    ABS

    返回数的绝对值

    HEX

    返回值的十六进制表示

    LENGTH

    返回自变量中的字节数(对于图形字符串则返回双字节字符数。)

    YEAR

    抽取日期时间值的年份部分

    展开全文
  • DB2 常用的SQL语句

    2020-12-30 10:41:59
    1、组合语句执行BEGINATOMIC表达式1分号空格/回车表达式2分号空格/回车END2、应该限制访问权限的表(应该撤销这些表PUBLIC SELECT访问权)SYSCAT.DBAUTHSYSCAT.TABAUTHSYSCAT.PACKAGEAUTHSYSCAT.INDEXAUTHSYSCAT....

    1、组合语句执行

    BEGINATOMIC

    表达式1分号空格/回车

    表达式2分号空格/回车

    END

    2、应该限制访问权限的表(应该撤销这些表PUBLIC SELECT访问权)

    SYSCAT.DBAUTH

    SYSCAT.TABAUTH

    SYSCAT.PACKAGEAUTH

    SYSCAT.INDEXAUTH

    SYSCAT.COLAUTH

    SYSCAT.PASSTHRUAUTH

    SYSCAT.SCHEMAAUTH

    比较有用的目录表

    SYSCAT.COLUMNS:包含每一行对应于表或视图中定义的列

    SYSCAT.INDEXCOLUSE:包含每一行包含的所有列

    SYSCAT.INDEXES:包含每一行对应于表或视图中定义的每个索引

    SYSCAT.TABLES:所创建每个表,视图,别名对应其中一行

    SYSCAT.VIEWS:所创建每个视图对应其中一行或几行

    通过索引保持数据唯一性:CREATE UNIQUE INDEX INDEXNAME ON TABLE (COLUMN)

    消除重复行:SELECT DISTINCT COLUMN FROM TABLE

    3、DB2关于时间的一些函数

    得到当前时间的年份、月份、天、小时等等:

    YEAR (current timestamp)

    MONTH (current timestamp)

    DAY (current timestamp)

    HOUR (current timestamp)

    MINUTE (current timestamp)

    SECOND (current timestamp)

    MICROSECOND (current timestamp)

    分别得到当时的日期和时间

    DATE (current timestamp)

    TIME (current timestamp)

    关于时间的一些计算:

    current date + 1 YEAR

    current date + 3 YEARS + 2 MONTHS + 15 DAYS

    current time + 5 HOURS - 3 MINUTES + 10 SECONDS

    计算两个日期之间有多少天:

    days (current date) - days (date(’1999-10-22′))

    得到去除毫秒的当前时间:

    CURRENT TIMESTAMP - MICROSECOND (current timestamp) MICROSECONDS

    将时间转换成字符串:

    char(current date)

    char(current time)

    char(current date + 12 hours)

    将字符串转换成时间:

    TIMESTAMP (’2002-10-20-12.00.00.000000′)

    TIMESTAMP (’2002-10-20 12:00:00′)

    DATE (’2002-10-20′)

    DATE (’10/20/2002′)

    TIME (’12:00:00′)

    TIME (’12.00.00′)

    注意:在DB2的命令编辑器中可以输入SQL语句和DB2中的内部命令。要想显示当前时间的话,不能直接输入current time,这个只能在SQL语言中引用,要想显示有下面方式:

    1)VALUES(current time)

    2)SELECT CURRENT TIME FROM SYSIBM.SYSDUMMY1

    这个与SQL SERVER2000中不一样,在SQL SERVER2000中可以输入Getdate()得到时间,既可以显示,也可以在语句SQL中用。

    4、所有返回前N条数据的表达式

    在SQL SERVER2000中使用TOP N格式

    比如:SELECT TOP 10 CARDNO FROM CARD

    在DB2中使用fetch first N rows only格式

    比如:SELECT CARDNO FROM SEALCARD fetch first 10 rows only

    5、函数使用

    查看系统函数:SELECT * FROM SYSibm.sysfunctions;

    比如:ABS(-89)可以作为值输入到SQL中,但是要想在命令编辑器中显示函数的结果的话可以用下列方式:

    1)SELECT ABS(-89) FROM SYSIBM.SYSDUMMY1;

    2)VALUES ABS(-89);

    6、存储过程

    在进行DB2存储过程开发时,我们可以利用很多DB2自带的工具,例如开发中心,控制中心等。但有时使用脚本能带给开发人员更大的灵活性和更高的工作效率。

    在开始开发一个新的或修改一个已存在的存储过程时,我们通常会进行下面一些准备工作:

    1.查看该存储过程会用到的表的表结构、字段类型、相关索引和示例数据。

    2.查看相关的存储过程或用户自定义函数(UDF)的定义。

    3.查找无效的存储过程并生成绑定语句。

    4.如某个表发生了改变,查看依赖于该表的所有视图、存储过程和用户自定义函数(UDF)

    虽然上述信息都可以通过DB2提供的开发工具和管理工具获得,但是通过脚本可以更快速的获得所需信息,并且可以重复执行。

    使用脚本完成上述任务的关键是理解和使用DB2的系统表。我们先简单回顾一下有关的DB2的系统表和视图:

    1.syscat.routines:存储所有的存储过程和用户自定义函数(UDF)信息。其中routinename字段为存储过程或用户自定义函数(UDF)的名称,routinetype字段表示该记录表示的是存储过程(P)还是用户自定义函数(F),lib_id字段为存储过程编译后生成的包序列号,origin字段表示该存储过程或用户自定义函数的出处(Q表示是由SQL组成的,E表示用户定义的且是外部的),valid字段表示该存储过程或用户自定义函数是否有效,如果origin字段不是Q的话,该域为空。

    2.syscat.packages:存储所有被绑定的程序包。其中pkgname表示包名称,valid字段表示该包是否合法。

    3.syscat.packagedep:存储关于程序包的依赖关系。其中pkgname字段表示程序包名,btype字段表示被依赖对象的类型,bname字段表示被依赖对象的名称。

    4.syscat.routinedep:存储关于程序(routine)的依赖关系。其中routinename字段表示程序名,btype字段表示被依赖对象的类型,bname字段表示被依赖对象的名称。

    5.syscat.viewdep:存储了关于视图的依赖关系。其中viewname字段表示视图名,btype字段表示被依赖对象的类型,bname字段表示被依赖对象的名称。

    回顾并了解了上述系统表和视图,我们就可以很容易的创建脚本以完成前面提到的开发存储过程所要做的准备工作。

    1.查看该表结构、字段类型、相关索引和示例数据

    虽然我们可以查询sysibm.systables表获得表结构,但有一种更简便的方法来获取表结构,即使用db2look工具。该工具可以生成创建该表和相关的索引的DDL。如我们要获取指定数据库中指定表的结构和前20条数据作为参考,可编写脚本viewtbl.cmd如下,传入参数分别为数据库名和表名。

    @echo ------------------ DDL of table %2 and related index(ex) ------------------

    @db2look -d %1 -t %2 -e

    @echo ------------------ fisrt 20 rows in table %2 ------------------

    @db2 select * from %2 fetch first 20 rows only

    2.查看已存在的存储过程和用户自定义函数(UDF)的定义,将结果存入文件并自动打开结果文件。

    可以从syscat.routines表中做简单查询实现脚本viewrtn.cmd。

    @db2 SELECT text FROM SYSCAT.ROUTINES WHERE ROUTINENAME=upper('%1') > %1.sql

    @start %1.sql

    3.查看所有无效的存储过程并生成绑定语句

    删除存储过程引用的表会引起该存储过程无效。无效存储过程可以采用查询syscat.routines和syscat.packages的方法获得:

    SELECT

    RTRIM(r.routineschema) || '.' || RTRIM(r.routinename) AS spname ,

    RTRIM(r.routineschema) || '.' || 'P'||SUBSTR(CHAR(r.lib_id+10000000),2) AS pkgname

    FROM

    SYSCAT.routines r

    WHERE

    r.routinetype = 'P'

    AND (

    (r.origin = 'Q' AND r.valid != 'Y')

    OR EXISTS (

    SELECT 1 FROM syscat.packages

    WHERE pkgschema = r.routineschema

    AND pkgname = 'P'||SUBSTR(CHAR(r.lib_id+10000000),2)

    AND valid !='Y'

    )

    )

    ORDER BY spname

    注意要同时查询syscat.routines和syscat.packages表,因为在程序包无效时syscat.routines中的valid值仍可能为Y。

    如果要自动生成重新绑定语句,只需将上述SQL改写并存成invalidSP.cmd:

    @echo off

    db2 "SELECT '@db2 rebind package '|| RTRIM(r.routineschema) || '.' || 'P'||SUBSTR(CHAR(r.lib_id+10000000),2)||' resolve any' FROM SYSCAT.routines r WHERE r.routinetype = 'P' AND ((r.origin = 'Q' AND r.valid != 'Y') OR EXISTS (SELECT 1 FROM syscat.packages WHERE pkgschema = r.routineschema AND pkgname = 'P'||SUBSTR(CHAR(r.lib_id+10000000),2) AND valid !='Y') )" >rebindsp.bat

    4.查看某个表所依赖的视图、存储过程和用户自定义函数(UDF)

    使用上述系统视图,我们很容易编写出脚本:

    @echo off

    echo --- dependent SPs ---

    db2 "select proc.procschema, proc.procname from syscat.routines r, syscat.procedures proc, syscat.packagedep pdep where pdep.bname=upper('%2') and pdep.bschema=upper('%1') and r.specificname=proc.specificname AND pdep.pkgname = 'P'||SUBSTR(CHAR(r.lib_id+10000000),2)"

    echo --- dependent UDF ---

    db2 select routineschema, routinename from syscat.routinedep where bschema = upper('%1') and bname = upper('%2') and btype ='T' order by bname

    echo --- dependent view ---

    db2 select viewschema, viewname from syscat.viewdep where bschema = upper('%1') and bname = upper('%2') and btype ='T' order by bname

    行业借鉴经验:提高DB2存储过程性能和健壮性的3个最佳实践

    最佳实践1:在创建存储过程语句中提供必要的参数

    创建存储过程语句(CREATE PROCEDURE)可以包含很多参数,虽然从语法角度讲它们不是必须的,但是在创建存储过程时提供这些参数可以提高执行效率。下面是一些常用的参数:

    l容许SQL(allowed-SQL)

    容许SQL(allowed-SQL)子句的值指定了存储过程是否会使用SQL语句,如果使用,其类型如何。它的可能值如下所示:

    NO SQL:表示存储过程不能够执行任何SQL语句。

    CONTAINS SQL:表示存储过程可以执行SQL语句,但不会读取SQL数据,也不会修改SQL数据。

    READS SQL DATA:表示在存储过程中包含不会修改SQL数据的SQL语句。也就是说该储存过程只从数据库中读取数据。

    MODIFIES SQL DATA:表示存储过程可以执行任何SQL语句。即可以对数据库中的数据进行增加、删除和修改。

    如果没有明确声明allowed-SQL,其默认值是MODIFIES SQL DATA。不同类型的存储过程执行的效率是不同的,其中NO SQL效率最好,MODIFIES SQL DATA最差。如果存储过程只是读取数据,但是因为没有声明allowed-SQL类型,它会被当作对数据进行修改的存储过程来执行,这显然会降低程序的执行效率。因此创建存储过程时,应当明确声明其allowed-SQL类型。

    l返回结果集个数(DYNAMIC RESULT SETS n)

    存储过程能够返回0个或者多个结果集。为了从存储过程中返回结果集,需要执行如下步骤:

    在CREATE PROCEDURE语句的DYNAMIC RESULT SETS子句中声明存储过程将要返回的结果集的数量。如果这里声明的返回结果集的数量小于存储过程中实际返回的结果集数量,在执行该存储过程的时候,DB2会返回一个警告。

    使用WITH RETURN子句,在存储过程体中声明游标。

    为结果集打开游标。当存储过程返回的时候,保持游标打开。

    在创建存储过程时指定返回结果集的个数可以帮助程序员验证存储过程是否返回了所期待数量的结果集,提高了程序的完整性。

    最佳实践2:对输入参数进行必要的的检查和预处理

    无论使用哪种编程语言,对输入参数的判断都是必须的。正确的参数验证是保证程序良好运行的前提。同样的,在DB2存储过程中对输入参数的验证和处理也是很重要的。正确的验证和预处理操作包括:

    如果输入参数错误,存储过程应返回一个明确的值告诉客户应用,然后客户应用可以根据返回的值进行处理,或者向存储过程提交新的参数,或者去调用其他的程序。

    根据业务逻辑,对输入参数作一定的预处理,如大小写的转换,NULL与空字符串或0的转换等。

    在DB2储存过程开发中,如需要遇到对空(NULL)进行初始化,我们可以使用COALESCE函数。该函数返回第一个非NULL的参数。例如,COALESCE(piName,''),如果变量piName为NULL,那么函数会返回'',否则就会返回piName本身的值。因此,可以用下面的代码检查piName是否非NULL并且非空字符串:

    SETpoGenStatus=0;

    SETpiName=RTRIM(COALESCE(piName,''));

    IF(piName='')

    THEN

    SETpoGenStatus=34100;

    RETURNpoGenStatus;

    ENDIF;

    同理,使用COALESCE可以对任何类型的输入参数进行初始化或验证。下面是对参数初始化规则的一个总结:

    1.输入参数为字符类型,且允许为NULL的,如希望缺省值为空字符串,可以使用COALESCE(inputParameter, '')把NULL转换成空字符串;

    2.输入类型为整型,且允许为NULL的,如希望缺省值为0,可以使用COALESCE(inputParameter,0),把NULL转换成0;

    3.输入参数为字符类型,且不允许是NULL或空字符串的,可以使用RTRIM(COALESCE(inputParameter, ''))把NULL转换成空字符串,然后验证函数返回值是否为空字符串;

    4.输入类型为整型,且不允许是NULL的,不需要使用COALESCE函数,直接使用IS NULL进行验证。

    最佳实践3:异常(condition)处理

    在存储过程执行的过程中,经常因为数据或者其他问题产生异常(condition)。根据业务逻辑,存储过程应该对异常进行相应处理或直接返回给调用者。此处暂且将condition译为异常以方便理解。实际上有些异常(condition)并非是由于错误引起的。

    当存储过程中的语句返回的SQLSTATE值超过00000的时候,就表明在存储过程中产生了一个异常(condition),它表示出现了错误、数据没有找到或者出现了警告。为了处理存储过程中出现的异常,我们必须在存储过程体中声明异常处理器(condition handler),它可以决定存储过程怎样响应一个或者多个系统定义的异常或者自定义异常。

    异常处理器类型(handler-type)有以下几种:

    lCONTINUE:在处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。

    lEXIT:在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。

    lUNDO:在处理器操作执行之前,DB2会回滚存储过程中执行过的SQL操作。在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。

    异常处理器可以处理基于特定SQLSTATE值的自定义异常,或者处理系统预定义异常。系统预定义的3种异常如下所示:

    lNOT FOUND:标识导致SQLCODE值为+100或者SQLSATE值为02000的异常。这个异常通常在SELECT没有返回行的时候出现。

    lSQLEXCEPTIOIN:标识导致SQLCODE值为负的异常。

    lSQLWARNING:标识导致警告异常或者导致正100以上的SQLCODE值的异常。

    如果产生了NOT FOUND或者SQLWARNING异常,并且没有为这个异常定义异常处理器,系统就会忽略这个异常,并且将控制流转向下一个语句。如果产生了SQLEXCEPTION异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,系统会将控制流返回调用者。因此如果开发人员想改变这种异常处理流程,必须自定义异常处理器。例如,希望在出现SQLWARNING异常时也终止存储过程,并将名为stmt的变量设为“ABORTED”,可以定义下面语句定义异常处理器:

    DECLAREEXITHANDLERFORSQLEXCEPTION, SQLWARNING

    SETstmt='ABORTED';

    如果预定义异常集仍不能满足需求,可以为特定的SQLSTATE值声明自定义异常,然后再为这个异常定制异常声明处理器。为特定的SQLSTATE值声明自定义异常的语法如下:

    DECLARE condition-name CONDITION FOR SQLSATE‘mysqlstate’

    定义了异常和异常处理器后,在存储过程执行的任何都使用SIGNAL condition-name语句触发这种自定义类型的异常。

    异常处理器可以由单独的存储过程语句定义,也可以使用复合语句定义。注意在执行复合语句的时候,SQLSATE和SQLCODE的值会被改变,如果需要保留异常前的SQLSATE和SQLCODE值,就需要在复合语句中的第一个语句把SQLSATE和SQLCODE赋予本地变量或参数。下面是一个例子:

    DECLARECONTINUEHANDLERFORSQLEXCEPTION, SQLWARNING,NOTFOUND

    BEGINNOTATOMIC

    -- Capture SQLCODE & SQLSTATE to local variables

    SELECTSQLCODE, SQLSTATE

    INTOhSqlcode, hSqlstate

    FROMSYSIBM.SYSDUMMY1;

    -- your handler statements below

    ……

    END;

    应用难点技巧:使用Case让你的SQL语句有条件的执行

    我们在编写SQL语句时,常常遇到希望SQL能够按条件执行的情况。这里的条件不是指Where子句中的条件,而是指让DB2根据条件执行SQL的语句块。大多数情况下我们可以使用case来实现。

    例如,我们希望从员工表中查出员工的工资情况,如果小于20000,则标志为low,20000到50000间为middle,否则为high。一般大家会想到先取出工资数据然后在Java代码中做判断,但我们也可以在SQL中完成上述操作。如下例:

    select empno, sex, salary,

    case

    when salary < 20000 then 'low'

    when salary >=20000 and salary <50000 then 'middle'

    else 'high'

    end as salaryclass

    from employee

    类似的,如果想在SQL语句中把性别翻译成文字,也可以用case实现,注意这两条SQL语句使用了不同的case表达式写法:

    select empno,

    case sex

    when 'M' then 'male'

    when 'F' then 'female'

    else 'invalid'

    end,

    salary

    from employee

    Case不但能够在Select子句中使用,在From子句和Where子句中同样可以使用。下面是在Where子句中使用的一个例子:

    select empno, sex, age

    from employee

    where

    case sex

    when 'M' then 55

    when 'F' then 50

    end > age

    在From子句中使用的例子极为少见,下面是一个极端的例子。在合同表ctrct_list、客户表customer和订单表quote中都有合同号字段,但订单表中的合同号可能为空。要求查询出订单表订单id和合同号,如订单表中合同号为空的话,查出客户表中相应的合同号。

    select distinct

    q.quote_id,

    case rtrim(coalesce(q.ctrct_num, ''))

    when '' then rtrim(coalesce(c.ctrct_num, ''))

    else rtrim(coalesce(q.ctrct_num, ''))

    end ctrct_num

    from

    (quote q

    left outer join customer c

    on q.sold_to_cust_num = c.cust_num)

    inner join ctrct_list cl

    on cl.cust_num = q.sold_to_cust_num

    and cl.ctrct_num = (

    case rtrim(coalesce(q.ctrct_num, ''))

    when '' then c.ctrct_num

    else q.ctrct_num

    end

    )

    有时让SQL语句有条件的执行也可以不使用case。下面是一个例子:

    select *

    from EMPLOYEE

    WHERE

    ((job='MANAGER') AND vMgrFlag=1)

    or

    ((job='DESIGNER' or job='ANALYST') AND vTechFlag =1)

    or

    ((job='CLERK' or job='OPERATOR') AND vOfficeFlag=1)

    此SQL可以要求根据标志位的不同选择出不同类型的雇员。各个标志位在执行SQL前应提前设置好。这种方法可以在某些情况下将动态SQL改写为静态SQL,因此在编写存储过程时非常实用。但要指出的是,DB2的查询优化器不可能将这种SQL也优化得非常高效,因此在数据量比较大时可能会带来性能问题。开发人员需要在编写完成后使用实际数据测试,必要的话进行性能优化。

    展开全文
  • DB2建表语句

    2021-05-18 05:41:12
    db2 => create table test (name char(8) not null primary key,depid smallint,pay bigint)DB20000I SQL 命令成功完成。db2 => create table test1 (name char(8) not null primary key,depid smallint ...

    db2 => create table test (name char(8) not null primary key,depid smallint,pay bigint)

    DB20000I SQL 命令成功完成。

    db2 => create table test1 (name char(8) not null primary key,depid smallint references department (depid),pay bigint)

    DB20000I SQL 命令成功完成。

    db2 => update department set depmanager='abc' where depid=5

    db2 => alter table test alter pay set not null

    DB20000I SQL 命令成功完成。

    db2 => alter table pay add foreign key (depid) references department (depid)

    db2 => reorg table pay

    db2 => alter table pay alter pay drop not null

    db2 => insert into pay (name,depid) select name,depid from phone

    基于表的数据字典构造MySQL建表语句

    表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...

    hive查看建表语句

    查看hive建表语句:show create table tablename; 查看hive表结构:describe  tablename; 简写:desc tablename;

    批量导出hive表的建表语句

    转的这里的 首先先导出所有的table表 hive -e "use xxxdb;show tables;" > tables.txt 然后再使用hive内置语法导出hive表 ...

    根据javabean转换为mysql建表语句与mapper内容

    展开全文
  • db2导出表结构-ddl语句

    2021-09-06 17:36:46
    db2look -d sample -e -o c:\sample ddl.sql
    db2look -d sample -e -o c:\sampleddl.sql
    
    展开全文
  • 最近项目用到mybatis3.1和db28.1版本的数据库,...原因是db2数据库默认回车符就是去执行sql语句db2控制台提供了 'db2 -td;' 这个命令,意思是sql语句以分号结束,这样在控制台执行sql语句时就可以换行了,要命的是...
  • db2sql语句

    2020-12-20 20:55:30
     col 为 char 或 varchar 型 7 列函数 可以参照数据库中 FUNCTIONS 中的说明 用 Quest Centeral 查看,以下是常用的 Max 、 avg 、 count … DB2 中的 VARCHAR 转换为 INTEGER 的函数为 CAST() DB2 中的 INTEGER ...
  • db2删除语句

    2021-01-16 15:36:43
    delete from tableName where condition; delect from ( select * from tableName where condition ); alter table tableName activate not logged initially with empty table;
  • 给数字左侧自动占位补零digits函数:digits(参数)digits里的参数必须是整型参数,可以是smallint,int,bigint,decimal,其中smallint占5位,int占10位,bigint占19位。decimal默认为5位,最多为31位可以表示为...
  • DB2数据库常用语句

    2021-06-03 20:44:03
    创建数据库语句 db2 create db 数据库名 on 路径 using codeset GBK territory cn 连接数据库 db2 connect to 数据库名 user 用户名 using 密码 数据库服务停止和启动 --停止 db2stop force --启动 db2start 整库...
  • MySQL默认使用大小写敏感的数据库名、表名和列名(可以通过lower_case_table_names参数控制是否大小写敏感),DB2数据库对大小写不敏感。虽然MySQL与DB2都遵循并符合SQL92标准且大多数SQL相互兼容,但是在一些细节的...
  • db2更新语句

    2021-01-16 15:37:35
    update tableName set age = 18 where condition; update ( select * from tableName where condition ) set age = 18 ;
  • DB2查询语句

    2021-03-04 04:39:54
    VALUE:WITH AA AS(select a499.MERCHANT_ID,a499.TERMINAL_ID,a499.trans_date,count(*) as count_num,SUM(a499.trans_amount) as count_sumfrom DBAT.DTATA499 a499where a499.MERCHANT_ID IS NOT NULL and a499.IN...
  • 206 [ "$pub_c_sql" = "" ] && pub_result="SQL语句为空" &&return;207 [ "$2" != "" ] && pub_debug="$2";208 #为了和前面的程序兼容,增加传入pub_debug和设置pub_debug参数都起作用! 209 [ "$pub_old_debug" = "" ...
  • DB2 SQL语句笔记

    2021-01-12 18:09:29
    1、CASE WHEN语句SQL中的CASE WHEN使用,Case具有两种格式:简单Case函数和Case搜索函数。--简单Case函数CASE sexWHEN '1' THEN '男'WHEN '2' THEN '女'ELSE '其他'END--Case搜索函数CASEWHEN sex = '1' THEN '男'...
  • 最近将一个批量上传的东西从 SQLSERVER转移到 DB2 的数据库上,说实在话,DB2,我根本没接触过,在别人已经装好的DB2中,按照常规 建立了自己需要的数据表.接下来当然是用 java 去连接DB2 数据库了。好戏马上就来了,...
  • db2查询执行的sql语句

    2021-05-19 00:59:07
    db2查询执行的sql语句以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!楼主的 Java 程序, 是 B/S 的 还是 C/S 的B/S 的, 尝试在 执行 ibatis 的 插入...
  • 示例SQL: 当SEX=man时,MAN_FLAG=1 当SEX=woman时,MAN_FLAG=0 SELECT * FROM student.CHOOSE_CLASS_INFO WHERE MAN_FLAG = CASE WHEN ((SELECT SEX FROM student.STUDENT_INFO WHERE STUDENT_NUMBER='001') =...
  • 最近IBM推出了一个令人十分震惊的数据产品DB2 Express C。这个产品的性能和其他的DB2版本差不多,而更吸引眼球的是它竟然是完全免费的。这对于以MySQL为首的开源数据库是一个不小的冲击,恐怕以后LAMP(Linux+Apache+...
  • db2和oracle语句区别

    2021-05-07 13:44:01
    1、取前N条记录Oracle:Select * from TableName ...DB2:Select * from TableName fetch first N rows only;2、取得系统日期Oracle:Select sysdate from dual;DB2:Select current timestamp from sysibm.sysdumm...
  • pwd) echo "current dir >>>>" ${curDir} cd ${curDir}/sql/ db2 -tvf sql_deploy.sql db2 reorg table GDAPP.USER #init_02 echo "init finished" #checking_03 db2 'connect to gddb user "jmy" using "123456"' ...
  • db2查看表大小

    2021-05-13 23:49:42
    可以通过查看一个表有多少个页的方式,然后乘以页大小就可以算出表所占用空间:$ db2 connect to tkdwtDatabase Connection InformationDatabase server = DB2/AIX64 9.7.4SQL authorization ID = DB2INST1Local ...
  • DB2 Merge Into语句的使用[日期:2013-04-10]来源:blog.csdn.net/bobo12082119作者:bobo12082119[字体:大 中 小]在做数据备份的时候,我们通常情况下是创建一个同样结构的表,定期将数据从生产表中写入备份表中,...
  • {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"云数据库SQL Server,具有企业许可授权,权限更为开放,引擎功能更为强大。...
  • 本文用[xxxxxx]表示一个变量在使用时需要用实际的数据进行替换#一个最简单查询语句select * from [tablename]#带条件的查询语句select * from [tablename] where [columnname] = [value]#查询前n条数据select * from...
  • 该shell脚本用于自动执行当前目录下所有的SQL语句,分为以下几个步骤:步骤1、删除当前目录下已存在的log日志文件#删除当前目录下log日志文件for test1 in `ls`doresult3=$( echo $test1 | grep ".log" )if [[ $...
  • 本文将为您介绍使用用shell抽取db2数据库的数据的方法,下文将为您举例说明,供您参考,希望能对您有所帮助。用shell抽取db2数据库的数据,并进行处理的方法示例如下:#SQL文定义SQL="SELECT AAA, BBB, CCC FROM ...
  • I am working with a DB2 database for the first time.I am trying to work with DB2 dates, but the data is stored as a string in the DB2 database.I want to convert this date-string into an actual date, p...
  • DB2常用语句

    2020-12-19 00:32:45
    DB2数据库的使用技巧分享,今天简单的给大家介绍一下,有什么不懂的大家可以联系我,我们 共同探讨1. 查看本地节点目录 命令窗口中输入:db2 list node Directory2. 编目一个TCP/IP节点命令窗口:db2 catalog tcpip ...
  • Db2迁移至MySQL数据库时,源表DB2有一列是timestamp类型的,目标表MySQL该字段也是timestamp类型的,迁移数据库的时候报错了,插入不了。 原因分析: MySQL中timestamp类型取值范围比较小,只有从'1970-01-01 00...
  • 如图啊!我用root和db2inst1 的身份都执行了,不行的!请各位指教啊!...DBI1768WUnable to add /home/db2inst1/sqllib/db2profile to the .profile file or /home/db2inst1/sqllib/db2csh...显示全部如图...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,353
精华内容 28,141
关键字:

db2语句