数据定义语言(DDL)

CREATE SEQUENCE  D.Yemanov

为了与SQL-99语法一致,SEQUENCE作为GENERATOR的同义词被提出。在SQL规范的描述中,SEQUENCE是一个语法术语,而GENERATOR是一个遗留下列的InterBase的语法术语。建议在你的应用程序中使用标准的SEQUENCE语法。

序列生成器是一个生产连续的精确的数字值的机制,一次一个数值。一个序列生产器是一个指定的schema(这个东西怎么翻译?)对象。在dialect 3 语法下它是一个 BIGINT 类型,在dialect 1 语法下它是一个 INTEGER 类型。

语法格式:

CREATE { SEQUENCE | GENERATOR } <名字>
DROP { SEQUENCE | GENERATOR } <名字>
SET GENERATOR <名字> TO <起始值>
ALTER SEQUENCE <名字> RESTART WITH <起始值>
GEN_ID (<名字>, <增长值>)
NEXT value FOR <名字>

例子

1.
CREATE SEQUENCE S_EMPLOYEE;
2.
ALTER SEQUENCE S_EMPLOYEE RESTART WITH 0;

请参阅 NEXT value FOR 的说明。

REVOKE ADMIN OPTION FROM    D. Yemanov

系统管理员(SYSDBA),数据库建立者 (creator) 或 对象的所有者 (owner) 可以将在这个对象上的权限授予给其他用户。任何时候,这些权限都是可以被继承的。依次通过使用 WITH GRANT OPTION ,授权者赋予权限给被授权者,使被授权者成为同样权限的授权者。这个功能可以由原始授权者通过使用 REVOKE GRANT OPTION FROM <用户> 来清除。

任何时候,都有第二个方法来处理角色。你可以建立一个角色,给这个角色赋予一组权利,然后将这个角色授予一个或多个用户,使用这个方法来代替指定同样的权限给多个用户(维护用户很快就成为一个恶梦)。对于这个角色的权限的任何改变都作用于这些用户。

通过使用 WITH ADMIN OPTION,授权者(典型的是建立者)赋予被授权者权利,在这种机制下被授权者成为同样的授权者角色。在FB 2.0版本以前,如果原始的授权者不直接对系统表进行操作,这种继承授权的能力是不能去掉的。现在,这种对角色授权的继承能力可以通过原始授权者对用户使用 REVOKE ADMIN OPTION FROM 就可以清除掉。

————————————————————————————————————————————
视图更新逻辑的改变                     D. Yemanov  

只对基表应用 NOT NULL 约束,忽略视图列继承来自域的定义。
————————————————————————————————————————————
RECREATE EXCEPTION and CREATE OR ALTER EXCEPTION      D. Yemanov

