©2001国际商用机器公司。 版权所有。
iSeries支持两种类型SQL标识符:普通标识符和定界标识符。 普通标识符以大写字母开头,并转换为所有大写字母。 分隔标识符是SQL转义字符中包含的一个或多个字符的序列。 SQL转义字符是引号,因此分隔的列名称可能被指定为“ CompanyName”。 分隔标识符的最大长度包括列名称的两个SQL转义字符,但其他SQL名称不包括在内。 DB2 UDB iSeries版不支持双字节表名。
通常,将其他数据库移植到iSeries时,DB2 UDB for iSeries SQL标识符长度的最大值不是问题。 DB2 UDB iSeries版的列名最多可以包含30个字符(如果使用分隔的列名,则为28个字符),并且大多数SQL对象(例如表,索引,过程和约束)最多支持128个字符的长度。 模式和授权名称是标识符类型,最大长度最小为10个字符。 所有SQL限制都记录在《 DB2 UDB iSeries版SQL参考》中。 尽管DB2 UDB iSeries版支持长SQL标识符,但是iSeries操作系统OS / 400固有的命令和接口的对象名称硬性最多为10个字符。 例如,用于备份数据库对象(如表和索引)的保存命令仅支持10个字符的标识符。 那么,如何备份标识符长度超过10个字符SQL对象? 当指定SQL标识符长于10个字符时,DB2 UDB iSeries版将自动生成一个长度为10个字符的“短”标识符,该标识符可与OS / 400命令和本机接口一起使用。 为所有SQL对象名称(包括列标识符)生成此“短”名称。 这些最长为10个字符的较短SQL标识符也称为系统名称。 当尝试在同一对象上使用Windows和DOS实用程序时,iSeries对长和短SQL标识符的支持与文件名限制非常相似。
由于系统生成的简称是由系统生成的,因此确实存在缺点。 首先,它们不是用户友好的。 DB2 UDB接受SQL标识符的前五个字符,然后在这五个字符后附加一个五位数的唯一数字。 例如,CUSTOMER_MASTER的简称为CUSTO00001。 其次,更重要的是,由于依赖于创建顺序和共享相同前五个字符的其他标识符,因此不能保证这些短名称在系统之间或同一SQL对象的重复创建中保持一致。 因此,DB2 UDB iSeries版提供了SQL语法以允许您控制短名称。
RENAME TABLE SQL语句已添加到DB2 UDB iSeries版中,以使开发人员能够定义分配给其SQL表的简短系统名称。 RENAME TABLE语句还可用于控制Index和View对象的简称。
另外,将FOR COLUMN子句添加到了iSeries CREATE TABLE和ALTER TABLE语句中,以分配短列名。 由于某些iSeries编程语言(例如RPG)无法访问标识符长度超过十个字符的表列,因此在某些数据库定义中需要短列名称和长列名称。 这是在CREATE TABLE语句上使用FOR COLUMN子句为列定义分配您自己的短系统名称的示例:
CREATE TABLE dbtest/cuastomer_master
(customer_name FOR COLUMN cusnam CHAR (20),
customer_city FOR COLUMN cuscty CHAR(40))
使用此定义,基于SQL的编程接口(例如ODBC和JDBC)将引用长SQL名称(customer_name和customer_city),而遗留应用程序将通过使用短标识符(cuscty和cusnam)来引用相同的列。
继续该示例,让我们看一个使用RENAME TABLE语句控制短表名的示例。 要覆盖customer_master的系统生成的名称(即CUSTO0001),RENAME TABLE语句将分配一个短名称cusmst。
RENAME TABLE dbtest/customer_master
TO SYSTEM NAME cusmst
执行该语句后,SQL表名称为customer_master ,系统表名称为cusmst 。 您SQL请求将引用customer_master,并且OS / 400系统命令(例如SAVOBJ(保存对象)或DSPFD(显示文件描述))将使用简称cusmst。
如果在下面的示例中碰巧使用短名称创建了SQL对象,则RENAME TABLE语句也可以按如下方式使用,以为该对象分配“长” SQL标识符。 完成此RENAME请求后,结果与前面的示例相同-SQL表名称为customer_master,系统表名称为cusmst。
CREATE TABLE dbtest/cusmst
(customer_name FOR COLUMN cusnam CHAR (20),
customer_city FOR COLUMN cuscty CHAR(40))
RENAME TABLE dbtest/cusmst TO customer_master
FOR SYSTEM NAME cusmst
短名称和长名称都存储在DB2目录中。 如果不确定表的系统名称,则可以运行以下查询以从SYSTABLES目录中提取该信息。 可以针对其他类型SQL标识符对目录视图执行类似的查询。
SELECT system_table_name FROM qsys2.systables
WHERE table_name='CUSTOMER_MASTER' AND table_schema='DBTEST'
创建存储过程和用户定义的函数时,可以使用SPECIFIC子句来分配短名称。 创建SQL过程或函数后,DB2 UDB iSeries版将生成一个C程序对象以实现业务逻辑。 即使过程或函数名称的最大长度为128个字符,C程序对象也像表对象一样被限制为10个字符。 当过程或函数名称的长度超过10个字符时,可以按以下方式使用SPECIFIC子句为C程序对象分配一个短名称。 代替使用名为UPDAT00001的C程序对象,该程序对象将被赋予UPDSAL作为名称。
CREATE PROCEDURE UPDATE_SALARY
(IN EMPLOYEE_NUMBER CHAR (10), IN RATE DECIMAL (6,2))
LANGUAGE SQL
SPECIFIC UPDSAL
MODIFIES SQL DATA
BEGIN
UPDATE EMP SET SALARY =SALARY +RATE
WHERE EMPNO =EMPLOYEE_NUMBER;
END
有了有关DB2 UDB iSeries版定制的信息,您现在可以定制SQL数据库定义,以更好地与现有iSeries命令,实用程序和应用程序集成。
翻译自: https://www.ibm.com/developerworks/data/library/techarticle/milligan/0108milligan.html