实现了 DDL 语句 RECREATE EXCEPTION 和 CREATE 或者 ALTER EXCEPTION (这个需要 SF #1167973),允许建立、重新建立或者修改一个异常,这依赖它是否存在:

如果定义的异常不存在,RECREATE EXCEPTION 和 CREATE EXCEPTION 的作用完全一样。假如异常存在,如果没有与它相依赖的事情,异常的定义将被完全替换。

假如异常不存在的话,CREATE 或 ALTER EXCEPTION 将建立异常,如果存在的话将会不影响任何依赖地修改异常的定义。
————————————————————————————————————————————
Known "friendly names" (mnemonics) can now be used for declaring
BLOB filter sub_types A. Peshkov
Previously, the only allowed syntax for declaring a blob filter was:
declare filter <name> input_type <number> output_type <number>
entry_point <function_in_library> module_name <library_name>;
The alternative new syntax is:
declare filter <name> input_type <mnemonic> output_type <mnemonic>
entry_point <function_in_library> module_name <library_name>;
where <mnemonic> refers to a subtype known to the engine.
Initially they are binary, text and others mostly for internal usage, but an adventurous user could
write a new mnemonic in rdb$types and use it, since it is parsed only at declaration time. The
engine keeps the numerical value. Remember, only negative subtype values are meant to be
defined by users.
To get the predefined types, do

select RDB$TYPE, RDB$TYPE_NAME, RDB$SYSTEM_FLAG
from rdb$types
where rdb$field_name = 'RDB$FIELD_SUB_TYPE';
RDB$TYPE RDB$TYPE_NAME RDB$SYSTEM_FLAG
========= ============================ =================
0 BINARY 1
1 TEXT 1
2 BLR 1
3 ACL 1
4 RANGES 1
5 SUMMARY 1
6 FORMAT 1
7 TRANSACTION_DESCRIPTION 1
8 EXTERNAL_FILE_DESCRIPTION 1
Examples
Original declaration:
declare filter pesh input_type 0 output_type 3
entry_point 'f' module_name 'p';
Alternative declaration:
declare filter pesh input_type binary output_type acl
entry_point 'f' module_name 'p';
Declaring a name for a user defined blob subtype (remember to commit after the insertion):
SQL> insert into rdb$types
CON> values('RDB$FIELD_SUB_TYPE', -100, 'XDR', 'test type', 0);
SQL> commit;
SQL> declare filter pesh2 input_type xdr output_type text
CON> entry_point 'p2' module_name 'p';
SQL> show filter pesh2;
BLOB Filter: PESH2
Input subtype: -100 Output subtype: 1
Filter library is p
Entry point is p2
————————————————————————————————————————————
建立外键约束不再需要独占访问

现在,可以在不需要对整个数据库进行独占锁定的情况下建立外键约束。
————————————————————————————————————————————
COMMENT 语句
COMMENT 语句,用来设置元数据描述,现在已经被实现了。

语法格式:

COMMENT ON DATABASE IS {'txt'|NULL};
COMMENT ON <basic_type> name IS {'txt'|NULL};
COMMENT ON COLUMN tblviewname.fieldname IS {'txt'|NULL};
COMMENT ON PARAMETER procname.parname IS {'txt'|NULL};

一个空字符串 '' 将被视为 NULL 当内码。(DYN IN THIS CASE)works this way with blobs。

其中:<basic_type>:可以是:DOMAIN,TABLE,VIEW,PROCEDURE,TRIGGER,EXTERNAL FUNCTION,FILTER,EXCEPTION,GENERATOR,SEQUENCE,INDEX,ROLE,CHARACTER SET,COLLATION,SECURITY CLASS(没有实现,因为这个类型是隐藏的)。
————————————————————————————————————————————
数据类型

BLOB SUB_TYPE BINARY                          C. Valderrama
作为 SUB_TYPE 0 的同义词被引入。
————————————————————————————————————————————
数据操纵语言(DML)

EXECUTE BLOCK 语句                           V. Horsun

SQL语言的扩展语句 EXECUTE BLOCK 使得在 SELECT 语句规范中可以使用“动态 PSQL”。它有这样的效果,如果是存储过程中的话,将允许一个PSQL自包含代码动态SQL语句中执行。

语法格式:

EXECUTE BLOCK [ (param datatype = ?, param datatype = ?, ...) ]
[ RETURNS (param datatype, param datatype, ...) }
AS
[DECLARE VARIABLE var datatype; ...]
BEGIN
...
END

对于客户断,通过使用参数 isc_info_sql_stmt_type 调用 call isc_dsql_sql_info 返回结果。
●如果程序块有输出参数使用:isc_info_sql_stmt_select,这在语法上类似一个 SELECT 查询:客户端打开一个游标,可以从中获取数据,使用后必须关闭。
●如果程序块没有输出参数使用isc_info_sql_stmt_exec_procedure ,这在语法上类似执行 EXECUTE 查询:客户端没有游标并且一直执行直到程序块结束或者被 SUSPEND 终止。

客户端预处理只进行SQL 语句开始或者使用 ‘?’代替‘:’作为参数标识符预处理,因为,在程序块内,使用冒号前缀将被引用为局部变量或参数。

例子:
用户 SQL 为
EXECUTE BLOCK (X INTEGER = :X)
RETURNS (Y VARCHAR)
AS
DECLARE V INTEGER;
BEGIN
INSERT INTO T(...) valueS (... :X ...);
SELECT ... FROM T INTO :Y;
SUSPEND;
END
经过预处理的 SQL 为
EXECUTE BLOCK (X INTEGER = ?)
RETURNS (Y VARCHAR)
AS
DECLARE V INTEGER;
BEGIN
INSERT INTO T(...) valueS (... :X ...);
SELECT ... FROM T INTO :Y;
SUSPEND;
END
——————————————————————————————————————————
ROWS 语法                               D. Yemanov

ROWS 语法用来限制从一个查询短语中返回的行数。对于一个高级的查询语句,它将要求为主程序返回指定数量的行。更多理解可以参考 FIRST/SKIP 子句, ROWS 语法与最近的 SQL 标准保持一致,并带来了额外的好处。它可以在联合,任意类型的子查询中使用,也可以在 UPDATE 或者 DELETE 语句中使用。

它在 DSQL 和 PSQL 中同时有效。

语法格式

SELECT ...
[ORDER BY <expr_list>]
ROWS <expr1> [TO <expr2>]

例子:
1.
SELECT * FROM T1
UNION ALL
SELECT * FROM T2
ORDER BY COL
ROWS 10 TO 100
2.
SELECT COL1, COL2,
( SELECT COL3 FROM T3 ORDER BY COL4 DESC ROWS 1 )
FROM T4
3.
DELETE FROM T5
ORDER BY COL5
ROWS 1

注释点
1、当 <expr2> 省略时,ROWS <expr1> 在语法上等于 FIRST <expr1>。当 <expr1> 和 <expr2> 同时使用时,ROWS <expr1> TO <expr2> 意味着和这个语句相同: FIRST (<expr2>-<expr1>+1) SKIP (<expr1> - 1)
2、没有在语法等同与不使用 FIRST 子句而单独使用 SKIP 子句的功效。
————————————————————————————————————————————
UNION DISTINCT 语法能够使用                  D. Yemanov

为了与 SQL-99 规范保持一致,UNION DISTINCT 现在允许作为一个简单的 UNION 的同义词使用。将来提供更多信息
————————————————————————————————————————————
新的 DISTINCT 相等比较判断(NULL=NULL)作为真        O. Loa,D. Yemanov

语法格式

<value> IS [NOT] DISTINCT FROM <value>

例子:
1.
SELECT * FROM T1
JOIN T2
ON T1.NAME IS NOT DISTINCT FROM T2.NAME;
2.
SELECT * FROM T
WHERE T.MARK IS DISTINCT FROM 'test';

注释点:
1、因为 DISTINCT 判断时认为两个 NULL 值不是不同的,它从不计算 UNKNOWN 的实际值。就像 IS [NOT] NULL 判断一样,它只能是真或者假。
2、NOT DISTINCT 判断可以被索引优化,假如其中一个有效的话。
————————————————————————————————————————
NULL 现在可以在语法作为一个值来使用             D. Yemanov

你现在可以指定 A=NULL,B>NULL,等等。(所有这些计算结果都等于 FALSE)。更多信息将来提供。
————————————————————————————————————————
视图语法规范的扩展                      D. Yemanov

FIRST/SKIP 与 ROWS 语法和 PLAN 与 GROUP BY 子句现在可以使用到视图规范中了。更多的信息将来提供。
————————————————————————————————————————
实现了 CROSS JOIN                      D. Yemanov

现在支持了 CROSS JOIN 了。逻辑上,语法格式为:

A CROSS JOIN B
等于下面中的一个:
A INNER JOIN B ON 1=1
或者,简单的:
FROM A,B
更多的信息将来提供。
————————————————————————————————————————
子查询和 INSERT 语句现在可以使用联合数据集         D. Yemanov

在子查询和 INSERT INTO SELECT ……中的 SELECT 规范中现在可以使用一个 UNION 数据集了。更多的信息将来提供。
————————————————————————————————————————
联合中的类型强制逻辑改善                  A. Brinkman

联合中的数据子集之间的自动类型强制逻辑现在更加智能化了。决定 兼容数据类型的聚合处理后的结果的值数据类型的确定,现在使用更灵活的规则,像分支表达式以及联合查询中表达式中的相同位置的列等。

语法规则
1、DTS设置的数据类型将包容我们必须自行决定的结果数据类型。(译者注:DTS--数据类型转换处理系统)
2、所有的数据类型在DTS中都是可以比较的。
3、分下列情况:
  A、假如DTS中任意一个数据类型是字符串,那么:
   i、假如 DTS 中间有任意一个数据类型是可变字符串,那么结果数据类型是可变字符串类型,并且字符串的最大长度等于 DTS 中最长的字符串长度。
   ii、其他情况下,结果数据类型是定长字符串,并且字符串的长度等于 DTS 中最长的字符串的长度。
   iii、字符集和collation使用 DTS 中遇到的第一个字符串数据类型的字符集和collation。
  B、如果 DTS 中的所有数据类型都是精确数字,那么结果数据类型也是精确数字,并且范围等于 DTS 中数据类型最大的范围并结合 DTS 中最大的精度。

  注释:只是在运行时检查精度越限,作为开发者应该进行估计避免因聚合解析作用而导致的精度越界。
  C、假如 DTS 中的数据类型任意一个是近似数,那么 DTS 中的每一个数据类型都应是数字类型,否则就会报错。
  D、如果 DTS 中的数据类型一些是 datetime 数据类型,那么 DTS 中的每个数据都应是 datetime 数据类型并具有相同的 datetime 类型。
  E、如果 DTS 中任意一个数据类型是 BLOB,那么 DTS 中的每一个数据类型都应是 BLOB 并且拥有同样的子类型。
————————————————————————————————————————
UPDATE 和 DELETE 语句语法扩展                     O. Loa

ROWS 规范和 PLAN 与 ORDER BY 子句现在可以使用在 UPDATE 和 DELETE 语句中。更多的信息将来提供。
————————————————————————————————————————
环境变量 ROW_COUNT 返回查询计数                    D. Yemanov

ROW_COUNT 现在可以返回 SELECT 语句返回的行的数量。更多的信息将来提供。