久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

hana SQL函数

發布時間:2023/12/20 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hana SQL函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1日期

年月日
select
to_date(IN_DATE1,‘yyyy-MM-dd’)
from “_SYS_BIC”.“com.manpower.HR_BB.CAL_004_KQ/CAL_KC”

–時間
select
to_time(CC_SBSJ,‘YYYY-MM-dd HH24:MI:SS’)
from “_SYS_BIC”.“com.manpower.HR_BB.CAL_004_KQ/CAL_KC”

–D查看周幾 DD查看月數 DDD查看當前是今年的天數 都是數字表示
select
to_char(‘2020-11-11’,‘D’),
to_char(CC_SBSJ,‘DD’),
to_char(CC_SBSJ,‘DDD’)
from “_SYS_BIC”.“com.manpower.HR_BB.CAL_004_KQ/CAL_KC”

–Day英文表示周幾全名 Dy英文簡稱 mon月簡稱 month月全稱 yy年 FF2毫秒保留數
select
to_char(CC_SBSJ,‘Day’)
from “_SYS_BIC”.“com.manpower.HR_BB.CAL_004_KQ/CAL_KC”

2數字類型

2.2.1 TINYINT
TINYINT 數據類型存儲一個 8 位(1個字節)無符號整數。 TINYINT 的最小值是 0,最大值是 255。

2.2.2 SMALLINT
SMALLINT 數據類型存儲一個 16 (2個字節)位無符號整數。 SMALLINT 的最小值為-32,768 ,最大值為32, 767。

2.2.3 INTEGER
INTEGER 數據類型存儲一個 32 (4個字節)位有符號整數。 INTEGER 的最小值為-2,147,483,648 ,最大值為 2,147,483,647。

2.2.4 BIGINT
BIGINT 數據類型存儲一個 64 (8個字節)位有符號整數。 INTEGER 的最小值為-9,223,372,036,854,775,808,最大值為 9, 223,372,036,854,775,807。

2.2.5 DECIMAL(精度,小數位數)或 DEC( p, s)
DECIMAL (p, s) 數據類型指定了一個精度為 p 小數位數為 s 的定點小數。精度是有效位數的總數,范圍從 1 至 34。

3字符類型

字符類型用來存儲包含字符串的值。 VARCHAR類型包含 ASCII字符串,而 NVARCHAR用來存儲 Unicode字符串。

2.3.1 VARCHAR
VARCHAR (n) 數據類型定義了一個可變長度的 ASCII 字符串, n 表示最大長度,是一個 1 至5000的整數值。

2.3.2 NVARCHAR
NVARCHAR (n) 數據類型定義了一個可變長度的 Unicode 字符串, n 表示最大長度,是一個1 至 5000的整數值。

2.3.3 ALPHANUM
ALPHANUM (n) 數據類型定義了一個可變長度的包含字母數字的字符串, n 表示最大長度,是一個 1 至 127的整數值。

2.3.4 SHORTTEXT
SHORTTEXT (n) 數據類型定義了一個可變長度的字符串,支持文本搜索和字符搜索功能。

這不是一個標準的 SQL 類型。選擇一列 SHORTTEXT (n) 列會生成一個 NVARCHAR (n)類型的列。

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

2.4二進制類型

二進制類型用來存儲二進制數據的字節。

2.4.1 VARBINARY
VARBINARY 數據類型用來存儲指定最大長度的二進制數據,以字節為單位, n 代表最大長度,是一個 1 至 5000的整數。

2.5大對象( LOB)類型

LOB(大對象)數據類型, CLOB, NCLOB 和 BLOB,用來存儲大量的數據例如文本文件和圖像。 一個 LOB 的最大大小為 2GB。

2.5.1 BLOB
BLOB 數據類型用來存儲大二進制數據。

2.5.2 CLOB
CLOB 數據類型用來存儲大 ASCII 字符數據。

2.5.3 NCLOB
NCLOB 數據類型用來存儲大 Unicode 字符對象。

2.5.4 TEXT
TEXT 數據類型指定支持文本搜索功能,這不是一個獨立的 SQL 類型。 選擇一列 TEXT 列會

生成一個 NCLOB 類型的列。

LOB 類型用于存儲和檢索大量的數據。 LOB 類型支持以下操作:

lLength(n)以字節形式返回 LOB 的長度。

lLIKE 可以用來搜索 LOB 列。

LOB 類型有如下限制:

lLOB 列不能出現在 ORDER BY 或 GROUP BY 子句中。

lLOB 列不能出現在 FROM 子句作為聯接謂詞。

l不能作為謂詞出現在 WHERE 子句中,除了 LIKE, CONTAINS, =或<>。

lLOB 列不能出現在 SELECT 子句作為一個聚合函數的參數。

lLOB 列不能出現在 SELECT DISTINCT 語句中。

lLOB 列不能用于集合操作,除了 EXCEPT, UNION ALL 是個例外。

lLOB 列不能作為主鍵。

lLOB 列不能使用 CREATE INDEX 語句。

lLOB 列不能使用統計信息更新語句。

2.6SQL 數據類型和列存儲數據類型之間的映射

2.7數據類型轉換

本節描述 SAP HANA 數據庫中允許的類型轉換。

2.7.1 顯式類型轉換
表達式結果的類型,例如一個字段索引,一個字段函數或者文字可以使用如下函數進行轉換: CAST, TO_ALPHANUM, TO_BIGINT, TO_VARBINARY,TO_BLOB, TO_CLOB, TO_DATE, TO_DATS, TO_DECIMAL, TO_DOUBLE, TO_INTEGER, TO_INT,TO_NCLOB, TO_NVARCHAR, TO_REAL, TO_SECONDDATE, TO_SMALLINT, TO_TINYINT, TO_TIME,TO_TIMESTAMP, TO_VARCHAR。

2.7.2 隱式類型轉換
當給定的一系列運算符/參數類型不符合其所期望的類型, SAP HANA 數據庫就會執行類型轉換。這種轉換僅僅發生在相關的轉換可供使用,并且使得運算符/參數類型可執行。

舉例來說, BIGINT 和 VARCHAR 之間的比較是通過把 VARCHAR 隱式轉換成 BIGINT 進行的。

顯式轉換可以全部用于隱式轉換,除了 TIME 和 TIMESTAMP 數據類型。 TIME 和TIMESTAMP 可以使用 TO_TIME(TIMESTAMP)以及 TO_TIMESTAMP(TIME)相互轉換。

例子

2.7.3 轉換規則表
在下表中:

? 方框中“OK”表示允許的數據類型轉換,沒有任何檢查。

? 方框中”CHK”表示數據類型轉換只有在數據是有效的目標類型時才執行。

? 方框中”-”表示不允許該數據類型轉換。

如下顯示的規則同時適用于隱式和顯示轉換,除了 TIME 至 TIMESTAMP 的轉換。 TIME 類型只能通過顯示轉換 TO_TIMESTAMP 或者 CAST 函數執行。

2.7.4 類型轉換優先級
本節介紹 SAP HANA 數據庫實施的數據類型的優先級。數據類型優先級指定較低優先級的類型轉換為較高優先級的類型。

2.8、類型常量
常量是表示一個特定的固定數值的符號。

2.8.1 字符串常量
字符串常量括在單引號中。

o ‘Brian’

o ‘100’

Unicode 字符串的格式與字符串相似,但前面有一個 N 標識符( N 代表 SQL-92 標準中的國際語言)。 N 字母前綴必須是大寫。

o N’abc’

SELECT’Brian’“character string 1”, ‘100’“character string 2”, N’abc’"unicode string"FROM DUMMY;

2.8.2 數字常量
數字常量用沒有括在單引號中的數字字符串表示。數字可能包含小數點或者科學計數。

o 123

o 123.4

o 1.234e2

2.8.3 十六進制數字常量
十六進制數字常量是十六進制數的字符串,含有前綴 0x。

o 0x0abc

SELECT 123 “integer”, 123.4 “decimal1”, 1.234e2 “decimal2”, 0x0abc "hexadecimal"FROM DUMMY;

2.8.4 二進制字符串常量
二進制字符串有前綴 X,是一個括在單引號中的十六進制數字字符串。

o X’00abcd’

o x’dcba00’

SELECT X’00abcd’“binary string 1”, x’dcba00’"binary string 2"FROM DUMMY;

2.8.5 日期、時間、時間戳常量
日期、時間、時間戳各自有如下前綴:

o date’2010-01-01’

o time’11:00:00.001’

o timestamp’2011-12-31 23:59:59’

SELECT date’2010-01-01’ “date”, time’11:00:00.001’ “time”, timestamp’2011-12-31 23:59:59’ “timestamp” FROM DUMMY;

SELECTdate’2010-01-01’“date”, time’11:00:00.001’“time”, timestamp’2011-12-31 23:59:59’"timestamp"FROM DUMMY;

3 謂詞
謂詞由組合的一個或多個表達式,或者邏輯運算符指定,并返回以下邏輯 /真值中的一個:

TRUE、 FALSE、或者 UNKNOW。

3.1比較謂詞
兩個值使用比較謂詞進行比較,并返回 TRUE, FALSE 或 UNKNOW。

語法:

<comparison_predicate> ::= { = | != | <> | > | < | >= | <= } [ ANY | SOME| ALL ] { <expression_list> | }

<expression_list> ::= , …

表達式可以是簡單的表達式如字符、日期或者數字,也可以是標量(只有一條結果)子查詢,這種子查詢的SELECT從句中只有一個表字段或者是一個統計列

如果子查詢的結果只有一條數據時,可以省略[ALL|ANY|SOME]選項

如果子查詢返回的是多條,則可需要帶上[ALL|ANY|SOME]選項

2 ? ALL:如果子查詢返回的所有行都滿足比較條件時,才為真

2 ? ANY|SOME:如果子查詢返回的所有行中只要有一條滿足比較條件時,就會為真

2 ? =等號與ANY|SOME一起使用時,與IN操作符具有一樣的效果

3.2BETWEEN謂詞
值將在給定范圍中進行比較。

語法:

<range_predicate> ::= [NOT] BETWEEN AND

BETWEEN …AND … - 當指定了范圍謂詞時,如果 expression1 在 expression2 和 expression3 指定的范圍內時,結果返回真;如果 expression2 比 expression3 小,則只返回真。

3.3In 謂詞
一個值與一組指定的值比較。如果 expression1 的值在 expression_list(或子查詢)中,結果返回真。

語法:

<in_predicate> ::= [NOT] IN { <expression_list> | }

… WHERE CITY IN (‘BERLIN’, ‘NEW YORK’, ‘LONDON’).

如果CITY為IN后面列表中的任何一個時返回true

IN后面也可以根子查詢:

SELECT SINGLE city latitude longitude
INTO (city, lati, longi)
FROM sgeocity
WHERE city IN ( SELECT cityfrom FROM spfli
WHERE carrid = carr_id
AND connid = conn_id ).

3.4Exists 謂詞
如果子查詢返回非空結果集,結果為真;返回空結果集,結果則為假。

這類子查詢沒有返回值,也不要求SELECT從句中只有一個選擇列,選擇列可以任意個數,WHERE or HAVING從句來根據該子查詢的是否查詢到數據來決定外層主查詢語句來選擇相應數據

DATA: name_tab TYPE TABLE OF scarr-carrname,
name LIKE LINE OF name_tab.
SELECT carrname INTO TABLE name_tab FROM scarr
WHERE EXISTS ( SELECT * FROM spfli
WHERE carrid = scarr~carrid
AND cityfrom = ‘NEW YORK’ ).
LOOP AT name_tab INTO name.
WRITE: / name.
ENDLOOP.

此子查詢又為相關子查詢:

如果某個子查的WHERE條件中引用了外層查詢語句的列,則稱此子查詢為相關子查詢。相關子查詢對外層查詢結果集中的每條記錄都會執行一次,所以盡量少用相關子查詢

3.5Like 謂詞
Like 用來比較字符串, Expression1 與包含在 expression2 中的模式比較。通配符( %)和( _)可以用在比較字符串 expression2 中。

“_”用于替代單個字符,“%”用于替代任意字符串,包括空字符串。

可以使用ESCAPE選項指定一個忽略符號h,如果通配符“_”、“%”前面有符號,那么通配符失去了它在模式中的功能,而指字符本身了:

… WHERE FUNCNAME LIKE’EDIT#_%‘ESCAPE’#’;

以“EDIT_”開頭的字符串

3.6NULL 謂詞
當指定了謂詞 IS NULL,值可以與 NULL 比較。如果表達式值為 NULL, 則 IS NULL 返回值為真;如果指定了謂詞 IS NOT NULL,值不為 NULL 時返回值為真。

語法:

null_predicate> ::= IS [NOT] NULL

3.7CONTAINS 謂詞
CONTAINS 謂詞用來搜索子查詢中文本匹配的字符串。

語法:

<contains_function> ::= CONTAINS ‘(’ <contains_columns> ‘,’ <search_string>’)’| CONTAINS ‘(’ <contains_columns> ‘,’ <search_string> ‘,’ <search_specifier> ‘)’

<contains_columns> ::= ‘*’ | <column_name> | ‘(’ ‘)’

<search_string> ::= <string_const>

<search_specifier> ::= <search_type> <opt_search_specifier2_list>| <search_specifier2_list>

<opt_search_specifier2_list> ::= empty| <search_specifier2_list>

<search_type> ::= <exact_search> | <fuzzy_search> | <linguistic_search>

<search_specifier2_list> ::= <search_specifier2>| <search_specifier2_list> ‘,’ <search_specifier2>

<search_specifier2> := |

<exact_search> ::= EXACT

<fuzzy_search> ::= FUZZY| FUZZY ‘(’ <float_const> ‘)’ | FUZZY ‘(’ <float_const> ‘,’ <additional_params> ‘)’

<linguistic_search> ::= LINGUISTIC

::= WEIGHT ‘(’ <float_const_list> ‘)’

:: LANGUAGE ‘(’ <string_const> ‘)’

<additional_params> ::= <string_const>

search_string:使用自由式字符串搜索格式(例如, Peter "Palo Alto"或 Berlin -“SAP LABS”)。

search_specifier:如果沒有指定 search_specifier, EXACT 為默認值。

EXACT:對于那些在 search_attributes 中精確匹配 searchterms 的記錄, EXACT 返回真。

FUZZY:對于那些在 search_attributes 相似匹配 searchterms 的記錄, FUZZY 返回真(例如,以某種程度忽略拼寫錯誤)。

Float_const:如果省略 float_const,則默認值為 0.8。可以通過定義列式存儲聯接視圖支持的參數FUZZINESSTHRESHOLD 來覆蓋默認值。

WEIGHT:如果定義了 weights 列表,則必須與<contains_columns>中的列數量一樣。

LANGUAGE:LANGUAGE 在搜索字符串的預處理中使用,并且作為搜索前的過濾。只返回匹配搜索字符串的文檔和定義的語言。

LINGUISTIC:對于那些在 searchattribute 中出現的 searchterms 字符變量, LINGUISTIC 返回真。

限制:如果在 where 條件中定義了多個 CONTAINS,那么只有其中的一個由<contains_columns>列表中的不止一列組成。

CONTAINS 只對列式存儲表適用(簡單表和聯接視圖)。

例子:

精確搜索:

select * from T where contains(column1, ‘dog OR cat’) – EXACT is implicit

select * from T where contains(column1, ‘dog OR cat’, EXACT)

select * from T where contains(column1, ‘“cats and dogs”’) – phrase search

模糊搜索:

select * from T where contains(column1, ‘catz’, FUZZY(0.8))

語言搜索:

select * from T where contains(column1, ‘catz’, LINGUISTIC)

自由式搜索:自由式搜索是對于多列的搜索。

select * from T where CONTAINS( (column1,column2,column3), ‘cats OR dogz’, FUZZY(0.7))

select * from T where CONTAINS( (column1,column2,column3), ‘cats OR dogz’, FUZZY(0.7))

4 操作符
你可以在表達式中使用操作符進行算術運算。操作符可以用來計算、比較值或者賦值。

4.1一元和二元操作符

4.2操作符優先級
一個表達式可以使用多個操作符。如果操作符大于一個,則 SAP HANA 數據庫會根據操作符優先級評估它們。你可以通過使用括號改變順序,因為在括號內的表達式會第一個評估。

如果沒有使用括號,則操作符優先級將根據下表。請注意, SAP HANA 數據庫對于優先級相同的操作符將從左至右評估操作符。

4.3算術操作符
你可以使用算術操作符來執行數學運算,如加法、減法、乘法和除法,以及負數。

4.4字符串操作符

對于 VARCHAR 或者 NVARCHAR 類型字符串,前導或者后置空格將保留。如果其中一字符串類型為 NVARCHAR,則結果也為 NVARCHAR 并且限制在 5000 個字母, VARCHAR 聯接的最大長度也限制在 5000 個字母。

4.5比較操作符
語法:

<comparison_operation> ::= <comparison_operator>

4.6邏輯操作符
搜索條件可以使用 AND 或者 OR 操作符結合,你也可以使用 NOT 操作符否定條件。

4.7合并操作符
對兩個或更多個查詢的結果執行合并操作

UNION:并集,去重

UNION ALL:并集,包括重復

INTERSECT:交集

EXCEPT:差集

5 表達式
表達式是可以用來計算并返回值的子句。

語法:

::=<case_expression>
| <function_expression>
| <aggregate_expression>
| ( )
| ( )
| -
|
| <variable_name>
|
| [<correlation_name>.]<column_name>

5.1Case 表達式
Case 表達式允許用戶使用 IF … THEN … ELSE邏輯,而不用在 SQL 語句中調用存儲過程。

語法:

<case_expression> ::=

CASE

WHEN THEN , …

[ ELSE ]

{ END | END CASE }

如果位于 CASE 語句后面的表達式和 WHEN 后面的表達式相等,則 THEN 之后的表達式將作為返回值;否則返回 ELSE 語句之后的表達式,如果存在的話。

CASE后面還可以省略,省略后如下:

BEGIN

OUTTAB = SELECT CARRID, CONNID, FLDATE, BOOKID, CUSTOMID

FROM "SFLIGHT"."SBOOK"WHERE (CASE WHEN CARRID = :IV_CARRID THEN '1'ELSE '2' END) = '2';

END;

由于CASE WHEN性能不好,所以可以改寫成下面這樣:

SELECT CARRID, CONNID, FLDATE, BOOKID, CUSTOMID

FROM "SFLIGHT"."SBOOK"WHERE CARRID <> :IV_CARRID or carrid is null

5.2Function 表達式
SQL 內置的函數可以作為表達式使用。

語法:

<function_expression> ::= <function_name> ( , … )

5.3Aggregate 表達式
Aggregate 表達式利用 aggregate 函數計算同一列中多行值。

語法:

<aggregate_expression> ::= COUNT(*) | <agg_name> ( [ ALL | DISTINCT ] )

<agg_name> ::= COUNT | MIN | MAX | SUM | AVG | STDDEV | VAR

5.4表達式中的子查詢
子查詢是在括號中的 SELECT 語句。 SELECT 語句可以包含一個,有且僅有一個選擇項。當作為表達式使用時,標量(只有一條結果)子查詢允許返回零個或一個值。

語法:

<scalar_subquery_expression> ::= ()

在最高級別的 SELECT 中的 SELECT 列表,或者 UPDATE 語句中的 SET 條件中,你可以在任何能使用列名的地方使用標量子查詢。不過, scalar_subquery 不可以在 GROUP BY 條件中使用。

例子:

以下語句返回每個部門中的員工數,根據部門名字分組:

SELECT DepartmentName, COUNT(), ‘out of’,(SELECTCOUNT() FROM Employees)

FROM Departments AS D, Employees AS E WHERE D.DepartmentID = E.DepartmentID

GROUPBY DepartmentName;

6 SQL 函數
6.1數據類型轉換函數
數據類型轉換函數用來把參數從一個數據類型轉換為另一個數據類型,或者測試轉換是否可行。

6.1.1 CAST
語法:

CAST (expression AS data_type)

語法元素:

Expression – 被轉換的表達式。

Data type – 目標數據類型。 TINYINT | SMALLINT |INTEGER | BIGINT | DECIMAL | SMALLDECIMAL | REAL | DOUBLE | ALPHANUM | VARCHAR |NVARCHAR | DAYDATE | DATE | TIME | SECONDDATE | TIMESTAMP。

例子:

SELECTCAST (7 ASVARCHAR) "cast"FROM DUMMY;–7

6.1.2 TO_ALPHANUM
語法:

TO_ALPHANUM (value)

描述:

將給定的 value 轉換為 ALPHANUM 數據類型。

例子:

SELECT TO_ALPHANUM (‘10’) "to alphanum"FROM DUMMY;–10

6.1.3 TO_BIGINT
語法:

TO_BIGINT (value)

描述:

將 value 轉換為 BIGINT 類型。

例子:

SELECT TO_BIGINT (‘10’) "to bigint"FROM DUMMY;–10

6.1.4 TO_BINARY
語法:

TO_BINARY (value)

描述:

將 value 轉換為 BINARY 類型。

例子:

SELECT TO_BINARY (‘abc’) "to binary"FROM DUMMY;–616263 顯示時卻是以十六進制顯示,而不是二進制?

6.1.5 TO_BLOB
語法:

TO_BLOB (value)

描述:

將 value 轉換為 BLOB 類型。參數值必須是二進制字符串。

例子:

SELECT TO_BLOB (TO_BINARY(‘abcde’)) "to blob"FROM DUMMY;–abcde

6.1.6 TO_CHAR
語法:

TO_CHAR (value [, format])

描述:

將 value 轉換為 CHAR 類型。如果省略 format 關鍵字,轉換將會使用 Date Formats 中說明的日期格式模型。

例子:

SELECT TO_CHAR (TO_DATE(‘2009-12-31’), ‘YYYY/MM/DD’) "to char"FROM DUMMY;–2009/12/31

SELECT TO_CHAR (TO_DATE(‘2009-12-31’)) "to char"FROM DUMMY;–2009-12-31

6.1.7 TO_CLOB
語法:

TO_CLOB (value)

描述:

將 value 轉換為 CLOB 類型。

例子:

SELECT TO_CLOB (‘TO_CLOB converts the value to a CLOB data type’) "to clob"FROM DUMMY;–TO_CLOB converts the value to a CLOB data type

6.1.8 TO_DATE
語法:

TO_DATE (d [, format])

描述:

將日期字符串 d 轉換為 DATE 數據類型。如果省略 format 關鍵字,轉換將會使用 Date Formats 中說明的日期格式模型。

例子:

SELECT TO_DATE(‘2010-01-12’, ‘YYYY-MM-DD’) "to date"FROM DUMMY;–2010-1-12

6.1.9 TO_DATS
語法:

TO_DATS (d)

描述:

將字符串 d 轉換為 ABAP 日期字符串,格式為”YYYYMMDD”。

例子:

SELECT TO_DATS (‘2010-01-12’) "abap date"FROM DUMMY;–20100112

6.1.10 TO_DECIMAL
語法:

TO_DECIMAL (value [, precision, scale])

描述:

將 value 轉換為 DECIMAL 類型。

精度是有效數字的總數,范圍為 1 至 34。小數位數是從小數點到最小有效數字的數字個數,范圍從-6,111 到 6,176,這表示位數指定了十進制小數的指數范圍從 10-6111 至 106176。如果沒有指定小數位數,則默認值為 0。

當數字的有效數字在小數點的右側時,小數位數為正;有效數字在小數點左側時,小數位數為負。

當未指定精度和小數位數, DECIMAL 成為浮點小數。這種情況下,精度和小數位數可以在上文描述的范圍內不同,根據存儲的數值,精度為 1-34 以及小數位數為 6111-6176。

例子:

SELECTTO_DECIMAL(7654321.888888, 10, 3) "to decimal"FROM DUMMY–7,654,321.888

6.1.11 TO_DOUBLE
語法:

TO_DOUBLE (value)

描述:

將 value 轉換為 DOUBLE(雙精度)數據類型。

例子:

SELECT 3*TO_DOUBLE (‘15.12’) "to double"FROM DUMMY;–45.36

6.1.12 TO_INT
語法:

TO_INT (value)

描述:

將 value 轉換為 INTEGER 類型。

例子:

SELECT TO_INT(‘10’) "to int"FROM DUMMY;–10

6.1.13 TO_INTEGER
語法:

TO_INTEGER (value)

描述:

將 value 轉換為 INTEGER 類型。

例子:

SELECT TO_INTEGER (‘10’) "to int"FROM DUMMY;–10

6.1.14 TO_NCHAR
語法:

TO_NCHAR (value [, format])

描述:

將 value 轉換為 NCHAR Unicode 字符類型。如果省略 format 關鍵字,轉換將會使用 Date Formats中說明的日期格式模型。

例子:

SELECT TO_NCHAR (TO_DATE(‘2009-12-31’), ‘YYYY/MM/DD’) "to nchar"FROM DUMMY;–2009/12/31

6.1.15 TO_NCLOB
語法:

TO_NCLOB (value)

描述:

將 value 轉換為 NCLOB 數據類型。

例子:

SELECT TO_NCLOB (‘TO_NCLOB converts the value to a NCLOB data type’) "to nclob"FROM DUMMY;–TO_NCLOB converts the value to a NCLOB data type

6.1.16 TO_NVARCHAR
語法:

TO_NVARCHAR (value [,format])

描述:

將 value 轉換為 NVARCHAR Unicode 字符類型。如果省略 format 關鍵字,轉換將會使用 DateFormats 中說明的日期格式模型。

例子:

SELECT TO_NVARCHAR(TO_DATE(‘2009/12/31’), ‘YY-MM-DD’) "to nchar"FROM DUMMY;–09-12-31

6.1.17 TO_REAL
語法:

TO_REAL (value)

描述:

將 value 轉換為實數(單精度)數據類型。

例子:

SELECT 3*TO_REAL (‘15.12’) "to real"FROM DUMMY;–45.36000061035156

6.1.18 TO_SECONDDATE
語法:

TO_SECONDDATE (d [, format])

描述:

將 value 轉換為 SECONDDATE 類型。如果省略 format 關鍵字,轉換將會使用 Date Formats 中說明的日期格式模型。

例子:

SELECT TO_SECONDDATE (‘2010-01-11 13:30:00’, ‘YYYY-MM-DD HH24:MI:SS’) "to seconddate"FROM DUMMY;–2010-1-11 13:30:00.0

6.1.19 TO_SMALLDECIMAL
語法:

TO_SMALLDECIMAL (value)

描述:

將 value 轉換為 SMALLDECIMAL 類型。

例子:

SELECT TO_SMALLDECIMAL(7654321.89) "to smalldecimal"FROM DUMMY;–7,654,321.89

6.1.20 TO_SMALLINT
語法:

TO_SMALLINT (value)

描述:

將 value 轉換為 SMALLINT 類型。

例子:

SELECT TO_SMALLINT (‘10’) "to smallint"FROM DUMMY;–10

6.1.21 TO_TIME
語法:

TO_TIME (t [, format])

描述:

將時間字符串 t 轉換為 TIME 類型。如果省略 format 關鍵字,轉換將會使用 Date Formats 中說明的日期格式模型。

例子:

SELECT TO_TIME (‘08:30 AM’, ‘HH:MI AM’) "to time"FROM DUMMY;–8:30:00

6.1.22 TO_TIMESTAMP
語法:

TO_TIMESTAMP (d [, format])

描述:

將時間字符串 t 轉換為 TIMESTAMP 類型。如果省略 format 關鍵字,轉換將會使用 Date Formats中說明的日期格式模型。

例子:

SELECT TO_TIMESTAMP (‘2010-01-11 13:30:00’, ‘YYYY-MM-DD HH24:MI:SS’) "to timestamp"FROM DUMMY;–2010-1-11 13:30:00.0

6.1.23 TO_TINYINT
語法:

TO_TINYINT (value)

描述:

將 value 轉換為 TINYINT 類型。

例子:

SELECT TO_TINYINT (‘10’) "to tinyint"FROM DUMMY;–10

6.1.24 TO_VARCHAR
語法:

TO_VARCHAR (value [, format])

描述:

將給定 value 轉換為 VARCHAR 字符串類型。如果省略 format 關鍵字,轉換將會使用 Date Formats中說明的日期格式模型。

例子:

SELECT TO_VARCHAR (TO_DATE(‘2009-12-31’), ‘YYYY/MM/DD’) "to char"FROM DUMMY;–2009/12/31

6.2日期時間函數
6.2.1 ADD_DAYS
語法:

ADD_DAYS (d, n)

描述:

計算日期 d 后 n 天的值。

例子:

SELECT ADD_DAYS (TO_DATE (‘2009-12-05’, ‘YYYY-MM-DD’), 30) "add days"FROM DUMMY;–2010-1-4

6.2.2 ADD_MONTHS
語法:

ADD_MONTHS (d, n)

描述:

計算日期 d 后 n 月的值。

例子:

SELECT ADD_MONTHS (TO_DATE (‘2009-12-05’, ‘YYYY-MM-DD’), 1) "add months"FROM DUMMY–2010-1-5

6.2.3 ADD_SECONDS
語法:

ADD_SECONDS (t, n)

描述:

計算時間 t 后 n 秒的值。

例子:

SELECT ADD_SECONDS (TO_TIMESTAMP (‘2012-01-01 23:30:45’), 15) "add seconds"FROM DUMMY;–2012-1-1 23:31:00.0

6.2.4 ADD_YEARS
語法:

ADD_YEARS (d, n)

描述:

計算日期 d 后 n 年的值。

例子:

SELECT ADD_YEARS (TO_DATE (‘2009-12-05’, ‘YYYY-MM-DD’), 1) "add years"FROM DUMMY;–2010-12-5

6.2.5 CURRENT_DATE
語法:

CURRENT_DATE

描述:

返回當前本地系統日期。

例子:

selectcurrent_date from dummy;–2015-6-12

6.2.6 CURRENT_TIME
語法:

CURRENT_TIME

描述:

返回當前本地系統時間。

例子:

select current_time from dummy;–16:58:11

6.2.7 CURRENT_TIMESTAMP
語法:

CURRENT_TIMESTAMP

描述:

返回當前本地系統的時間戳信息。

例子:

selectcurrent_timestamp from dummy;–2015-6-12 16:58:11.471

6.2.8 CURRECT_UTCDATE
語法:

CURRENT_UTCDATE

描述:

返回當前 UTC 日期。 UTC 代表協調世界時,也被稱為格林尼治標準時間( GMT)。

例子:

SELECT CURRENT_UTCDATE "Coordinated Universal Date"FROM DUMMY;–2015-6-12

6.2.9 CURRENT_UTCTIME
語法:

CURRENT_UTCTIME

描述:

返回當前 UTC 時間。

例子:

SELECTCURRENT_TIMESTAMP,CURRENT_UTCTIME "Coordinated Universal Time"FROM DUMMY;–2015-6-12 23:25:49.721;15:25:49

6.2.10 CURRENT_UTCTIMESTAMP
語法:

CURRENT_UTCTIMESTAMP

描述:

返回當前 UTC 時間戳。

例子:

SELECTCURRENT_TIMESTAMP,CURRENT_UTCTIMESTAMP "Coordinated Universal Timestamp"FROM DUMMY;-2015-6-12 23:28:07.62;2015-6-12 15:28:07.62

6.2.11 DAYNAME
語法:

DAYNAME (d)

描述:

返回一周中日期 d 的英文名。

例子:

SELECTDAYNAME (‘2011-05-30’) "dayname"FROM DUMMY;–MONDAY

6.2.12 DAYOFMONTH
語法:

DAYOFMONTH (d)

描述:

返回一個月中日期 d 的整數數字(即一個月中的幾號)。

例子:

SELECT DAYOFMONTH (‘2011-05-30’) "dayofmonth"FROM DUMMY;–30

6.2.13 DAYOFYEAR
語法:

DAYOFYEAR (d)

描述:

返回一年中代表日期 d 的整數數字(即一年中的第幾天)。

例子:

SELECTDAYOFYEAR (‘2011-02-01’) "dayofyear"FROM DUMMY;–32

6.2.14 DAYS_BETWEEN
語法:

DAYS_BETWEEN (d1, d2)

描述:

計算 d1 和 d2 之間的天數(只包括一端:[d1,d2)或者(d1,d2])。

例子:

SELECTDAYS_BETWEEN (TO_DATE (‘2015-01-01’, ‘YYYY-MM-DD’), TO_DATE(‘2015-02-02’, ‘YYYY-MM-DD’)) "days between"FROM DUMMY;–32

SELECTDAYS_BETWEEN (‘2015-01-01’,‘2015-02-02’) "days between"FROM DUMMY;–32 類型隱式轉換(字符轉日期)

SELECTDAYS_BETWEEN (‘2015-02-01’,‘2015-03-01’) "days between"FROM DUMMY;–28

6.2.15 EXTRACT
語法:

EXTRACT ({YEAR | MONTH | DAY | HOUR | MINUTE | SECOND} FROM d)

描述:

返回日期 d 中指定的時間日期字段的值(年、月、日、時、分、秒)。

例子:

SELECTEXTRACT(YEARFROM TO_DATE(‘2010-01-04’, ‘YYYY-MM-DD’)) “年”,EXTRACT(MONTHFROM’2010-01-04’) “月” ,EXTRACT(DAYFROM’2010-01-04’) “日” ,EXTRACT(HOURFROM’2010-01-04 05’) “時”,EXTRACT(MINUTEFROM’2010-01-04 05’) “分”,EXTRACT(SECONDFROM’2010-01-04 05:06:07’) "秒"FROM DUMMY;

6.2.16 HOUR
語法:

HOUR (t)

描述:

返回時間 t 中表示小時的整數。

例子:

SELECTHOUR (‘12:34:56’) "hour"FROM DUMMY;–12

6.2.17 ISOWEEK
語法:

ISOWEEK (d)

描述:

返回日期 d 的 ISO 年份和星期數。星期數前綴為字母 W。另請閱 WEEK。

例子:

SELECT ISOWEEK (TO_DATE(‘2011-05-30’, ‘YYYY-MM-DD’)) "isoweek"FROM DUMMY;–2011-W22

6.2.18 LAST_DAY
語法:

LAST_DAY (d)

描述:

返回包含日期 d 的月的最后一天日期。

例子:

SELECT LAST_DAY (TO_DATE(‘2010-01-04’, ‘YYYY-MM-DD’)) "last day"FROM DUMMY;–2010-1-31

6.2.19 LOCALTOUTC
語法:

LOCALTOUTC (t, timezone)

描述:

將 timezone 下的本地時間 t 轉換為 UTC 時間(UTC:通用協調時, Universal Time Coordinated。北京時區是東八區,領先UTC 8個小時,UTC + 時區差=本地時間)。

例子:

SELECT LOCALTOUTC (TO_TIMESTAMP(‘2012-01-01 01:00:00’, ‘YYYY-MM-DD HH24:MI:SS’), ‘EST’) "localtoutc"FROM DUMMY;–2012-1-1 6:00:00.0

6.2.20 MINUTE
語法:

MINUTE(t)

描述:

返回時間 t 中表示分鐘的數字。

例子:

SELECTMINUTE (‘12:34:56’) "minute"FROM DUMMY;–34

6.2.21 MONTH
語法:

MONTH(d)

描述:

返回日期 d 所在月份的數字。

例子:

SELECTMONTH (‘2011-05-30’) "month"FROM DUMMY;–5

6.2.22 MONTHNAME
語法:

MONTHNAME(d)

描述:

返回日期 d 所在月份的英文名。

例子:

SELECTMONTHNAME (‘2011-05-30’) "monthname"FROM DUMMY;–MAY

6.2.23 NEXT_DAY
語法:

NEXT_DAY (d)

描述:

返回日期 d 的第二天。

例子:

SELECT NEXT_DAY (TO_DATE (‘2009-12-31’, ‘YYYY-MM-DD’)) "next day"FROM DUMMY;–2010-1-1

6.2.24 NOW
語法:

NOW ()

描述:

返回當前時間戳。

例子:

SELECT NOW () "now"FROM DUMMY;–2015-6-12 17:23:01.773

6.2.25 QUARTER
語法:

QUARTER (d, [, start_month ])

描述:

返回日期 d 的年份,季度。第一季度由 start_month 定義的月份開始,如果沒有定義start_month,第一季度假設為從一月開始。

例子:

SELECTQUARTER (TO_DATE(‘2012-01-01’, ‘YYYY-MM-DD’), 2) "quarter"FROM DUMMY;–2011-Q4

6.2.26 SECOND
語法:

SECOND (t)

描述:

返回時間 t 表示的秒數。

例子:

SELECTSECOND (‘12:34:56’) "second"FROM DUMMY;–56

6.2.27 SECONDS_BETWEEN
語法:

SECONDS_BETWEEN (d1, d2)

描述:

計算日期參數 d1 和 d2 之間的秒數,語義上等同于 d2-d1。

例子:

SELECT SECONDS_BETWEEN (‘2015-01-01 01:01:01’, ‘2015-01-01 02:01:01’) "seconds between"FROM DUMMY;–3600

SELECT SECONDS_BETWEEN (‘2015-01-01 01:01:01’, ‘2015-01-01 01:02:02’) "seconds between"FROM DUMMY;–61

SELECT SECONDS_BETWEEN (‘2015-01-01 01:01:01’, ‘2015-01-01 01:01:02’) "seconds between"FROM DUMMY;–1

6.2.28 UTCTOLOCAL
語法:

UTCTOLOCAL (t, timezone)

描述:

將 UTC 時間值轉換為時區 timezone 下的本地時間。

例子:

SELECT UTCTOLOCAL(TO_TIMESTAMP(‘2012-01-01 01:00:00’, ‘YYYY-MM-DD HH24:MI:SS’), ‘EST’) "utctolocal"FROM DUMMY;–2011-12-31 20:00:00.0

6.2.29 WEEK
語法:

WEEK (d)

描述:

返回日期 d 所在星期的整數數字。另請參閱 ISOWEEK。

例子:

SELECTWEEK(TO_DATE(‘2011-05-30’, ‘YYYY-MM-DD’)) "week"FROM DUMMY;–23

6.2.30 WEEKDAY
語法:

WEEKDAY (d)

描述:

返回代表日期 d 所在星期的日期數字(星期幾)。返回值范圍為 0 至 6,表示 Monday(0)至 Sunday(6)。

例子:

SELECTWEEKDAY (TO_DATE (‘2011-01-02’, ‘YYYY-MM-DD’)) "week day"FROM DUMMY;–6

SELECTWEEKDAY (TO_DATE (‘2011-01-03’, ‘YYYY-MM-DD’)) "week day"FROM DUMMY;–0

6.2.31 YEAR
語法:

YEAR (d)

描述:

返回日期 d 所在的年份數。

例子:

SELECTYEAR (TO_DATE (‘2011-05-30’, ‘YYYY-MM-DD’)) "year"FROM DUMMY;–2011

6.3數字函數
數字函數接受數字或者帶有數字的字符串作為輸入,返回數值。 當數字字符的字符串作為輸入時,在計算結果前,自動執行字符串到數字的隱式轉換。

6.3.1 ABS
語法:

ABS (n)

描述:

返回數字參數 n 的絕對值。

例子:

SELECTABS (-1) "absolute"FROM DUMMY;–1

6.3.2 ACOS
語法:

ACOS (n)

描述:

返回參數 n 的反余弦,以弧度為單位,值為-1 至 1。

例子:

SELECTACOS (0.5) "acos"FROM DUMMY;–1.0471975511965979

6.3.3 ASIN
語法:

ASIN (n)

描述:

返回參數 n 的反正弦值,以弧度為單位,值為-1 至 1。

例子:

SELECTASIN (0.5) "asin"FROM DUMMY;–0.5235987755982989

6.3.4 ATAN
語法:

ATAN (n)

描述:

返回參數 n 的反正切值,以弧度為單位, n 的范圍為無限。

例子:

SELECTATAN (0.5) "atan"FROM DUMMY;–0.4636476090008061

6.3.5 ATAN2
語法:

ATAN2 (n, m)

描述:

返回兩數 n 和 m 比率的反正切值,以弧度為單位。這和 ATAN(n/m)的結果一致。

例子:

SELECTATAN2 (1.0, 2.0) "atan2"FROM DUMMY;–0.4636476090008061

6.3.6 BINTOHEX
語法:

BINTOHEX (expression)

描述:

將二進制值轉換為十六進制。

例子:

SELECT BINTOHEX(‘AB’) "bintohex"FROM DUMMY;–4142 先會將“AB”字符串隱式轉換為二進制??

SELECT TO_BINARY (‘AB’) "to binary"FROM DUMMY;–4142 顯示時卻是以十六進制顯示,而不是二進制?

6.3.7 BITAND
語法:

BITAND (n, m)

描述:

對參數 n 和 m 的位執行 AND 操作(即按位與)。 n 和 m 都必須是非負整數。 BITAND 函數返回 BIGINT 類型的結果。

例子:

SELECT BITAND (255, 123) "bitand"FROM DUMMY;–123

6.3.8 CEIL
語法:

CEIL(n)

描述:

返回大于或者等于 n 的第一個整數(大小它的最小整數)

例子:

SELECT CEIL (14.5) "ceiling"FROM DUMMY;–15

6.3.9 COS
語法:

COS (n)

描述:

返回參數 n 的余弦值,以弧度為單位。

例子:

SELECTCOS (0.0) "cos"FROM DUMMY;–1

6.3.10 COSH
語法:

COSH (n)

描述:

返回參數 n 的雙曲余弦值。

例子:

SELECT COSH (0.5) "cosh"FROM DUMMY;–1.1276259652063807

6.3.11 COT
語法:

COT (n)

描述:

計算參數 n 的余切值,其中 n 以弧度表示。

例子:

SELECTCOT (40) "cot"FROM DUMMY;-- -0.8950829176379128

6.3.12 EXP
語法:

EXP (n)

描述:

返回以 e 為底, n 為指數的計算結果。

例子:

SELECTEXP (1.0) "exp"FROM DUMMY;–2.718281828459045

6.3.13 FLOOR
語法:

FLOOR (n)

描述:

返回不大于參數 n 的最大整數。

例子:

SELECTFLOOR (14.5) "floor"FROM DUMMY;–14

6.3.14 GREATEST
語法:

GREATEST (n1 [, n2]…)

描述:

返回參數 n1,n2,…最大數。

例子:

SELECT GREATEST (‘aa’, ‘ab’, ‘bb’, ‘ba’) "greatest"FROM DUMMY;–bb

6.3.15 HEXTOBIN
語法:

HEXTOBIN (value)

描述:

將十六進制數轉換為二進制數。

例子:

SELECTHEXTOBIN (‘1a’) "hextobin"FROM DUMMY;–1A 還是以十六進制來顯示?

6.3.16 LEAST
語法:

LEAST (n1 [, n2]…)

描述:

返回參數 n1,n2,…最小數。

例子:

SELECT LEAST(‘aa’, ‘ab’, ‘ba’, ‘bb’) "least"FROM DUMMY;–aa

6.3.17 LN
語法:

LN (n)

描述:

返回參數 n 的自然對數。

例子:

SELECTLN (9) "ln"FROM DUMMY;–2.1972245773362196

6.3.18 LOG
語法:

LOG (b, n)

描述:

返回以 b 為底, n 的自然對數值。底 b 必須是大于 1 的正數,且 n 必須是正數。

例子:

SELECTLOG (10, 2) "log"FROM DUMMY;–0.30102999566398114

6.3.19 MOD
語法:

MOD (n, d)

描述:

返回 n 整除 b 的余數值。

當 n 為負時,該函數行為不同于標準的模運算。

以下列舉了 MOD 函數返回結果的例子

如果 d 為零,返回 n。

如果 n 大于零,且 n 小于 d,則返回 n。

如果 n 小于零,且 n 大于 d,則返回 n。

在上文提到的其他情況中,利用 n 的絕對值除以 d 的絕對值來計算余數。如果 n 小于 0,則 MOD返回的余數為負數;如果 n 大于零, MOD 返回的余數為正數。

例子:

SELECTMOD (15, 4) "modulus"FROM DUMMY;–3

SELECTMOD (-15, 4) "modulus"FROM DUMMY;-- -3

6.3.20 POWER
語法:

POWER (b, e)

描述:

計算以 b 為底, e 為指數的值。

例子:

SELECTPOWER (2, 10) "power"FROM DUMMY;–1024

6.3.21 ROUND
語法:

ROUND (n [, pos])

描述:

返回參數 n 小數點后 pos 位置的值(四舍五入)。

例子:

SELECTROUND (16.16, 1) "round"FROM DUMMY;–16.2

SELECTROUND (16.16, -1) "round"FROM DUMMY;–20

6.3.22 SIGN
語法:

SIGN (n)

描述:

返回 n 的符號(正或負)。如果 n 為正,則返回 1; n 為負,返回-1, n 為 0 返回 0。

例子:

SELECTSIGN (-15) "sign"FROM DUMMY;-- -1

6.3.23 SIN
語法:

SIN (n)

描述:

返回參數 n 的正弦值,以弧度為單位。

例子:

SELECTSIN(3.141592653589793/2) "sine"FROM DUMMY;–1

6.3.24 SINH
語法:

SINH (n)

描述:

返回 n 的雙曲正弦值,以弧度為單位。

例子:

SELECT SINH (0.0) "sinh"FROM DUMMY;–0

6.3.25 SQRT
語法:

SQRT (n)

描述:

返回 n 的平方根。

例子:

SELECTSQRT (2) "sqrt"FROM DUMMY;–1.4142135623730951

6.3.26 TAN
語法:

TAN (n)

描述:

返回 n 的正切值,以弧度為單位。

例子:

SELECTTAN (0.0) "tan"FROM DUMMY;–0

6.3.27 TANH
語法:

TANH (n)

描述:

返回 n 的雙曲正切值,以弧度為單位。

例子:

SELECT TANH (1.0) "tanh"FROM DUMMY;–0.7615941559557649

6.3.28 UMINUS
語法:

UMINUS (n)

描述:

返回 n 的負值。

例子:

SELECT UMINUS(-765) "uminus"FROM DUMMY;–756

SELECT UMINUS(765) "uminus"FROM DUMMY;-- -756

6.4字符串函數
6.4.1 ASCII
語法:

ASCII?

描述:

返回字符串 c 中第一個字節的 ASCII 值。

SELECTASCII(‘Ant’) "ascii"FROM DUMMY;–65

6.4.2 CHAR
語法:

CHAR (n)

描述:

返回 ASCII 值為數字 n 的字符。

例子:

SELECTCHAR (65) || CHAR (110) || CHAR (116) "character"FROM DUMMY;–Ant

6.4.3 CONCAT
語法:

CONCAT (str1, str2)

描述:

返回位于 str1 后的 str2 聯合組成的字符串。級聯操作符(||)與該函數作用相同。

例子:

SELECTCONCAT (‘C’, ‘at’) "concat"FROM DUMMY;–Cat

6.4.4 LCASE
語法:

LCASE(str)

描述:

將字符串 str 中所有字符轉換為小寫。

注意: LCASE 函數作用與 LOWER 函數相同。

例子:

SELECTLCASE (‘TesT’) "lcase"FROM DUMMY;–test

6.4.5 LEFT
語法:

LEFT (str, n)

描述:

返回字符串 str 開頭 n 個字符/位的字符。

例子:

SELECTLEFT (‘Hello’, 3) "left"FROM DUMMY;–Hel

6.4.6 LENGTH
語法:

LENGTH(str)

描述:

返回字符串 str 中的字符數。對于大對象(LOB)類型,該函數返回對象的字節長度。

例子:

SELECTLENGTH (‘length in char’) "length"FROM DUMMY;–14

6.4.7 LOCATE
語法:

LOCATE (haystack, needle)

描述:

返回字符串 haystack 中子字符串 needle 所在的位置。如果未找到,則返回 0。

例子:

SELECTLOCATE (‘length in char’, ‘char’) "locate"FROM DUMMY;–11

SELECTLOCATE (‘length in char’, ‘length’) "locate"FROM DUMMY;–1

SELECTLOCATE (‘length in char’, ‘zchar’) "locate"FROM DUMMY;–0

6.4.8 LOWER
語法:

LOWER (str)

描述:

將字符串 str 中所有字符轉換為小寫。

注意: LOWER 函數作用與 LCASE 相同。

例子:

SELECTLOWER (‘AnT’) "lower"FROM DUMMY;–ant

6.4.9 LPAD
語法:

LPAD (str, n [, pattern])

描述:

從左邊開始對字符串 str 使用空格進行填充,達到 n 指定的長度。如果指定了 pattern 參數,字符串 str 將按順序填充直到滿足 n 指定的長度。

例子:

SELECT LPAD (‘end’, 15, ‘12345’) "lpad"FROM DUMMY;–123451234512end

6.4.10 LTRIM
語法:

LTRIM (str [, remove_set])

描述:

返回字符串 str 截取所有前導空格后的值。如果定義了 remove_set, LTRIM 從起始位置移除字符串str 包含該集合中的字符,該過程持續至到達不在 remove_set 中的字符。

注意: remove_set 被視為字符集合,而非搜索字符。

例子:

SELECTLTRIM (‘babababAabend’,‘ab’) "ltrim"FROM DUMMY;–Aabend

6.4.11 NCHAR
語法:

NCHAR (n)

描述:

返回整數 n 表示的 Unicode 字符。

例子:

SELECT UNICODE (‘江’) "unicode"FROM DUMMY;–27743

SELECTNCHAR (27743) "nchar"FROM DUMMY;–江

6.4.12 REPLACE
語法:

REPLACE (original_string, search_string, replace_string)

描述:

搜索 original_string 所有出現的 search_string,并用 replace_string 替換。

如果 original_string 為空, 則返回值也為空。

如果 original_string 中兩個重疊的子字符串與 search_string 匹配,只有第一個會被替換:

SELECTREPLACE (‘abcbcb’,‘bcb’, ‘’) "replace"FROM DUMMY;–acb

如果 original_string 未出現 search_string,則返回未修改的 original_string。

如果 original_string, search_string 或者 replace_string 為 NULL,則返回值也為 NULL。

例子:

SELECTREPLACE (‘DOWNGRADE DOWNWARD’,‘DOWN’, ‘UP’) "replace"FROM DUMMY;–UPGRADE UPWARD

6.4.13 RIGHT
語法:

RIGHT(str, n)

描述:

返回字符串 str 中最右邊的 n 字符/字節。

例子:

SELECTRIGHT(‘HI0123456789’, 3) "right"FROM DUMMY;–789

6.4.14 RPAD
語法:

RPAD (str, n [, pattern])

描述:

從尾部開始對字符串 str 使用空格進行填充,達到 n 指定的長度。如果指定了 pattern 參數,字符串 str 將按順序填充直到滿足 n 指定的長度。

例子:

SELECT RPAD (‘end’, 15, ‘12345’) "right padded"FROM DUMMY;–end123451234512

6.4.15 RTRIM
語法:

RTRIM (str [,remove_set ])

描述:

返回字符串 str 截取所有后置空格后的值。如果定義了 remove_set, RTRIM 從尾部位置移除字符串 str 包含該集合中的字符,該過程持續至到達不在 remove_set 中的字符。

注意: remove_set 被視為字符集合,而非搜索字符。

例子:

SELECTRTRIM (‘endabAabbabab’,‘ab’) "rtrim"FROM DUMMY;–endabA

6.4.16 SUBSTR_AFTER
語法:

SUBSTR_AFTER (str, pattern)

描述:

返回 str 中位于 pattern 第一次出現位置后的子字符串。

如果 str 不包含 pattern 子字符串,則返回空字符串。

如果 pattern 為空字符串,則返回 str。

如果 str 或者 pattern 為 NULL,則返回 NULL。

例子:

SELECT SUBSTR_AFTER (‘Hello My Friend’,‘My’) "substr after"FROM DUMMY;-- ’ Friend’

6.4.17 SUBSTR_BEFORE
語法:

SUBSTR_BEFORE (str, pattern)

描述:

返回 str 中位于 pattern 第一次出現位置前的子字符串。

如果 str 不包含 pattern 子字符串,則返回空字符串。

如果 pattern 為空字符串,則返回 str。

如果 str 或者 pattern 為 NULL,則返回 NULL。

例子:

SELECT SUBSTR_BEFORE (‘Hello My Friend’,‘My’) "substr before"FROM DUMMY;–'Hello ’

6.4.18 SUBSTRING
語法:

SUBSTRING (str, start_position [, string_length])

描述:

返回字符串 str 從 start_position 開始的子字符串。 SUBSTRING 可以返回 start_position 起的剩余部分字符或者作為可選,返回由 string_length 參數設置的字符數。

如果 start_position 小于 0,則被視為 1。

如果 string_length 小于 1,則返回空字符串。

例子:

SELECTSUBSTRING (‘1234567890’,4,2) "substring"FROM DUMMY;–45

6.4.19 TRIM
語法:

TRIM ([[LEADING | TRAILING | BOTH] trim_char FROM] str )

描述:

返回移除前導和后置空格后的字符串 str。截斷操作從起始(LEADING)、結尾(TRAILING)或者兩端(BOTH)執行。

如果 str 或者 trim_char 為空,則返回 NULL。

如果沒有指定可選項, TRIM 移除字符串 str 中兩端的子字符串 trim_char。

如果沒有指定 trim_char,則使用單個空格(就是去空格)。

例子:

SELECTTRIM (‘a’FROM’aaa123456789aa’) "trim both"FROM DUMMY;–123456789

SELECTTRIM (LEADING’a’FROM’aaa123456789aa’) "trim leading"FROM DUMMY;–123456789aa

6.4.20 UCASE
語法:

UCASE (str)

描述:

將字符串 str 中所有字符轉換為大寫。

注意: UCASE 函數作用與 UPPER 函數相同。

例子:

SELECTUCASE (‘Ant’) "ucase"FROM DUMMY;–ANT

6.4.21 UNICODE
語法:

UNICODE?

描述:

返回字符串中首字母的 UnIcode 字符碼數字;如果首字母不是有效編碼,則返回 NULL。

例子:

SELECT UNICODE (‘江’) "unicode"FROM DUMMY;–27743

SELECTNCHAR (27743) "nchar"FROM DUMMY;–江

6.4.22 UPPER
語法:

UPPER (str)

描述:

將字符串 str 中所有字符轉換為大寫。

注意: UPPER 函數作用與 UCASE 相同。

例子:

SELECTUPPER (‘Ant’) "uppercase"FROM DUMMY;–ANT

6.5雜項函數
6.5.1 COALESCE
語法:

COALESCE (expression_list)

描述:

返回 list 中非 NULL 的表達式。 Expression_list 中必須包含至少兩個表達式,并且所有表達式都是可比較的。如果所有的參數都為 NULL,則結果也為 NULL。

例子:

CREATETABLE coalesce_example (ID INTPRIMARYKEY, A REAL, B REAL);

INSERTINTO coalesce_example VALUES(1, 100, 80);

INSERTINTO coalesce_example VALUES(2, NULL, 63);

INSERTINTO coalesce_example VALUES(3, NULL, NULL);

SELECT id, a, b, COALESCE (a, b*1.1, 50.0) "coalesce"FROM coalesce_example

6.5.2 CURRENT_CONNECTION
語法:

CURRENT_CONNECTION

描述:

返回當前連接 ID。

例子:

SELECT CURRENT_CONNECTION "current connection"FROM DUMMY;–400,038

6.5.3 CURRENCT_SCHEMA
語法:

CURRENT_SCHEMA

描述:

返回當前Schema名。

例子:

SELECT CURRENT_SCHEMA "current schema"FROM DUMMY;–SYSTEM

6.5.4 CURRENT_USER
語法:

CURRENT_USER

描述:

返回當前語句上下文的用戶名,即當前授權堆棧頂部的用戶名。

例子:

–使用SYSTEM用戶執行基礎SQL

SELECT CURRENT_USER "current user"FROM DUMMY;–SYSTEM

– USER_A用戶創建存儲過程

CREATEPROCEDUREUSER_A.PROC1 LANGUAGE SQLSCRIPT SQL SECURITY DEFINER AS

BEGIN

SELECT CURRENT_USER "current user"FROM DUMMY;

END;

– USER_A用戶調用

CALL USER_A.PROC1;–USER_A

–授權予USER_B執行USER_A.PROC1的權限后調用

CALL USER_A.PROC1;–USER_A

–將Schema USER_A授權予USER_B用戶后,通過USER_B用戶創建存儲過程

CREATEPROCEDUREUSER_A.PROC2 LANGUAGE SQLSCRIPT SQL SECURITY INVOKER AS

BEGIN

SELECT CURRENT_USER "current user"FROM DUMMY;

END;

– USER_A用戶調用

CALL USER_A.PROC2;-- USER_A

– USER_B用戶調用

CALL USER_A.PROC2;-- USER_B

6.5.5 GROUPING_ID
語法:

GROUPING_ID(column_name_list)

描述:

GROUPING_ID 函數可以使用 GROUPING SETS 返回單個結果集中的多級聚集。 GROUPING_ID 返回一個整數識別每行所在的組集合。 GROUPING_ID 每一列必須是 GROUPING SETS 中的元素。

通過把生成的位矢量從 GROUPING SETS 轉換為十進制數,將位矢量視作二進制數,分配GROUPING_ID。組成位矢量后,0 分配給 GROUPING SETS 指定的每一列,否則根據 GROUPING SETS 出現的順序分配 1。通過將位矢量作為二進制數處理,該函數返回一個整型值作為輸出。

例子:

SELECT customer, year, product, SUM(sales),GROUPING_ID(customer, year, product)

FROM guided_navi_tab

GROUPBYGROUPING SETS ((customer, year, product),(customer, year),(customer, product),(year, product),(customer),(year),(product));

CUSTOMER YEAR PRODUCT SUM(SALES) GROUPING_ID(CUSTOMER,YEAR,PRODUCT)

1 C1 2009 P1 100 0

2 C1 2010 P1 50 0

3 C2 2009 P1 200 0

4 C2 2010 P1 100 0

5 C1 2009 P2 200 0

6 C1 2010 P2 150 0

7 C2 2009 P2 300 0

8 C2 2010 P2 150 0

9 C1 2009 a 300 1

10 C1 2010 a 200 1

11 C2 2009 a 500 1

12 C2 2010 a 250 1

13 C1 a P1 150 2

14 C2 a P1 300 2

15 C1 a P2 350 2

16 C2 a P2 450 2

17 a 2009 P1 300 4

18 a 2010 P1 150 4

19 a 2009 P2 500 4

20 a 2010 P2 300 4

21 C1 a a 500 3

22 C2 a a 750 3

23 a 2009 a 800 5

24 a 2010 a 450 5

25 a a P1 450 6

26 a a P2 800 6

6.5.6 IFNULL
語法:

IFNULL (expression1, expression2)

描述:

返回輸入中第一個不為 NULL 的表達式。

如果 expression1 不為 NULL,則返回 expression1。

如果 expression2 不為 NULL,則返回 expression2。

如果輸入表達式都為 NULL,則返回 NULL。

例子:

SELECTIFNULL (‘diff’, ‘same’) "ifnull"FROM DUMMY;–diff

SELECTIFNULL (NULL, ‘same’) "ifnull"FROM DUMMY;–same

SELECTIFNULL (NULL, NULL) "ifnull"FROM DUMMY;–null

6.5.7 MAP
語法:

MAP (expression, search1, result1 [, search2, result2] … [, default_result])

描述:

在搜索集合中搜索 expression,并返回相應的結果。

如果未找到 expression 值,并且定義了 default_result,則 MAP 返回 default_result。

如果未找到 expression 值,并且未定義 default_result,MAP 返回 NULL。

注意:

搜索值和相應的結果總是以搜索-結果方式提供。

例子:

SELECTMAP(2, 0, ‘Zero’, 1, ‘One’, 2, ‘Two’, 3, ‘Three’, ‘Default’) "map"FROM DUMMY;–Two

SELECTMAP(99, 0, ‘Zero’, 1, ‘One’, 2, ‘Two’, 3, ‘Three’, ‘Default’) "map"FROM DUMMY;–Default

SELECTMAP(99, 0, ‘Zero’, 1, ‘One’, 2, ‘Two’, 3, ‘Three’) "map"FROM DUMMY;–null

6.5.8 NULLIF
語法:

NULLIF (expression1, expression2)

描述:

NULLIF 比較兩個輸入表達式的值,如果第一個表達式等于第二個,NULLIF 返回 NULL。

如果 expression1 不等于 expression2,NULLIF 返回 expression1。

如果 expression2 為 NULL,NULLIF 返回 expression1。

第一個參數不能是NULL

例子:

SELECTNULLIF (‘diff’, ‘same’) "nullif"FROM DUMMY;–diff

SELECTNULLIF(‘same’, ‘same’) "nullif"FROM DUMMY;–null

SELECTNULLIF(‘same’, null) "nullif"FROM DUMMY;–same

6.5.9 SESSION_CONTEXT
語法:

SESSION_CONTEXT(session_variable)

描述:

返回分配給當前用戶的 session_variable 值。

訪問的 session_variable ,可以是預定義或者用戶自定義。預定義的會話變量可以通過客戶端設置的有’APPLICATION’, ‘APPLICATIONUSER’以及’TRACEPROFILE’。

會話變量可以定義或者修改通過使用命令 SET [SESSION] <variable_name> = ,使用 UNSET [SESSION] <variable_name>取消設置。

SESSION_CONTEXT 返回最大長度為 512 字符的 NVARCHAR 類型。

例子:

讀取會話變量:

SELECT SESSION_CONTEXT(‘APPLICATION’) "session context"FROM DUMMY;–HDBStudio

6.5.10 SESSION_USER
語法:

SESSION_USER

描述:

返回當前會話的用戶名。

例子:

– example showing basic function operation using SYSTEM user

SELECT SESSION_USER "session user"FROM DUMMY;–SYSTEM

SYSUUID

語法:

6.5.11 SYSUUID
描述:

返回 SAP HANA 連接實例的 SYSUUID。

例子:

SELECT SYSUUID FROM DUMMY;–557A323598FE12F4E20036775F49B32D

7 SQL 語句
本章描述 SAP HANA 數據庫支持的 SQL 語句。

? Schema Definition and Manipulation Statements Schema操縱語句

? Data Manipulation Statements 數據操縱語句

? System Management Statements 系統管理語句

? Session Management Statements 會話管理語句

? Transaction Management Statements 事務管理語句

? Access Control Statements 訪問控制語句

? Data Import Export Statements 數據導入導出語句

7.1數據定義語句
7.1.1 ALTER AUDIT POLICY
語法:

ALTER AUDIT POLICY <policy_name> <audit_mode>

語法元素:

<policy_name> ::=

被改變的審計策略名:

<audit_mode> ::= ENABLE | DISABLE

Audit_mode 啟用或禁用審計策略。

ENABLE:啟用審計策略。

DISABLE:禁用審計策略。

描述:

ALTER AUDIT POLICY 語句啟用或禁用審計策略。 <policy_name>必須定義一個已存在的審計策略名。

只有擁有系統權限 AUDIT ADMIN 的數據庫用戶允許改變審計策略。每個擁有該權限的數據庫用戶可以修改任意的審計策略,無論是否由該用戶創建。

新建的審計策略默認為禁用,并且不會發生任何審計。因此,必須啟動該審計策略來執行審計。

審計策略可以視需要禁用和啟用。

配置參數:

以下審計的配置參數存儲在文件 global.ini,在審計配置部分:

global_auditing_state ( ‘true’ / ‘false’ )

無論啟動的審計策略數量多少,審計只會在配置參數 global_auditing_state 設置為 true 時啟用,默認值 false。

default_audit_trail_type ( ‘SYSLOGPROTOCOL’ / ‘CSVTEXTFILE’ ) 指定如何存儲審計結果。

SYSLOGPROTOCOL:使用系統 syslog。

CSVTEXTFILE:審計信息值以逗號分隔存儲在一個文本文件中。

default_audit_trail_path

指定 CSVTEXTFILE 存儲的文件路徑。

如果用戶擁有需要的系統權限,參數可以在監控視圖 M_INIFILE_CONTENTS 中選擇。這些只有在顯示設置的情況下才可見。

系統表和監控視圖:

AUDIT_POLICY:顯示所有審計策略和狀態。

M_INIFILE_CONTENTS:顯示數據庫系統配置參數。

只有擁有系統權限 CATALOG READ, DATA ADMIN 或 INIFILE ADMIN 的用戶可以查看

M_INIFILE_CONTENTS 視圖中的內容,對于其他用戶則為空。

例子:

該例子中你需要先利用如下語句創建名為 priv_audit 的審計權限:

CREATE AUDIT POLICY priv_audit AUDITING SUCCESSFUL GRANT PRIVILEGE, REVOKE PRIVILEGE, GRANT ROLE, REVOKE ROLE LEVEL CRITICAL;

現在你可以啟用審計策略:

ALTER AUDIT POLICY priv_audit ENABLE;

你也可以禁用該審計策略:

ALTER AUDIT POLICY priv_audit DISABLE;

7.1.2 ALTER FULLTEXT INDEX
語法:

ALTER FULLTEXT INDEX <index_name> <alter_fulltext_index_option>

語法元素:

<index_name> ::=

被修改的全文索引標識符:

<alter_fulltext_index_option> ::= <fulltext_parameter_list> | <queue_command> QUEUE

定義了全文索引的參數或者全文索引隊列的狀態是否應該修改。后者只對異步顯式全文索引可見。

<fulltext_parameter_list> ::= <fulltext_parameter> [, …]

修改的全文索引參數列表:

<fulltext_parameter> ::= FUZZY SEARCH INDEX <on_off>

| PHRASE INDEX RATIO <index_ratio>

| <change_tracking_elem>

<on_off> ::= ON | OFF

FUZZY SEARCH INDEX

使用模糊搜索索引。

PHRASE INDEX RATIO

定義短語索引比率。

<index_ratio> ::= <float_literal>

定義短語索引比率的百分比,值必須為 0.0 與 1.0 之間。

SYNC[HRONOUS]

改變全文索引至同步模式。

ASYNC[HRONOUS]

改變全文索引至異步模式。

<flush_queue_elem> ::= EVERY <integer_literal> MINUTES

| AFTER <integer_literal> DOCUMENTS

| EVERY <integer_literal> MINUTES OR AFTER <integer_literal>

DOCUMENTS

當使用異步索引時,你可以利用 flush_queue_elem 定義更新全文索引的時間。

<queue_command> ::= FLUSH | SUSPEND | ACTIVATE

FLUSH

利用正在處理隊列的文件更新全文索引。

SUSPEND

暫停全文索引處理隊列。

ACTIVATE

激活全文索引處理隊列。

描述:

使用該命令,你可以修改全文索引的參數或者索引處理隊列的狀態。隊列是用來激活全文索引以

異步方式工作的機制,例如插入操作被阻塞,直到文件處理完。

ALTER FULLTEXT INDEX <index_name> <fulltext_elem_list>語句修改全文索引的參數。

ALTER FULLTEXT INDEX <index_name> <queue_parameters>語句修改異步全文索引的處理隊列狀

態。

例子:

ALTER FULLTEXT INDEX i1 PHRASE INDEX RATIO 0.3 FUZZY SEARCH INDEX ON

在上述例子中,對于全文索引’i1’,短文索引比率設為 30,,并且啟用了模糊搜索索引。

ALTER FULLTEXT INDEX i2 SUSPEND QUEUE

暫停全文索引’i2’的隊列

ALTER FULLTEXT INDEX i2 FLUSH QUEUE

利用隊列中已處理的文件更新全文索引’i2’。

7.1.3 ALTER INDEX
ALTER INDEX <index_name> REBUILD

語法元素:

<index_name>::=

定義重建的索引名。

描述:

ALTER INDEX 語句重建索引。

例子:

以下例子重建索引 idx。

ALTER INDEX idx REBUILD;

7.1.4 ALTER SEQUENCE
語法:

ALTER SEQUENCE <sequence_name> [<alter_sequence_parameter_list>]

[RESET BY <reset_by_subquery>]

語法元素:

<sequence_name> ::=

被修改的序列名。

<alter_sequence_parameter_list> ::= <alter_sequence_parameter>, …

<alter_sequence_parameter> ::= <sequence_parameter_restart_with>

| <basic_sequence_parameter>

<sequence_parameter_restart_with> ::= RESTART WITH <restart_value>

<basic_sequence_parameter> ::= INCREMENT BY <increment_value>

| MAXVALUE <maximum_value>

| NO MAXVALUE

| MINVALUE <minimum_value>

| NO MINVALUE

| CYCLE

| NO CYCLE

RESTART WITH

序列的起始值。如果你沒有指定 RESTART WITH 子句的值,將使用當前序列值。

<restart_value> ::= <integer_literal>

由序列生成器提供的第一個值為 0 至 4611686018427387903 之間的整數。

INCREMENT BY

序列增量值。

<increment_value> ::= <integer_literal>

利用一個整數增加或者減少序列的值。

MAXVALUE

定義序列生成的最大值。

<maximum_value> ::= <integer_literal>

一個正整數定義序列可生成的最大數值,必須為 0 至 4611686018427387903 之間。

NO MAXVALUE

使用 NO MAXVALUE 指令,遞增序列的最大值將為 4611686018427387903,遞減序列的最大值為-1。

MINVALUE

定義序列生成的最小值。

<minimum_value> ::= <integer_literal>

一個正整數定義序列可生成的最小數值,必須為 0 至 4611686018427387903 之間。

NO MINVALUE

使用 NO MINVALUE 指令,遞增序列的最小值將為 1,遞減序列的最小值為-

4611686018427387903。

CYCLE

使用 CYCLE 指令,序列在到達最大值或最小值后將會重新開始。

NO CYCLE

使用 NO CYCLE 指令,序列在到達最大值或最小值后將不會重新開始。

<reset_by_subquery> ::=

系統重啟期間,系統自動執行 RESET BY 語句,并且將用 RESET BY 子查詢確定的值重啟序列。

關于子查詢的詳情,請參閱 Subquery。

描述:

ALTER SEQUENCE 語句用來修改序列生成器的參數。

例子:

在下面的例子中,你把序列 seq 的起始序列值改為 2。

ALTER SEQUENCE seq RESTART WITH 2;

在下面的例子中,你把序列 seq 的最大值改為 100,并且沒有最小值。

ALTER SEQUENCE seq MAXVALUE 100 NO MINVALUE;

在下面的例子中,你把序列 seq 的增量改為 2,并且限制為"no cycle"。

ALTER SEQUENCE seq INCREMENT BY 2 NO CYCLE;

在下面的例子中,你首先創建表 r,有一列 a。然后你將序列 seq 的 reset-by 子查詢修改為列 a 包

含的最大值。

CREATE TABLE r (a INT);

ALTER SEQUENCE seq RESET BY SELECT MAX(a) FROM r;

7.1.5 ALTER TABLE
語法:

ALTER TABLE [<schema_name>.]<table_name>{

<add_column_clause>

| <drop_column_clause>

| <alter_column_clause>

| <add_primary_key_clause>

| <drop_primary_key_clause>

| <preload_clause>

| <table_conversion_clause>

| <move_clause>

| <add_range_partition_clause>

| <move_partition_clause>

| <drop_range_partition_clause>

| <partition_by_clause>

| <disable_persistent_merge_clause>

| <enable_persistent_merge_clause>

| <enable_delta_log>

| <disable_delta_log>

| <enable_automerge>

| <disable_automerge>

}

語法元素:

<add_column_clause> ::= ADD ( <column_definition> [<column_constraint>], …)

<drop_column_clause> ::= DROP ( <column_name>, … )

<alter_column_clause> ::= ALTER ( <column_definition> [<column_constraint>], … )

<column_definition> ::= <column_name> <data_type> [<column_store_data_type>][<ddic_data_type>] [DEFAULT <default_value>] [GENERATED ALWAYS AS ]

<column_constraint> ::= NULL| NOT NULL| UNIQUE [BTREE | CPBTREE]| PRIMARY KEY [BTREE | CPBTREE]

<data_type> ::= DATE | TIME | SECONDDATE | TIMESTAMP | TINYINT | SMALLINT | INTEGER | BIGINT |SMALLDECIMAL | DECIMAL | REAL | DOUBLE| VARCHAR |

NVARCHAR | ALPHANUM | SHORTTEXT |VARBINARY | BLOB| CLOB | NCLOB | TEXT

<column_store_data_type> ::= CS_ALPHANUM | CS_INT | CS_FIXED | CS_FLOAT | CS_DOUBLE |CS_DECIMAL_FLOAT | CS_FIXED(p-s, s) | CS_SDFLOAT| CS_STRING |

CS_UNITEDECFLOAT | CS_DATE | CS_TIME| CS_FIXEDSTRING | CS_RAW | CS_DAYDATE | CS_SECONDTIME | CS_LONGDATE | CS_SECONDDATE

<ddic_data_type> ::= DDIC_ACCP | DDIC_ALNM | DDIC_CHAR | DDIC_CDAY | DDIC_CLNT | DDIC_CUKY| DDIC_CURR | DDIC_D16D | DDIC_D34D | DDIC_D16R |

DDIC_D34R | DDIC_D16S | DDIC_D34S| DDIC_DATS | DDIC_DAY | DDIC_DEC | DDIC_FLTP | DDIC_GUID| DDIC_INT1 | DDIC_INT2 | DDIC_INT4 | DDIC_INT8 | DDIC_LANG | DDIC_LCHR | DDIC_MIN|DDIC_MON| DDIC_LRAW | DDIC_NUMC | DDIC_PREC | DDIC_QUAN | DDIC_RAW| DDIC_RSTR | DDIC_SEC | DDIC_SRST | DDIC_SSTR | DDIC_STRG | DDIC_STXT | DDIC_TIMS| DDIC_UNIT| DDIC_UTCM | DDIC_UTCL | DDIC_UTCS | DDIC_TEXT | DDIC_VARC | DDIC_WEEK

<default_value> ::= NULL | <string_literal> | <signed_numeric_literal> | <unsigned_numeric_literal>

DEFAULT:DEFAULT 定義了 INSERT 語句沒有為列提供值情況下,默認分配的值。

GENERATED ALWAYS AS:指定在運行時生成的列值的表達式。

<column_constraint> ::= NULL| NOT NULL| UNIQUE [BTREE | CPBTREE]| PRIMARY KEY [BTREE | CPBTREE]

NULL | NOT NULL:NOT NULL 禁止列的值為 NULL。如果指定了 NULL,將不被認為是常量,其表示一列可能含有空值,默認為 NULL。

UNIQUE:指定為唯一鍵的列。一個唯一的復合鍵指定多個列作為唯一鍵。有了 unique 約束,多行不能在同一列中具有相同的值。

PRIMARY KEY:主鍵約束是 NOT NULL 約束和 UNIQUE 約束的組合,其禁止多行在同一列中具有相同的值。

BTREE | CPBTREE:指定索引類型。當列的數據類型為字符串、二進制字符串、十進制數或者約束是一個組合鍵,或非唯一鍵,默認的索引類型為 CPBTREE,否則

使用 BTREE。

為了使用 B±樹索引,必須使用 BTREE 關鍵字;對于 CPB±樹索引,需使用 CPBTREE 關鍵字。

B±樹是維護排序后的數據進行高效的插入、刪除和搜索記錄的樹。

CPB±樹表示壓縮前綴 B±樹,是基于 pkB-tree 樹。 CPB+樹是一個非常小的索引,因為它使用“部分鍵”,只是索引節點全部鍵的一部分。對于更大的鍵,

CPB±樹展現出比 B±樹更好的性能。

如果省略了索引類型, SAP HANA 數據庫將考慮列的數據類型選擇合適的索引。

ALTER時,增加一列的長度是可以做到的。當在列式存儲中嘗試修改列的定義,不會返回錯誤,因為在數據庫中沒有做任何的檢查。錯誤可能發生在選擇列時,數據不符合新定義的數據類型。 ALTER 仍未遵照數據類型轉換規則。

將 NOT NULL 約束添加到已存在的列是可以的,如果表為空或者表有數據時定義了默認值

<add_primary_key_clause> ::= ADD [CONSTRAINT <constraint_name>] PRIMARY KEY( <column_name>, … )

ADD PRIMARY KEY:增加一列主鍵。

PRIMARY KEY:主鍵約束是 NOT NULL 約束和 UNIQUE 約束的組合,其禁止多行在同一列中具有相同的值。

CONSTRAINT:指定約束名。

<drop_primary_key_clause> ::= DROP PRIMARY KEY

DROP PRIMARY KEY:刪除主鍵約束。

<preload_clause> ::= PRELOAD ALL | PRELOAD ( <column_name> ) | PRELOAD NONE

PRELOAD:設置/移除給定表或列的預載標記。 PRELOAD ALL 為表中所有列設置預載標記, PRELOAD( <column_name> )為指定的列設置標記, PRELOAD NONE 移除

所有列的標記。其結果是這些表在索引服務器啟動后自動加載至內存中。預載標記的當前狀態在系統表 TABLES,列 PRELOAD 中可見, 可能值為(‘FULL’, ‘PARTIALLY’,

‘NO’);在系統表 TABLE_COLUMNS,列 PRELOAD,可能值為(‘TRUE’,‘FALSE’)。

<table_conversion_clause> ::= [ALTER TYPE] {ROW [THREADS <number_of_threads>] | COLUMN[THREADS <number_of_threads> [BATCH <batch_size>]]}

ALTER TYPE ROW | COLUMN:該命令用于將表存儲類型從行轉換為列或從列轉換為行。

THREADS <number_of_threads>:指定進行表轉換的并行線程數。線程數目的最佳值應設置為可用的 CPU 內核的數量。

Default:默認值為 param_sql_table_conversion_parallelism,即在 ndexserver.ini 文件中定義的 CPU內核數。

BATCH <batch_size>:指定批插入的行數,默認值為最佳值 2,000,000。插入表操作在每個<batch_size>記錄插入后立即提交,可以減少內存消耗。 BATCH 可選項只

可以在表 從行轉換為列時使用。然而,大于 2,000,000的批大小可能導致高內存消耗,因此不建議修改該值。通過復制現有的表中的列和數據,可以從現有的表

創建一個不同存儲類型的新表。該命令用來把表從行轉換為列或從列轉換為行。如果源表是行式存儲,則新建的表為列式存儲。

<move_clause> ::= MOVE [PARTITION <partition_number>] TO [LOCATION ]<host_port> [PHYSICAL] |MOVE [PARTITION <partition_number>] PHYSICAL

MOVE 將表移動至分布式環境中的另一個位置。 端口號是內部索引服務器的端口號, 3xx03。如果你有一個分區表,你可以通過指定可選的分區號只移動個別部

分,移動分區表時,沒有指定分區號會導致錯誤。

PHYSICAL 關鍵字只適用列式存儲表。行式存儲表總是物理移動。如果指定了可選關鍵字 PHYSICAL,持久存儲立即移動至目標主機。否則,此舉將創建一個新主機

里面的持久層鏈接指向舊主機持久層。該鏈接如果沒有 TO<host_port>部分,將在下次合并或者移 動中刪除。PHYSICAL 移動操作沒有指定 TO <host_port>時,將移

除從上次移動中仍然存在的持久層鏈接。

LOCATION 僅支持向后兼容

<add_range_partition_clause> ::= ADD PARTITION <lower_value> <= VALUES < <upper_value>| PARTITION <value_or_values> = <target_value>| PARTITION OTHERS

ADD PARTITION:為一個分區表添加分區,使用 RANGE, HASH RANGE, ROUNDROBIN RANGE 關鍵字。當添加分區至一張按范圍分區的表時,如果需要的話,可以對

其余分區進行重新分區。

<drop_range_partition_clause> ::= DROP PARTITION <lower_value> <= VALUES < <upper_value>| PARTITION <value_or_values> = <target_value>| PARTITION OTHERS

DROP PARTITION:刪除根據 RANGE, HASH RANGE, ROUNDROBIN RANGE 分區的表的分區。

<partition_clause> ::= PARTITION BY <hash_partition> [,<range_partition> | ,<hash_partition>]| PARTITION BY <range_partition>| PARTITION BY <roundrobin_partition>

[,<range_partition>]

<hash_partition> ::=HASH (<partition_expression>[, …]) PARTITIONS { <num_partitions> |GET_NUM_SERVERS() }

<range_partition> ::= RANGE ( <partition_expression> ) ( <range_spec> )

<roundrobin_partition> ::= ROUNDROBIN PARTITIONS {<num_partitions> |GET_NUM_SERVERS()}

<range_spec> ::= {<from_to_spec> | <single_spec>[,…] } [, PARTITION OTHERS]

<from_to_spec> ::= PARTITION <lower_value> <= VALUES < <upper_value>

<single_spec> ::= PARTITION VALUE <single_value>

<partition_expression> ::= <column_name>| YEAR(<column_name>) | MONTH(<column_name>)

PARTITION BY:使用 RANGE, HASH RANGE, ROUNDROBIN RANGE 對表進行分區。關于表分區自居,請參見 CREATE TABLE。

<merge_partition_clause> ::= MERGE PARTITIONS

MERGE PARTITIONS:合并分區表的所有部分至非分區表。

<disable_persistent_merge_clause> ::= DISABLE PERSISTENT MERGE

DISABLE PERSISTENT MERGE:指導合并管理器對于給定表,使用內存進行合并而非持久合并。

<enable_persistent_merge_clause> ::= ENABLE PERSISTENT MERGE

ENABLE PERSISTENT MERGE:指導合并管理器對于給定表使用持久合并。

<enable_delta_log> ::= ENABLE DELTA LOG

啟動表日志記錄。啟用之后,你必須執行一個保存點以確保所有的數據都保存,并且你必須執行數據備份,否則你不能恢復這些數據。

<enable_delta_log> ::= DISABLE DELTA LOG

DISABLE DELTA LOG:禁用表日志記錄。如果禁用,不會記錄該表的日志。當完成一個保存點對于該表的修改只會寫到數據域,這會導致當索引服務器終止時,提

交的事務丟失。

僅在初次加載中使用該命令!

<enable_delta_log> ::= ENABLE AUTOMERGE

指導合并管理器處理表。

<enable_delta_log> ::= DISABLE AUTOMERGE

DISABLE AUTOMERGE:指導合并管理器忽略該表。

例子:

表 t 已創建,列 b 的默認值設為 10。

CREATETABLE t (a INT, b INT);

ALTERTABLE t ALTER (b INTDEFAULT 10);

列 c 添加至表 t。

ALTERTABLE t ADD (c NVARCHAR(10) DEFAULT’NCHAR’);

創建表 t 的主鍵約束 prim_key。

ALTERTABLE t ADDCONSTRAINT prim_key PRIMARYKEY (a, b);

表 t 類型轉換為列式 (COLUMN)。

ALTERTABLE t COLUMN;

設置列 b 和 c 的預載標記

ALTERTABLE t PRELOAD (b, c);

表 t 使用 RANGE 分區,并且添加另一分區。

ALTERTABLE t PARTITIONBY RANGE (a) (PARTITIONVALUE = 1, PARTITION OTHERS);

ALTERTABLE t ADDPARTITION 2 <= VALUES < 10;

表 t 的會話類型改為 HISTORY

ALTERTABLE t CREATEHISTORY;

禁用表 t 的日志記錄。

ALTERTABLE t DISABLEDELTALOG;

7.1.6 CREATE AUDIT POLICY
語法:

CREATE AUDIT POLICY <policy_name> AUDITING <audit_status_clause> <audit_action_list> LEVEL <audit_level>

語法元素:

<audit_status_clause> ::= SUCCESSFUL | UNSUCCESSFUL | ALL

<audit_action_list> ::= <audit_action_name>[,<audit_action_name>]…

<audit_action_name> ::=GRANT PRIVILEGE | REVOKE PRIVILEGE| GRANT STRUCTURED PRIVILEGE | REVOKE STRUCTURED PRIVILEGE| GRANT ROLE | REVOKE ROLE| GRANT

ANY | REVOKE ANY| CREATE USER | DROP USER| CREATE ROLE | DROP ROLE| ENABLE AUDIT POLICY | DISABLE AUDIT POLICY| CREATE STRUCTURED PRIVILEGE| DROP STRUCTURED PRIVILEGE| ALTER STRUCTURED PRIVILEGE| CONNECT| SYSTEM CONFIGURATION CHANGE| SET SYSTEM LICENSE| UNSET SYSTEM LICENSE

<audit_level> ::=EMERGENCY| ALERT| CRITICAL| WARNING| INFO

描述:

CREATE AUDIT POLICY 語句創建新的審計策略。該審計策略可以稍后啟動,并將導致指定的審計活動發生的審計。

只有擁有系統權限 AUDIT ADMIN 用戶才可以新建審計策略。

指定的審計策略名必須和已有的審計策略名不同。

審計策略定義將被審計的審計活動。現有的審計策略需要被激活,從而進行審計。

<audit_status_clause>定義, 成功或不成功或執行指定的審計活動進行審核。

以下的審計活動是可供使用的。它們被分在不同的組里。一組審計活動可以組合成一個審計策略,不同組的審計行動不能組合成審計策略。

GRANT PRIVILEGE 1 審計授予用戶或角色的權限
REVOKE PRIVILEGE 1 審計撤銷用戶或角色的權限
GRANT STRUCTURED PRIVILEGE 1 審計授予用戶的結構/分析權限
REVOKE STRUCTURED PRIVILEGE 1 審計撤銷用戶的結構/分析權限
GRANT ROLE 1 審計授予用戶或角色的角色
REVOKE ROLE 1 審計撤銷用戶或角色的角色
GRANT ANY 1 審計授予用戶或角色的權限、結構/分析權限或角色
REVOKE ANY 1 審計撤銷用戶或角色的權限、結構/分析權限或角色
CREATE USER 2 審計用戶創建
DROP USER 2 審計用戶刪除
CREATE ROLE 2 審計角色創建
DROP ROLE 2 審計角色刪除
CONNECT 3 審計連接到數據庫的用戶
SYSTEM CONFIGURATION CHANGE 4 審計系統配置的更改(e.g. INIFILE)
ENABLE AUDIT POLICY 5 審計審核策略激活
DISABLE AUDIT POLICY 5 審計審核策略停用
CREATE STRUCTURED PRIVILEGE 6 審計結構化/分析權限創建
DROP STRUCTURED PRIVILEGE 6 審計結構化/

ALTER STRUCTURED PRIVILEGE 6 審計結構化/分析權限更改
SET SYSTEM LICENSE 7 審計許可證安裝
UNSET SYSTEM LICENSE 7 審計許可證刪除

每一個審計分配分配至審計級別,可能的值按照重要性遞減有:EMERGENCY, ALERT, CRITICAL, WARNING, INFO

為了使得審計活動發生,審計策略必須建立并啟動, global_auditing_state(見下文)必須設置為true。

配置參數:

目前,審計的配置參數存儲在 global.ini,部分審計配置如下:

global_auditing_state ( ‘true’ / ‘false’ )激活/關閉所有審計,無論有多少審計策略可用和啟動。默認為 false,代表沒有審計會發生。

default_audit_trail_type ( ‘SYSLOGPROTOCOL’ / ‘CSVTEXTFILE’ )定義如何存儲審計結果。

SYSLOGPROTOCOL 為默認值。

CSVTEXTFILE 應只用于測試目的。

default_audit_trail_path 指定 存儲文件的位置, CSVTEXTFILE 已經選定的情況下。

對于所有的配置參數,可以在視圖 M_INIFILE_CONTENTS 中選擇,如果當前用戶具有這樣做所需的權限。但是目前這些參數只有在被顯式設置后才可見。這意味著,它們將對新安裝的數據庫實例不可見。

系統和監控視圖

AUDIT_POLICY:顯式所有審計策略和其狀態

M_INIFILE_CONTENTS:顯示審計有關的配置參數

只有數據庫用戶具有 CATALOG READ, DATA ADMIN 或 INIFILE ADMIN 權限可以在視圖M_INIFILE_CONTENTS 查看任意信息,對于其他用戶,該視圖為空。

例子

新建的名為 priv_audit 的審計策略將審計有關成功授予和撤銷權限和角色的命令,該審計策略有中等審計級別 CRITICAL.。

該策略必須顯式啟動(見 alter_audit_policy),使得審計策略的審計發生。

CREATEAUDIT POLICY priv_audit AUDITING SUCCESSFUL GRANT PRIVILEGE, REVOKE PRIVILEGE, GRANT ROLE, REVOKE ROLE LEVEL CRITICAL;

7.1.7 CREATE FULLTEXT INDEX
語法:

CREATE FULLTEXT INDEX <index_name> ON ‘(’ <column_name> ‘)’ [<fulltext_parameter_list>]

定義全文索引名:

<fulltext_parameter_list> ::= <fulltext_parameter> [, …]

<fulltext_parameter> ::= LANGUAGE COLUMN <column_name>

| LANGUAGE DETECTION ‘(’ <string_literal_list> ‘)’

| MIME TYPE COLUMN <column_name>

| <change_tracking_elem>

| FUZZY SEARCH INDEX <on_off>

| PHRASE INDEX RATIO <on_off>

| CONFIGURATION <string_literal>

| SEARCH ONLY <on_off>

| FAST PREPROCESS <on_off>

<on_off> ::= ON | OFF

LANGUAGE COLUMN:指定文件語言的列

LANGUAGE DETECTION:語言檢測設置的語言集合。

MIME TYPE COLUMN:指定文件 mime-type 的列

FUZZY SEARCH INDEX:指定是否使用模糊搜索

PHRASE INDEX RATIO:指定短語索引比率的百分比,值必須為 0.0 和 1.0 之間。

CONFIGURATION:自定義配置文件的文本分析路徑。

SEARCH ONLY:如果設為 ON,將不存儲原始文件內容。

FAST PREPROCESS:如果設為 ON,將使用快速處理,例如語言搜索將不可用。

<change_tracking_elem> ::= SYNC[HRONOUS]| ASYNC[HRONOUS] [FLUSH [QUEUE]<flush_queue_elem>]

SYNC:指定是否創建同步全文索引

ASYNC:指定是否創建異步全文索引

<flush_queue_elem> ::= EVERY <integer_literal> MINUTES| AFTER <integer_literal> DOCUMENTS| EVERY <integer_literal> MINUTES OR AFTER <integer_literal> DOCUMENTS

指定如果使用異步索引,更新全文索引的時機。

描述:

CREATE FULLTEXT INDEX 語句對給定表創建顯式全文索引。

例子:

CREATE FULLTEXT INDEX i1 ON A? FUZZY SEARCH INDEXOFF

SYNC

LANGUAGE DETECTION (‘EN’,‘DE’,‘KR’)

上面的例子在表 A 的列 C 創建名為‘i1’的全文索引,未使用模糊搜索索引, 語言檢測設置的語言集合由’EN’,‘DE’ 和 'KR’組成。

7.1.8 CREATE INDEX
語法:

CREATE [UNIQUE] [BTREE | CPBTREE] INDEX [<schema_name>.]<index_name> ON <table_name>(<column_name_order>, …) [ASC | DESC]

語法元素:

<column_name_order> ::= <column_name> [ASC | DESC]

UNIQUE:用來創建唯一性索引。當創建索引和記錄添加到表中將進行重復檢查。

BTREE | CPBTREE:用來選擇使用的索引類型。當列的數據類型為字符串、二進制字符串、十進制數或者約束是一個組合鍵,或非唯一鍵,默認的索引類型為 CPBTREE,否則使用 BTREE。

為了使用 B±樹索引,必須使用 BTREE 關鍵字;對于 CPB±樹索引,需使用 CPBTREE 關鍵字。

B±樹是維護排序后的數據進行高效的插入、刪除和搜索記錄的樹。

CPB±樹表示壓縮前綴 B±樹,是基于 pkB-tree 樹。 CPB+樹是一個非常小的索引,因為它使用“部分鍵”,只是索引節點全部鍵的一部分。對于更大的鍵, CPB±樹展現出比 B±樹更好的性能。

如果省略了索引類型, SAP HANA 數據庫將考慮列的數據類型選擇合適的索引。

ASC | DESC:指定以遞增或遞減方式創建索引。

這些關鍵字只能在 btree 索引使用,并且對每一列只能使用一次。

描述:

CREATE INDEX 語句創建索引。

例子:

表 t 創建后,以遞增方式對表 t 的 b 列創建 CBPTREE 索引 idx。

CREATETABLE t (a INT, b NVARCHAR(10), c NVARCHAR(20));

CREATEINDEX idx ON t(b);

以遞增方式對表 t 的 a 列創建 CBPTREE 索引 idx,以遞減順序對 b 列創建:

CREATE CPBTREE INDEX idx1 ON t(a, b DESC);

以遞減方式對表 t 的 a 列和 c 列創建 CPBTREE 索引 idx2。

CREATEINDEX idx2 ON t(a, c) DESC;

以遞增順序對表 t 的 b 列和 c 列創建唯一性 CPBTREE 索引 idx3。

CREATEUNIQUEINDEX idx3 ON t(b, c);

以遞增順序對表 t 的 a 列創建唯一性 BTREE 索引 idx4。

CREATEUNIQUEINDEX idx4 ON t(a);

7.1.9 CREATE SCHEMA
語法:

CREATE SCHEMA <schema_name> [OWNED BY <user_name>]

OWNED BY:指定Schema所有者名字。如果省略,當前用戶將為Schema所有者。

描述:

CREATE SCHEMA 語句在當前數據庫創建Schema。

例子:

CREATESCHEMA my_schema OWNED BYsystem;

7.1.10 CREATE SEQUENCE
語法:

CREATE SEQUENCE <sequence_name> [<common_sequence_parameter_list>] [RESET BY ]

語法元素:

<common_sequence_parameter_list> ::= <common_sequence_parameter>, …

<common_sequence_parameter> ::= START WITH n | <basic_sequence_parameter>

<basic_sequence_parameter> ::= INCREMENT BY n| MAXVALUE n| NO MAXVALUE| MINVALUE n| NO MINVALUE| CYCLE| NO CYCLE

INCREMENT BY:定義上個分配值遞增到下一個序列值的量(即遞增遞減間隔值),默認值為 1。指定一個負的值來生成一個遞減的序列。 INCREMENT BY 值為 0,將返回錯誤。

START WITH:定義起始序列值。如果未定義 START WITH 子句值,遞增序列將使用 MINVALUE,遞減序列將使用MAXVALUE。

MAXVALUE:定義序列可生成的最大數值,必須為 0 至 4611686018427387903 之間。

NO MAXVALUE:使用 NO MAXVALUE 指令,遞增序列的最大值將為 4611686018427387903,遞減序列的最大值為-1。

MINVALUE:定義序列可生成的最小數值,必須為 0 至 4611686018427387903 之間。

NO MINVALUE:使用 NO MINVALUE 指令,遞增序列的最小值將為 1,遞減序列的最小值為-4611686018427387903。

CYCLE:使用 CYCLE 指令,序列在到達最大值或最小值后將會重新開始。

NO CYCLE:使用 NO CYCLE 指令,序列在到達最大值或最小值后將不會重新開始。

RESET BY:系統重啟期間,系統自動執行 RESET BY 語句,并且將用 RESET BY 子查詢確定的值重啟序列。

如果未指定 RESET BY,序列值將持久地存儲在數據庫中。在數據庫重啟過程中,序列的下一個值將由已保存的序列值生成。

描述:

CREATE SEQUENCE 語句用來創建序列。

序列用來為多個用戶生成唯一整數。 CURRVAL 用來獲取序列的當前值,NEXTVAL 則用來獲取序列的下一個值。 CURRVAL 只有在會話中調用 NEXTVAL 才有效。

例子:

例子 1:

序列 seq 已創建,使用 CURRVAL 和 NEXTVAL 從序列中讀取值。

CREATESEQUENCE seq START WITH 11;

NEXTVAL 返回 11:

SELECT seq.NEXTVAL FROM DUMMY;–11

CURRVAL 返回 11:

SELECT seq.CURRVAL FROM DUMMY;–11

例子 2:

如果序列用來在表 R 的 A 列上創建唯一鍵,在數據庫重啟后,通過自動分配列 A 的最大值到序列,創建一個唯一鍵值,語句如下:

CREATETABLE r (a INT);

CREATESEQUENCE s RESETBYSELECTIFNULL(MAX(a), 0) + 1 FROM r;

SELECT s.NEXTVAL FROM DUMMY;–1

7.1.11 CREATE SYNONYM
語法:

CREATE [PUBLIC] SYNONYM <synonym_name> FOR <object_name>

語法元素:

<object_name> ::= <table_name>| <view_name>| <procedure_name>| <sequence_name>

描述:

CREATE SYNONYM 為表、視圖、存儲過程或者序列創建備用名稱。

你可以使用同義詞把函數和存儲過程重新指向不同的表、視圖或者序列,而不需要重寫函數或者過程。

可選項 PUBLIC 允許創建公用同義詞。任何用戶可以訪問公用同義詞,但只有擁有基本對象合適權限的用戶可以訪問基本對象。

例子:

CREATESYNONYM t_synonym FOR t;

7.1.12 CREATE TABLE
語法:

CREATE [<table_type>] TABLE [<schema_name>.]<table_name> <table_contents_source>[<logging_option> | <auto_merge_option> | <partition_clause> | <location_clause>]

語法元素:

<table_type> ::= COLUMN| ROW| HISTORY COLUMN| GLOBAL TEMPORARY| LOCAL TEMPORARY

COLUMN, ROW:如果大多數的訪問是通過大量元組,而只選擇少數幾個屬性,應使用基于列的存儲。如果大多數訪問選擇一些記錄的全部屬性,使用基于行的存儲是最好的。 SAP HANA 數據庫使用組合啟用兩種方式的的存儲和解釋。你可以為每張表指定組織類型,默認值為 ROW。

HISTORY COLUMN:利用特殊的事務會話類型稱為’HISTORY’創建表。具有會話類型’HISTORY’的表支持“時間旅行”, 對歷史狀態的數據庫查詢的執行是可能的。

時間旅行可以以如下方式完成:

會話級別時間旅行:

SET HISTORY SESSION TO UTCTIMESTAMP = <utc_timestamp>

SET HISTORY SESSION TO COMMIT ID = <commit_id>

<utc_timestamp> ::= <string_literal>

<commit_id> ::= <unsigned_integer>

數據庫會話可以設置回到一個特定時間點。該語句的 COMMIT ID 變量接受 commitid 作為參數。commitid 參數的值必須存在系統表 SYS.TRANSACTION_HISTORY 的 COMMIT_ID 列,否則將拋出異常。 COMMIT_ID 在使用用戶定義的快照時是有用的。用戶自定義的快照可以通過存儲在提交階段分配至事務的 commitid 來獲得。 Commitid 可以通過在事務提交后執行以下查詢來讀取:

SELECT LAST_COMMIT_ID FROM M_TRANSACTIONS WHERE CONNECTION_ID = CURRENT_CONNECTION;

該語句的 TIMESTAMP 變量接受時間戳作為參數。在系統內部,時間戳用來在系統表SYS.TRANSACTION_HISTORY,commit_time 接近給定的時間戳的地方,查詢一對(commit_time,commit_id),準確的說,選擇最大 COMMIT_TIME 小于等于給定時間戳的對;如果沒有找到這樣的對,將會拋出異常。然后會話將使用 COMMIT_ID 變量確定的 commit-id 恢復。 要終止恢復會話切換到當前會話中,必須在數據庫連接上執行明確的 COMMIT 或 ROLLBACK。

語句級別時間旅行:

AS OF UTCTIMESTAMP <utc_timestamp>

AS OF COMMIT ID <commit_id>

為了能使 commitid 與提交時間關聯,需維護系統表 SYS.TRANSACTION_HISTORY,存儲每個為歷史表提交數據的事務的額外信息。有關設置會話級別時間旅行的詳細信息,請參閱 SET HISTORY SESSION,關于的信息,請參閱 Subquery。

注意:

當會話恢復時,自動提交必須關閉(否則會拋出包含相應錯誤消息的異常)。

非歷史表在恢復會話中總顯示其當前快照。

只有數據查詢語句(select)可以在恢復會話中使用。

歷史表必須有主鍵。

會話類型可以通過系統表 SYS.TABLES 的 SESSION_TYPE 列檢查。

GLOBAL TEMPORARY:

表定義全局可見,但數據只在當前會話中可見。表在會話結束后截斷。

全局臨時表的元數據是持久的,表示該元數據一直存在直到表被刪除,元數據在會話間共享。臨時表中的數據是會話特定的,代表只有全局臨時表的所有者才允許插入、讀取、刪除數據,存在于會話持續期間,并且當會話結束時,全局臨時表中的數據會自動刪除。全局臨時表只有當表中沒有任何數據才能被刪除。全局臨時表支持的操作:

  • Create without a primary key

  • Rename table

  • Rename column

  • Truncate

  • Drop

  • Create or Drop view on top of global temporary table

  • Create synonym

  • Select

  • Select into or Insert

  • Delete

  • Update

  • Upsert or Replace

  • LOCAL TEMPORARY:

    表的定義和數據只在當前會話可見,該表在會話結束時被截斷。

    元數據在會話間共享,并且是會話特定的,代表只有本地臨時表的所有者才允許查看。臨時表中的數據是會話特定的,代表只有本地臨時表的所有者才允許插入、讀取、刪除數據,存在于會話持續期間,并且當會話結束時,本地臨時表中的數據會自動刪除。

    本地臨時表支持的操作:

  • Create without a primary key

  • Truncate

  • Drop

  • Select

  • Select into or Insert

  • Delete

  • Update

  • Upsert or Replace

  • <table_contents_source> ::= (<table_element>, …)| <like_table_clause> [WITH [NO] DATA]| [(<column_name>, …)] <as_table_subquery> [WITH [NO] DATA]]

    <table_element> ::= <column_definition> [<column_constraint>]| <table_constraint> (<column_name>, … )

    <column_definition> ::= <column_name> <data_type> [<column_store_data_type>] [<ddic_data_type>][DEFAULT <default_value>] [GENERATED ALWAYS AS

    ]

    <data_type> ::= DATE | TIME | SECONDDATE | TIMESTAMP | TINYINT | SMALLINT | INTEGER | BIGINT |SMALLDECIMAL | DECIMAL | REAL | DOUBLE|

    VARCHAR | NVARCHAR | ALPHANUM | SHORTTEXT |VARBINARY |BLOB | CLOB | NCLOB | TEXT

    <column_store_data_type> ::= S_ALPHANUM | CS_INT | CS_FIXED | CS_FLOAT| CS_DOUBLE |CS_DECIMAL_FLOAT | CS_FIXED(p-s, s) | CS_SDFLOAT|

    CS_STRING | CS_UNITEDECFLOAT | CS_DATE |CS_TIME | CS_FIXEDSTRING | CS_RAW | CS_DAYDATE | CS_SECONDTIME | CS_LONGDATE |CS_SECONDDATE

    <ddic_data_type> ::= DDIC_ACCP | DDIC_ALNM | DDIC_CHAR | DDIC_CDAY | DDIC_CLNT | DDIC_CUKY| DDIC_CURR | DDIC_D16D | DDIC_D34D | DIC_D16R

    | DDIC_D34R | DDIC_D16S | DDIC_D34S| DDIC_DATS | DDIC_DAY | DDIC_DEC | DDIC_FLTP | DDIC_GUID | DDIC_INT1 | DDIC_INT2 | DDIC_INT4| DDIC_INT8 | DDIC_LANG | DDIC_LCHR | DDIC_MIN | DDIC_MON| DDIC_LRAW | DDIC_NUMC |DDIC_PREC |DDIC_QUAN | DDIC_RAW | DDIC_RSTR | DDIC_SEC | DDIC_SRST | DDIC_SSTR |DDIC_STRG | DDIC_STXT | DDIC_TIMS | DDIC_UNIT| DDIC_UTCM | DDIC_UTCL | DDIC_UTCS |DDIC_TEXT | DDIC_VARC | DDIC_WEEK

    <default_value> ::= NULL | <string_literal> | <signed_numeric_literal>| <unsigned_numeric_literal>

    DEFAULT:DEFAULT 定義了 INSERT 語句沒有為列提供值情況下,默認分配的值。

    GENERATED ALWAYS AS:指定在運行時生成的列值的表達式。

    <column_constraint> ::= NULL| NOT NULL| UNIQUE [BTREE | CPBTREE]| PRIMARY KEY [BTREE | CPBTREE]

    NULL | NOT NULL:NOT NULL 禁止列的值為 NULL。如果指定了 NULL,將不被認為是常量,其表示一列可能含有空值,默認為 NULL。

    UNIQUE:指定為唯一鍵的列。一個唯一的復合鍵指定多個列作為唯一鍵。有了 unique 約束,多行不能在同一列中具有相同的值。

    PRIMARY KEY:主鍵約束是 NOT NULL 約束和 UNIQUE 約束的組合,其禁止多行在同一列中具有相同的值。

    BTREE | CPBTREE:指定索引類型。當列的數據類型為字符串、二進制字符串、十進制數或者約束是一個組合鍵,或非唯一鍵,默認的索引類型為 PBTREE,

    否則使用 BTREE。為了使用 B±樹索引,必須使用 BTREE 關鍵字;對于 CPB±樹索引,需使用 CPBTREE 關鍵字。B±樹是維護排序后的數據進行高效的插入、刪除和搜索記錄的樹。CPB±樹表示壓縮前綴 B±樹,是基于 pkB-tree 樹。 CPB+樹是一個非常小的索引,因為它使用“部分鍵”,只是索引節點全部鍵的一部分。對于更大的鍵, CPB±樹展現出比 B±樹更好的性能。如果省略了索引類型, SAP HANA 數據庫將考慮列的數據類型選擇合適的索引。

    <table_constraint> ::= UNIQUE [BTREE | CPBTREE]| PRIMARY KEY [BTREE | CPBTREE]

    定義了表約束可以使用在表的一列或者多列上。

    <like_table_clause> ::= LIKE <table_name>

    創建與 like_table_name 定義相同的表。表中所有列的定義和默認值拷貝自 like_table_name。當提供了可選項 WITH DATA,數據將從指定的表填充,不過,默認值為 WITH NO DATA。

    <as_table_subquery> ::= AS '()

    創建表并且用計算的數據填充。使用該子句只拷貝 NOT NULL 約束。如果指定了column_names,該指定的 column_names 將覆蓋中的列名。WITH [NO] DATA 指定數據拷貝自 或 <like_table_clause>。

    <logging_option> ::= LOGGING| NO LOGGING [RETENTION <retention_period>]

    <retention_period> ::= <unsigned_integer>

    LOGGING | NO LOGGING:LOGGING (默認值)指定激活記錄表日志。NO LOGGING 指定停用記錄表日志。一張 NO LOGGING 表意味表定義是持久的且全局可見的,數據則為臨時和全局的。

    RETENTION:指定以秒為單位,NO LOGGING 列式表的保留時間。在指定的保留期限已過,如果使用物理內存的主機達到 80%,上述表將被刪除。

    <auto_merge_option> ::= AUTO MERGE | NO AUTO MERGE

    AUTO MERGE | NO AUTO MERGE:AUTO MERGE (默認值)指定觸發自動增量合并。

    <partition_clause> ::= PARTITION BY <hash_partition> [, <range_partition> | , <hash_partition>]| PARTITION BY <range_partition>| PARTITION BY <roundrobin_partition>

    [,<range_partition>]

    <hash_partition> ::= HASH (<partition_expression> [, …]) PARTITIONS {<num_partitions> |GET_NUM_SERVERS()}

    <range_partition> ::= RANGE (<partition_expression>) (<range_spec>, …)

    <roundrobin_partition> ::= ROUNDROBIN PARTITIONS {<num_partitions> | GET_NUM_SERVERS()} [,<range_partition>]

    <range_spec> ::= {<from_to_spec> | <single_spec>} [, …] [, PARTITION OTHERS]

    <from_to_spec> ::= PARTITION <lower_value> <= VALUES < <upper_value>

    <single_spec> ::= PARTITION VALUE <target_value>

    <lower_value> ::= <string_literal> | <numeric_literal>

    <upper_value> ::= <string_literal> | <numeric_literal>

    <target_value> ::= <string_literal> | <numeric_literal>

    <partition_expression> ::= <column_name> | YEAR(<column_name>) | MONTH(<column_name>)

    <num_partitions> ::= <unsigned_integer>

    GET_NUM_SERVERS()函數返回服務器數量。

    PARTITION OTHERS 表示分區定義中未指定的其余值成為一個分區。

    確定分區創建所在的索引服務器是可能的。如果你指定了 LOCATION,在這些實例中循環創建分區。列表中的重復項將被移除。如果你在分區定義中精確指定實例數為分區數,則每個分區將分配至列表中各自實例。所有索引列表中的服務器必須屬于同一個實例。如果指定了 no location,將隨機創建分區。如果分區數與服務器數匹配-例如使用

    GET_NUM_SERVERS()-可以確保多個 CREATE TABLE 調用以同樣的方式分配分區。對于多級別分區的情況,其適用于第一級的分區數。這個機制是很有用的,如果創建彼此語義相關的多張表。

    <location_clause> ::= AT [LOCATION] {’:’ | (’:’, …)}

    AT LOCATION:表可以創建在 host:port 指定的位置,位置列表可以在創建分配至多個實例的分區表時定義。當位置列表沒有提供<partition_clause>,表將創建至指定的第一個位置中。如果沒有提供位置信息,表將自動分配到一個節點中。此選項可用于在分布式環境中的行存儲和列存儲表

    描述:

    CREATE TABLE 創建一張表。表中未填充數據,除了當<as_table_subquery> 或 <like_table_clause>和WITH DATA 可選項一起使用。

    例子:

    創建了表 A,整數列 A 和 B。列 A 具有主鍵約束。

    CREATETABLE A (A INTPRIMARYKEY, B INT);

    創建了分區表 P1,日期列 U。列 U 具有主鍵約束并且作為 RANGE 分區列使用。

    CREATECOLUMNTABLE P1 (U DATEPRIMARYKEY) PARTITIONBY RANGE (U) (PARTITION’2010-02-03’<= VALUES < ‘2011-01-01’, PARTITIONVALUE = ‘2011-05-01’);

    創建了分區表 P2,整數列 I,J 和 K。列 I,J 組成鍵約束,并且作為哈希分區列使用。列 K 則為子哈希分區列。

    CREATECOLUMNTABLE P2 (I INT, J INT, K INT, PRIMARYKEY(I, J)) PARTITIONBY HASH (I, J) PARTITIONS 2, HASH (K) PARTITIONS 2;

    創建表 C1,與表 A 的定義相同,記錄也相同。

    CREATECOLUMNTABLE C1 LIKE A WITH DATA;

    創建表 C2,與表 A 的列數據類型和 NOT NULL 約束相同。表 C2 沒有任何數據。

    CREATETABLE C2 AS (SELECT * FROM A) WITHNO DATA;

    7.1.13 CREATE TRIGGER
    語法:

    CREATE TRIGGER <trigger_name> <trigger_action_time> <trigger_event> ON <subject_table_name> [REFERENCING <transition_list>][<for_each_row>]

    BEGIN

    [<trigger_decl_list>]

    [<proc_handler_list>]

    <trigger_stmt_list>

    END

    語法元素:

    <trigger_name> ::= 你創建的觸發器名稱。

    <subject_table_name> ::= 你創建的觸發器所在表的名稱。

    <trigger_action_time> ::= BEFORE | AFTER 指定觸發動作發生的 時間。

    BEFORE:操作主題表之前執行觸發。

    AFTER:操作主題表之后執行觸發。

    <trigger_event> ::= INSERT | DELETE | UPDATE 定義激活觸發器活動的數據修改命令

    <transition_list> ::= | <transition_list> ,

    ::= <trigger_transition_old_or_new> <trigger_transition_var_or_table> <trans_var_name>|<trigger_transition_old_or_new> <trigger_transition_var_or_table> AS <trans_var_name>

    當聲明了 觸發器轉變變量,觸發器可以訪問 DML 正在修改的記錄。

    當執行了行級別觸發器, <trans_var_name>.<column_name>代表觸發器正在修改的記錄的相應列。

    這里, <column_name>為主題表的列名。參見轉換變量的例子。

    <trigger_transition_old_or_new> ::= OLD | NEW

    <trigger_transition_var_or_table> ::= ROW

    OLD

    你可以訪問觸發器 DML 的舊記錄,取而代之的是更新的舊記錄或刪除的舊記錄。

    UPDATE 觸發器和 DELETE 觸發器可以有 OLD ROW 事務變量。

    NEW

    你可以訪問觸發器 DML 的新記錄,取而代之的是插入的新記錄或更新的新記錄。

    UPDATE 觸發器和 DELETE 觸發器可以有 NEW ROW 事務變量。

    只支持事務變量。

    事務表不被支持。

    如果你將’TABLE’作為<trigger_transition_var_or_table>,你將看到不支持功能錯誤。

    <for_each_row> ::= FOR EACH ROW

    觸發器將以逐行方式調用。

    默認模式為執行行級別觸發器,沒有 FOR EACH ROW 語法。

    目前,逐語句觸發不被支持。

    <trigger_decl_list> ::= DECLARE <trigger_decl>| <trigger_decl_list> DECLARE <trigger_decl>

    <trigger_decl> ::= <trigger_var_decl> | <trigger_condition_decl>

    <trigger_var_decl> ::= <var_name> CONSTANT <data_type> [<not_null>] [<trigger_default_assign>] ;| <var_name> <data_type> [NOT NULL] [<trigger_default_assign>] ;

    <data_type> ::= DATE | TIME | SECONDDATE | TIMESTAMP | TINYINT | SMALLINT | INTEGER| BIGINT |SMALLDECIMAL | DECIMAL | REAL | DOUBLE| VARCHAR | NVARCHAR | ALPHANUM | SHORTTEXT|VARBINARY | BLOB | CLOB| NCLOB | TEXT

    <trigger_default_assign> ::= DEFAULT | :=

    <trigger_condition_decl> ::= <condition_name> CONDITION ;| <condition_name> CONDITION FOR <sql_error_code> ;

    <sql_error_code> ::= SQL_ERROR_CODE <int_const>

    trigger_decl_list

    你可以聲明觸發器變量或者條件。

    聲明的變量可以在標量賦值中使用或者在 SQL 語句觸發中引用。

    聲明的條件名可以在異常處理中引用。

    CONSTANT

    當指定了 CONSTANT 關鍵字,你不可以在觸發器執行時修改變量。

    <proc_handler_list> ::= <proc_handler>| <proc_handler_list> <proc_handler>

    <proc_handler> ::= DECLARE EXIT HANDLER FOR <proc_condition_value_list> <trigger_stmt>

    <proc_condition_value_list> ::= <proc_condition_value>| <proc_condition_value_list> , <proc_condition_value>

    <proc_condition_value> ::= SQLEXCEPTION
    | SQLWARNING
    | <sql_error_code>
    | <condition_name>
    異常處理可以聲明捕捉已存的 SQL 異常,特定的錯誤代碼或者條件變量聲明的條件名稱。
    <trigger_stmt_list> ::= <trigger_stmt>| <trigger_stmt_list> <trigger_stmt>
    <trigger_stmt> ::= <proc_block>
    | <proc_assign>
    | <proc_if>
    | <proc_loop>
    | <proc_while>
    | <proc_for>
    | <proc_foreach>
    | <proc_signal>
    | <proc_resignal>
    | <trigger_sql>
    觸發器主體的語法是過程體的語法的一部分。
    參見 SAP HANA Database SQLScript guide 中的 create procedure 定義。
    觸發器主體的語法遵循過程體的語法,即嵌套塊(proc_block),標量變量分配(proc_assign), if 塊
    (proc_if),, loop 塊(proc_loop), for 塊(proc_for), for each 塊(proc_foreach), exception
    signal(proc_signal), exception resignal(proc_resignal),和 sql 語句(proc_sql)。
    <proc_block> ::= BEGIN
    [<trigger_decl_list>]
    [<proc_handler_list>]
    <trigger_stmt_list>
    END ;
    你可以以嵌套方式添加另外的’BEGIN … END;'塊。
    <proc_assign> ::= <var_name> := ;
    var_name 為變量名,應該事先聲明。
    <proc_if> ::= IF THEN <trigger_stmt_list>
    [<proc_elsif_list>]
    [<proc_else>]
    END IF ;
    <proc_elsif_list> ::= ELSEIF THEN <trigger_stmt_list>

    <proc_else> ::= ELSE <trigger_stmt_list>
    關于 condition 的說明,參見 SELECT 的。
    你可以使用 IF … THEN … ELSEIF… END IF 控制執行流程與條件。
    <proc_loop> ::= LOOP <trigger_stmt_list> END LOOP ;
    <proc_while> ::= WHILE DO <trigger_stmt_list> END WHILE ;
    <proc_for> ::= FOR <column_name> IN [] <DDOT_OP>
    DO <trigger_stmt_list>
    END FOR ;
    <column_name> ::=
    ::= REVERSE
    <DDOT_OP> ::= …
    <proc_foreach> ::= FOR <column_name> AS <column_name> [<open_param_list>] DO
    <trigger_stmt_list>
    END FOR ;
    <open_param_list> ::= ( <expr_list> )
    <expr_list> ::= | <expr_list> ,
    <proc_signal> ::= SIGNAL <signal_value> [<set_signal_info>] ;
    <proc_resignal> ::= RESIGNAL [<signal_value>] [<set_signal_info>] ;
    <signal_value> ::= <signal_name> | <sql_error_code>
    <signal_name> ::=
    <set_signal_info> ::= SET MESSEGE_TEXT = ‘<message_string>’
    <message_string> ::=
    SET MESSEGE_TEXT
    如果你為自己的消息設置 SET MESSEGE_TEXT,當觸發器執行時指定的錯誤被拋出,消息傳遞給用
    戶。
    SIGNAL 語句顯式拋出一個異常。
    用戶定義的范圍( 10000?19999)將被允許發行錯誤代碼。
    RESIGNAL 語句在異常處理中對活動語句拋出異常。
    如果沒有指定錯誤代碼, RESIGNAL 將拋出已捕捉的異常。

    <trigger_sql> ::= <select_into_stmt>
    | <insert_stmt>
    | <delete_stmt>
    | <update_stmt>
    | <replace_stmt>
    | <upsert_stmt>
    對于 insert_stmt 的詳情,參見 INSERT。
    對于 delete_stmt 的詳情,參見 DELETE。
    對于 update_stmt 的詳情,參見 UPDATE。
    對于 replace_stmt 和 upsert_stmt 的詳情,參見 REPLACE | UPSERT。
    <select_into_stmt> ::= SELECT <select_list> INTO <var_name_list>
    <from_clause >
    [<where_clause>]
    [<group_by_clause>]
    [<having_clause>]
    [{<set_operator> , … }]
    [<order_by_clause>]
    []
    <var_name_list> ::= <var_name> | <var_name_list> , <var_name>
    <var_name> ::=
    關于 select_list, from_clause, where_clause, group_by_clause, having_clause,set_operator, subquery,
    order_by_clause, limit 的詳情,參見 SELECT。
    var_name 是預先聲明的標量變量名。
    你可以分配選中項至標量變量中。
    描述:
    CREATE TRIGGER 語句創建觸發器。
    觸發器是一種特殊的存儲過程,在對表發生事件時自動執行。
    CREATE TRIGGER 命令定義一組語句,當給定操作(INSERT/UPDATE/DELETE)發生在給定對象(主題表)
    上執行。
    只有對于給定的<subject_table_name>擁有 TRIGGER 權限的數據庫用戶允許創建表的觸發器。
    當前觸發器限制描述如下:
    l不支持 INSTEAD_OF 觸發器。
    l訪問觸發器定義的主題表在觸發器主體中是不允許的,這代表對于觸發器所在的表的任何
    insert/update/delete/replace/select

    l只支持行級別觸發器,不支持語句級別觸發器。行級別觸發器表示觸發活動只有在每次行改
    變時執行。語句級別觸發器代表觸發活動在每次語句執行時運行。語法’FOR EACH ROW’表示
    行式執行觸發,為默認模式;即時沒有指定’FOR EACH ROW’,仍然為行級別觸發器。
    l不支持事務表(OLD/NEW TABLE)。當觸發 SQL 語句想要引用正在被觸發器觸發事件如
    insert/update/delete 修改的數據,事務變量/表將是觸發器主體中 SQL 語句訪問新數據和舊數
    據的方式。事務變量只在行級別觸發器中使用,而事務表則在語句級別觸發器中使用。
    l不支持從節點到多個主機或表中的分區表上執行觸發器。
    l表只能為每個 DML 操作有一個觸發器,可能是插入觸發器、更新觸發器和刪除觸發器,并且
    它們三個可以一起激活。
    因此,一張表總共最多有三個觸發器。
    l不支持的觸發器動作(而存儲過程支持):
    resultset assignment(select resultset assignment to tabletype),
    exit/continue command(execution flow control),
    cursor open/fetch/close(get each record data of search result by cursor and access record in loop),
    procedure call(call another proecedure),
    dynomic sql execution(build SQL statements dynamically at runtime of SQLScript),
    return(end SQL statement execution)
    系統和監控視圖:
    TRIGGER 為觸發器的系統視圖:
    系統視圖 TRIGGER 顯示:
    SCHEMA_NAME, TRIGGER_NAME, TRIGGER_OID, OWNER_NAME,
    OWNER_OID,SUBJECT_TABLE_SCHEMA,SUBJECT_TABLE_NAME, TRIGGER_ACTION_TIME,
    TRIGGER_EVENT, TRIGGERED_ACTION_LEVEL,DEFINITION
    例子:
    你先需要觸發器定義的表:
    CREATETABLE TARGET ( A INT);
    你也需要表觸發訪問和修改:
    CREATETABLE SAMPLE ( A INT);
    以下為創建觸發器的例子:

    CREATE TRIGGER TEST_TRIGGER AFTERINSERTON TARGET FOR EACH ROW

    BEGIN

    DECLARE SAMPLE_COUNT INT;SELECTCOUNT(*) INTO SAMPLE_COUNT FROM SAMPLE;IF :SAMPLE_COUNT = 0 THENINSERTINTO SAMPLE VALUES(5);ELSEIF :SAMPLE_COUNT = 1 THENINSERTINTO SAMPLE VALUES(6);ENDIF;

    END;

    觸發器 TEST_TRIGGER 將在任意記錄插入至 TARGET 表后執行。由于在第一次插入中,表 SAMPLE 記錄數為 0,觸發器 TEST_TRIGGER 將插入 5 至表中。
    在第二次插入 TARGET 表時,觸發器插入 6,因為其計數為 1。
    INSERTINTO TARGET VALUES (1);

    SELECT * FROM SAMPLE;–5

    INSERTINTO TARGET VALUES (2);

    SELECT * FROM SAMPLE;–5 6

    7.1.14 CREATE VIEW
    語法:

    CREATE VIEW [<schema_name>.]<view_name> [(<column_name>, … )] AS

    描述:

    CREATE VIEW 可以有效地根據 SQL 結果創建虛擬表,這不是真正意義上的表,因為它本身不包含數據。

    當列名一起作為視圖的名稱,查詢結果將以列名顯示。如果列名被省略,查詢結果自動給出一個適當的列名。列名的數目必須與從返回的列數目相同。

    支持視圖的更新操作,如果滿足以下條件:

    視圖中的每一列必須映射到單個表中的一列。

    如果基表中的一列有 NOT NULL 約束,且沒有默認值,該列必須包含在可插入視圖的列中。更新操作沒有該條件。

    例如在 SELECT 列表,必須不包含聚合或分析的功能,以下是不允許的:

    . 在 SELECT 列表中的 TOP, SET, DISTINCT 操作

    . GROUP BY, ORDER BY 子句

    在 SELECT 列表中必須不能含有子查詢。

    必須不能包含序列值(CURRVAL, NEXTVAL)。

    必須不能包含作為基視圖的列視圖。

    如果基視圖或表是可更新的,符合上述條件的基礎上,基視圖或表的視圖是可更新的。

    例子:

    選擇表 a 中的所有數據創建視圖 v:

    CREATEVIEW v ASSELECT * FROM a;

    7.1.15 DROP AUDIT POLICY
    語法:

    DROP AUDIT POLICY <policy_name>

    描述:

    DROP AUDIT POLICY 語句刪除審計策略。 <policy_name>必須指定已存在的審計策略。

    只有擁有系統權限 AUDIT ADMIN 的數據庫用戶允許刪除審計策略。每個擁有該權限的數據庫用戶可以刪除任意的審計策略,無論是否由該用戶創建。

    即使審計策略被刪除了,可能發生的是,定義在已刪除的審計策略中的活動將被進一步審計;如果也啟用了其他審計策略和定義了審計活動。

    暫時關閉審計策略時,可以禁用而不用刪除。

    系統和監控視圖:

    AUDIT_POLICY:顯示所有審計策略和狀態。

    M_INIFILE_CONTENTS:顯示數據庫系統配置參數。

    只有擁有系統權限 CATALOG READ, DATA ADMIN 或 INIFILE ADMIN 的用戶可以查看M_INIFILE_CONTENTS 視圖中的內容,對于其他用戶則為空。

    例子:

    假設使用如下語句前,審計策略已創建:

    CREATEAUDIT POLICY priv_audit AUDITING SUCCESSFUL GRANT PRIVILEGE, REVOKE PRIVILEGE, GRANT ROLE, REVOKE ROLE LEVEL CRITICAL;

    現在,該審計策略必須刪除:

    DROPAUDIT POLICY priv_audit;

    7.1.16 DROP FULLTEXT INDEX
    語法:

    DROP FULLTEXT INDEX <fulltext_index_name>

    描述:

    DROP FULLTEXT INDEX 語句移除全文索引。

    例子:

    DROP FULLTEXT INDEX idx;

    7.1.17 DROP INDEX
    語法:

    DROP INDEX <index_name>

    描述:

    DROP INDEX 語句移除索引。

    例子:

    DROPINDEX idx;

    7.1.18 DROP SCHEMA
    語法:

    DROP SCHEMA <schema_name> [<drop_option>]

    語法元素:

    <drop_option> ::= CASCADE | RESTRICT

    Default = RESTRICT

    有限制的刪除操作將刪除對象當其沒有依賴對象時。如果存在依賴對象,將拋出錯誤。

    CASCADE級聯刪除:將刪除對象以及其依賴對象。

    描述:

    DROP SCHEMA 語句移除schema。

    例子:

    創建集合 my_schema,表 my_schema.t,然后 my_schema 將使用 CASCADE 選項刪除。

    CREATESCHEMA my_schema;

    CREATETABLE my_schema.t (a INT);

    DROPSCHEMA my_schema CASCADE;

    7.1.19 DROP SEQUENCE
    語法:

    DROP SEQUENCE <sequence_name> [<drop_option>]

    語法元素:

    <drop_option> ::= CASCADE | RESTRICT

    Default = RESTRICT

    級聯刪除將刪除對象以及其依賴對象。當未指定 CASCADE 可選項,將執行非級聯刪除對象,不會刪除依賴對象,而是使依賴對象 (VIEW, PROCEDURE) 無效。

    無效的對象可以重新驗證當一個對象有同樣的集合,并且已創建了對象名。對象 ID,集合名以及對象名為重新驗證依賴對象而保留。

    有限制的刪除操作將刪除對象當其沒有依賴對象時。如果存在依賴對象,將拋出錯誤。

    描述:

    DROP SEQUENCE 語句移除序列。

    例子:

    DROPSEQUENCE s;

    7.1.20 DROP SYNONYM
    語法:

    DROP [PUBLIC] SYNONYM <synonym_name> [<drop_option>]

    語法元素:

    <drop_option> ::= CASCADE | RESTRICT

    Default = RESTRICT

    級聯刪除將刪除對象以及其依賴對象。當未指定 CASCADE 可選項,將執行非級聯刪除操作,不會刪除依賴對象,而是使依賴對象 (VIEW, PROCEDURE) 無效。

    無效的對象可以重新驗證當一個對象有同樣的集合,并且已創建了對象名。對象 ID,集合名以及對象名為重新驗證依賴對象而保留。

    有限制的刪除操作將刪除對象當其沒有依賴對象時。如果存在依賴對象,將拋出錯誤。

    描述:

    DROP SYNONYM 刪除同義詞。可選項 PUBLIC 允許刪除公用同義詞。

    例子:

    表 a 已創建,然后為表 a 創建同義詞 a_synonym 和公用同義詞 pa_synonym:

    CREATETABLE a (c INT);

    CREATESYNONYM a_synonym FOR a;

    CREATEPUBLICSYNONYM pa_synonym FOR a;

    刪除同義詞 a_synonym 和公用同義詞 pa_synonym

    DROPSYNONYM a_synonym;

    DROPPUBLICSYNONYM pa_synonym;

    7.1.21 DROP TABLE
    語法:

    DROP TABLE [<schema_name>.]<table_name> [<drop_option>]

    語法元素:

    <drop_option> ::= CASCADE | RESTRICT

    Default = RESTRICT

    級聯刪除將刪除對象以及其依賴對象。當未指定 CASCADE 可選項,將執行非級聯刪除操作,不會刪除依賴對象,而是使依賴對象 (VIEW, PROCEDURE) 無效。

    無效的對象可以重新驗證當一個對象有同樣的集合,并且已創建了對象名。對象 ID,集合名以及對象名為重新驗證依賴對象而保留。

    有限制的刪除操作將刪除對象當其沒有依賴對象時。如果存在依賴對象,將拋出錯誤。

    描述:

    DROP TABLE 語句刪除表。

    例子:

    創建表 A,然后刪除。

    CREATETABLE A(C INT);

    DROPTABLE A;

    7.1.22 DROP TRIGGER
    DROP TRIGGER <trigger_name>

    描述:

    DROP TRIGGER 語句刪除一個觸發器。

    只有在觸發器所作用表上有 TRIGGER 權限的數據庫用戶才允許刪除該表的觸發器。

    例子:

    對于這個例子,你需要先創建一個名為 test_trigger 的觸發器,如下:

    CREATETABLE TARGET ( A INT);

    CREATETABLE SAMPLE ( A INT);

    CREATE TRIGGER TEST_TRIGGER AFTERUPDATEON TARGET

    BEGIN

    INSERTINTO SAMPLE VALUES(3);

    END;

    現在你可以刪除觸發器:

    DROP TRIGGER TEST_TRIGGER;

    7.1.23 DROP VIEW
    語法:

    DROP VIEW [<schema_name>.]<view_name> [<drop_option>]

    語法元素:

    <drop_option> ::= CASCADE | RESTRICT

    Default = RESTRICT

    級聯刪除將刪除對象以及其依賴對象。當未指定 CASCADE 可選項,將執行非級聯刪除操作,不會刪除依賴對象,而是使依賴對象 (VIEW, PROCEDURE) 無效。

    無效的對象可以重新驗證當一個對象有同樣的集合,并且已創建了對象名。對象 ID,集合名以及對象名為重新驗證依賴對象而保留。

    有限制的刪除操作將刪除對象當其沒有依賴對象時。如果存在依賴對象,將拋出錯誤。

    描述:

    DROP VIEW 語句刪除視圖。

    例子:

    表 t 已創建,然后選擇表 a 中的所有數據創建視圖 v:

    CREATETABLE t (a INT);

    CREATEVIEW v ASSELECT * FROM t;

    刪除視圖 v:

    DROPVIEW v;

    7.1.24 RENAME COLUMN
    語法:

    RENAME COLUMN <table_name>.<old_column_name> TO <new_column_name>

    描述:

    RENAME COLUMN 語句修改列名:

    例子:

    創建表 B:

    CREATETABLE B (A INTPRIMARYKEY, B INT);

    顯示表 B 中列名的列表:

    SELECT COLUMN_NAME, POSITION FROM TABLE_COLUMNS WHERE SCHEMA_NAME =CURRENT_SCHEMA AND TABLE_NAME = 'B’ORDERBYPOSITION;

    列 A 重名為 C:

    RENAMECOLUMN B.A TO C;

    7.1.25 RENAME INDEX
    語法:

    RENAME INDEX <old_index_name> TO <new_index_name>

    描述:

    RENAME INDEX 語句重命名索引名。

    例子:

    表 B 已創建,然后索引 idx 建立在表 B 的列 B:

    CREATETABLE B (A INTPRIMARYKEY, B INT);

    CREATEINDEX idx on B(B);

    顯示表 B 的索引名列表:

    SELECT INDEX_NAME FROM INDEXES WHERE SCHEMA_NAME = CURRENT_SCHEMA AND TABLE_NAME=‘B’;

    索引 idx 重名為 new_idx:

    RENAMEINDEX idx TO new_idx;

    7.1.26 RENAME TABLE
    語法:

    RENAME TABLE <old_table_name> TO <new_table_name>

    描述:

    RENAME TABLE 語句在同一個Schema下,將表名修改為 new_table_name。

    例子:

    在當前集合創建表 A:

    CREATETABLE A (A INTPRIMARYKEY, B INT);

    顯示當前集合下表名的列表:

    SELECT TABLE_NAME FROM TABLES WHERE SCHEMA_NAME = CURRENT_SCHEMA;

    表 A 重命名為 B:

    RENAMETABLE A TO B;

    SCHEMA mySchema 已創建,然后創建表 mySchema.A:

    CREATESCHEMA mySchema;

    CREATETABLE mySchema.A (A INTPRIMARYKEY, B INT);

    顯示模式 mySchema 下表名的列表:

    SELECT TABLE_NAME FROM TABLES WHERE SCHEMA_NAME = ‘MYSCHEMA’;

    表 mySchema.A 重命名為 B:

    RENAMETABLE mySchema.A TO B;注:修改后B還是在mySchema里

    7.1.27 ALTER TABLE ALTER TYPE
    語法:

    <table_conversion_clause> ::= [ALTER TYPE] { ROW [THREADS <number_of_threads>] | COLUMN [THREADS <number_of_threads> [BATCH <batch_size>]] }

    語法元素:

    <number_of_threads> ::= <numeric_literal>

    指定進行表轉換的并行線程數。線程數目的最佳值應設置為可用的 CPU 內核的數量。

    <batch_size> ::= <numeric_literal>

    指定批插入的行數,默認值為最佳值 2,000,000。插入表操作在每個<batch_size>記錄插入后立即提交,可以減少內存消耗。 BATCH 可選項只可以在表 從行轉換為列時使用。然而,大于 2,000,000的批大小可能導致高內存消耗,因此不建議修改該值。

    描述:

    通過復制現有的表中的列和數據,可以從現有的表創建一個不同存儲類型的新表。該命令用來把表從行轉換為列或從列轉換為行。如果源表是行式存儲,則新建的表為列式存儲。

    配置參數:

    用于表轉換的默認線程數在 indexserver.ini 的[sql]部分定義, table_conversion_parallelism =<numeric_literal> (初始值為 8)。

    例子:

    對于這個例子,你需要先創建欲進行轉換的表:

    CREATECOLUMNTABLE col_to_row (col1 INT, col2 INT)

    CREATEROWTABLE row_to_col (col1 INT, col2 INT)

    表 col_to_row 將以列式存儲方式創建,表 row_to_col 則為行式存儲。

    現在你可以將表 col_to_row 的存儲類型從列轉為行:

    ALTERTABLE col_to_row ALTERTYPEROW

    你也可以將表 row_to_col 的存儲類型從行轉為列:

    ALTERTABLE row_to_col ALTERTYPECOLUMN

    為了使用批量轉換模式,你需要在語句結尾處添加批選項:

    ALTERTABLE row_to_col ALTERTYPECOLUMN BATCH 10000

    7.1.28 TRUNCATE TABLE
    語法:

    TRUNCATE TABLE <table_name>

    描述:

    刪除表中所有記錄。當從表中刪除所有數據時, TRUNCATE 比 DELETE FROM 快,但是 TRUNCATE無法回滾。要回滾刪除的記錄,應使用"DELETE FROM <table_name>"。

    HISTORY 表可以通過執行該語句像正常表一樣刪除。歷史表的所有部分(main, delta, history main and history delta)將被刪除并且內容會丟失。

    7.2數據操縱語句
    7.2.1 DELETE
    語法:

    DELETE [HISTORY] FROM [<schema_name>.]<table_name> [WHERE ]

    ::= OR | AND | NOT | ( )|

    關于謂詞的詳情,請參閱 Predicates。

    描述:

    DELETE 語句當滿足條件時,從表中刪除所有記錄。如果省略了 WHERE 子句,將刪除表中所有記錄。

    DELETE HISTORY

    DELETE HISTORY 將標記選中的歷史表中歷史記錄進行刪除。這表示執行完該語句后,引用已刪除記錄的時間旅行查詢語句可能仍然可以查看這些數據。 為了在物理上刪除這些記錄,必須執行下面的語句:

    ALTER SYSTEM RECLAIM VERSION SPACE; MERGE HISTORY DELTA of <table_name>;

    請注意:在某些情況中,即使執行了上述兩條語句,仍無法從物理上刪除。

    欲檢查記錄是否已從物理上刪除,以下語句會有幫助:

    SELECT * FROM <table_name> WHERE WITH PARAMETERS (‘REQUEST_FLAGS’=(‘ALLCOMMITTED’,‘HISTORYONLY’));

    注意: “WITH PARAMETERS (‘REQUEST_FLAGS’= (‘ALLCOMMITTED’,‘HISTORYONLY’))”子句可能只適用于驗證 DELETE HISTORY 語句的執行結果。

    例子:

    CREATETABLE T (KEYINTPRIMARYKEY, VAL INT);

    INSERTINTO T VALUES (1, 1);

    INSERTINTO T VALUES (2, 2);

    INSERTINTO T VALUES (3, 3);

    在下面的例子中,將刪除一條記錄:

    DELETEFROM T WHEREKEY = 1;

    7.2.2 EXPLAIN PLAN
    語法:

    EXPLAIN PLAN [SET STATEMENT_NAME = <statement_name>] FOR <sql_subquery>

    語法元素:

    <statement_name> ::= string literal used to identify the name of a specific executi on plan in the output table for a given SQL statement.

    如果未指定 SET STATEMENT_NAME,則將設為 NULL。

    描述:

    EXPLAIN PLAN 語句用來評估 SAP HANA 數據庫遵循的執行 SQL 語句的執行計劃。評估的結果存在視圖 EXPLAIN_PLAN_TABLE,以便稍后的用戶檢查。

    SQL 語句必須是數據操縱語句,因此Schema定義語句不能在 EXPLAIN STATEMENT 中使用。

    你可以從 EXPLAIN_PLAN_TABLE 視圖中得到 SQL 計劃,該視圖為所有用戶共享。這里是從視圖讀取 SQL 計劃的例子:

    SELECT * FROM EXPLAIN_PLAN_TABLE;

    EXPLAIN_PLAN_TABLE 視圖中的列:表 1:列名和描述

    EXPLAIN_PLAN_TABLE 視圖中的 OPERATOR_NAME 列。 表 2: OPERATOR_NAME 列顯示的列式引擎操作符列表:

    COLUMN SEARCH 為列式引擎操作符起始位置標記, ROW SEARCH 為行式引擎操作符起始位置標記。在以下的例子中, COLUMN SEARCH (ID 10)生成的中間結果被 ROW SEARCH (ID 7)使用, ROWSEARCH (ID 7) 被另一個 COLUMN SEARCH (ID 1)使用。位于 COLUMN SEARCH (ID 10) 最底層的操作符解釋了 COLUMN SEARCH (ID 10) 是如何執行的。 ROW SEARCH (ID 7) 和 COLUMN SEARCH (ID 10) 之間的操作符說明了 ROW SEARCH (ID 7) 如何處理由 COLUMN SEARCH (ID 10) 生成的中間結果。位于COLUMN SEARCH (ID 1) 和 ROW SEARCH (ID 7)頂層的操作符解釋了頂層 COLUMN SEARCH (ID 1) 是如何處理由 ROW SEARCH (ID 7)生成的中間結果。

    SQL 計劃解釋例子。

    該語句來自語 TPC-H 基準。例子中的所有表都是行式存儲。

    setschema hana_tpch;

    DELETEFROM explain_plan_table WHERE statement_name = ‘TPC-H Q10’;

    EXPLAINPLANSET STATEMENT_NAME = 'TPC-H Q10’FOR

    SELECT TOP 20 c_custkey,c_name,SUM(l_extendedprice * (1 - l_discount)) AS revenue,c_acctbal,n_name,c_address,c_phone,c_commentFROMcustomer,orders ,lineitem,nationWHEREc_custkey = o_custkeyAND l_orderkey = o_orderkeyAND o_orderdate >= '1993-10-01'AND o_orderdate < ADD_MONTHS('1993-10-01',3)AND l_returnflag = 'R'AND c_nationkey = n_nationkeyGROUPBYc_custkey,c_name,c_acctbal ,c_phone,n_name,c_address ,c_commentORDERBY revenue DESC;

    SELECT operator_name, operator_details , table_name FROM explain_plan_table WHERE statement_name = ‘TPC-H Q10’;

    以下是對這個查詢語句的計劃解釋:

    7.2.3 INSERT
    語法:

    INSERT INTO [ <schema_name>. ]<table_name> [ <column_list_clause> ] { <value_list_clause> | }

    語法元素:

    <column_list_clause> ::= ( <column_name>, … )

    <value_list_clause> ::= VALUES ( , … )

    描述:

    INSERT 語句添加一條到表中。返回記錄的子查詢可以用來插入表中。如果子查詢沒有返回任何結果,數據庫將不會插入任何記錄。可以使用 INSERT 語句指定列的列表。不在列表中的列將顯示默認值。如果省略了列的列表,數據庫插入所有記錄到表中。

    例子:

    CREATETABLE T (KEYINTPRIMARYKEY, VAL1 INT, VAL2 NVARCHAR(20));

    在以下的例子中,你可以插入值:

    INSERTINTO T VALUES (1, 1, ‘The first’);

    你可以將值插入到指定的列:

    INSERTINTO T (KEY) VALUES (2);

    你也可以使用子查詢:

    INSERTINTO T SELECT 3, 3, 'The third’FROM DUMMY;

    7.2.4 LOAD
    語法:

    LOAD <table_name> {DELTA | ALL | (<column_name>, …)}

    描述:

    LOAD 語句明確地加載列式(注:Load只支持列式存儲,對于行式存儲不能使用)存儲表的數據至內存中,而非第一次訪問時加載。

    DELTA

    使用 DELTA,列式表的一部分將加載至內存。由于列式存儲對于讀操作做了優化和壓縮,增量用來優化插入或更新。 所有的插入被傳遞給一個增量。

    ALL

    主要的和增量的列存儲表中所有數據加載到內存中。

    例子:

    以下的例子加載整張表 a_table 至內存中。

    LOAD a_table all;

    以下的例子加載列 a_column 和表 a_table 列 another_column 至內存中。

    LOAD a_table (a_column,another_column);

    表加載狀態可以查詢:

    select loaded from m_cs_tables where table_name = ‘<table_name>’

    7.2.5 MERGE DELTA
    語法:

    MERGE [HISTORY] DELTA OF [<schema_name>.]<table_name> [PART n] [WITH PARAMETERS (<parameter_key_value>, …)]

    語法元素:

    WITH PARAMETERS (<parameter_list>):

    <parameter_list> ::= ,<parameter_list>

    ::= <parameter_name> = <parameter_setting>

    <parameter_name> ::= ‘SMART_MERGE’ | ‘MEMORY_MERGE’

    <parameter_setting> ::= ‘ON’ | ‘OFF’

    當前參數: ‘SMART_MERGE’ = ‘ON’ | ‘OFF’。當 SMART_MERGE 為 ON,數據庫執行智能合并,這代表數據庫基于 Indexserver 配置中定義的合并條件來決定是否合并。‘MEMORY_MERGE’ = ‘ON’ | ‘OFF’ 數據庫只合并內存中表的增量部分,不會被持久化。

    描述:

    使用 DELTA,列式表的一部分將加載至內存。由于列式存儲對于讀操作做了優化和壓縮,增量用來優化插入或更新。 所有的插入被傳遞至一個增量部分。

    HISTORY 可以指定合并歷史表增量部分到臨時表的主要歷史部分。

    PART-可以指定合并歷史表增量部分到臨時表的主要歷史部分,該表已分區。

    例子:

    MERGEDELTAOF A;

    Merges the column store table delta part to its main part.

    MERGEDELTAOF A WITH PARAMETERS(‘SMART_MERGE’ = ‘ON’);

    Smart merges the column store table delta part to its main part.

    MERGEDELTAOF A WITH PARAMETERS(‘SMART_MERGE’ = ‘ON’, ‘MEMORY_MERGE’ = ‘ON’);

    Smart merges the column store table delta part to its main part non-persistent, in memory only.

    MERGEDELTAOF A PART 1;

    Merge the delta of partition no. 1 of table with name “A” to main part of partion no. 1.

    MERGEHISTORYDELTAOF A;

    Merge the history delta part of table with name “A” into its history main part.

    MERGEHISTORYDELTAOF A PART 1;

    Merges the column store table delta part of the history of table with name “A” to its history main part.

    7.2.6 REPLACE | UPSERT
    語法:

    UPSERT [ <schema_name>. ]<table_name> [ <column_list_clause> ] { <value_list_clause> [ WHERE | WITH PRIMARY KEY ] | }

    REPLACE [ <schema_name>. ]<table_name> [ <column_list_clause> ] { <value_list_clause> [ WHERE | WITH PRIMARY KEY ] | }

    語法元素:

    <column_list_clause> ::= ( <column_name>, … )

    <value_list_clause> ::= VALUES ( , … )

    ::= OR | AND | NOT | ( )|

    有關謂詞的詳情,請參閱 Predicates。

    描述:

    沒有子查詢的 UPSERT 或者 REPLACE 語句與 UPDATE 相似。唯一的區別是當 WHERE 子句為假(或沒有Where子句)時,該語句像 INSERT 一樣添加一條新的記錄到表中。

    對于表有 PRIMARY KEY 的情況,主鍵列必須包含在列的列表中。沒有默認設定,由 NOT NULL 定義的列也必須包含在列的列表中。

    有子查詢的 UPSERT 或者 REPLACE 語句與 INSERT 一樣,除了如果表中舊記錄與主鍵的新記錄值相同,則舊記錄將被子查詢返回的記錄所修改。除非表有一個主鍵,否則就變得等同于 INSERT(即如果表沒有設定主鍵,則為INSERT?),因為沒有使用索引來判斷新記錄是否與舊記錄重復。

    有’WITH PRIMARY KEY’的 UPSERT 或 REPLACE 語句與有子查詢的語句相同。其在 PRIMARY KEY 基礎上工作。

    例子:

    CREATETABLE T (KEYINTPRIMARYKEY, VAL INT);

    你可以插入一條新值:

    UPSERT T VALUES (1, 1);–沒有Where與子查詢,直接插入

    如果 WHERE 子句中的條件為假,將插入一條新值:

    UPSERT T VALUES (2, 2) WHEREKEY = 2; --沒有就插入

    你可以更新列"VAL"的第一條記錄

    UPSERT T VALUES (1, 9) WHEREKEY = 1;–有就更新

    或者你可以使用"WITH PRIMARY KEY" 關鍵字

    UPSERT T VALUES (1, 8) WITHPRIMARYKEY;–根據主鍵進行更新,如果不存在,則插入

    你可以使用子查詢插入值:

    UPSERT T SELECTKEY + 2, VAL FROM T;–將子查詢的結果插入,如果存在,則更新

    UPSERT T VALUES (5, 1) WITHPRIMARYKEY;–根據主鍵查詢時不存在,則插入

    UPSERT T SELECT 5,3 from dummy;–存在,則更新

    7.2.7 SELECT
    語法:

    <select_statement> ::= [ <for_update> | <time_travel> ]| ( ) [ <for_update> | <time_travel> ]

    ::= <select_clause> <from_clause> [<where_clause>] [<group_by_clause>] [<having_clause>] [{<set_operator> , … }] [<order_by_clause>] []

    語法元素:

    SELECT 子句:

    SELECT 子句指定要返回給用戶或外部的 select 子句一個輸出,如果存在的話。

    <select_clause> ::= SELECT [TOP ] [ ALL | DISTINCT ] <select_list>

    <select_list> ::= <select_item>[, …]

    <select_item> ::= [<table_name>.] *| [ AS <column_alias> ]

    TOP n:TOP n 用來返回 SQL 語句的前 n 條記錄。

    DISTINCT 和 ALL:可以使用 DISTINCT 返回重復的記錄,每一組選擇只有一個副本。使用 ALL 返回選擇的所有記錄,包括所有重復記錄的拷貝。默認值為 ALL。

    Select_list:select_list 允許用戶定義他們想要從表中選擇的列。

    *:可以從 FROM 子句中列出的表或視圖中選擇所有列。如果集合名和表名或者表名帶有星號(),其用來限制結果集至指定的表。

    column_alias:column_alias 可以用于簡單地表示表達式。

    FROM:FROM 子句中指定輸入值,如表、視圖、以及將在 SELECT 語句中使用的子查詢。

    <from_clause> ::= FROM {

    , … }

    ::= [ [AS] ] | [ [AS] ] |

    <joined_table> ::=

    [<join_type>] JOIN
    ON |
    CROSS JOIN
    | <joined_table>

    <join_type> ::= INNER | { LEFT | RIGHT | FULL } [OUTER]

    table alias:表別名可以用來簡單地表示表或者子查詢。

    join_type 定義了將執行的聯接類型, LEFT 表示左外聯接, RIGHT 表示右外聯接, FULL 表示全外聯接。執行聯接操作時, OUT 可能或者可能不使用。

    ON :ON 子句定義聯接謂詞。

    CROSS JOIN:CROSS 表示執行交叉聯接,交叉聯接生成兩表的交叉積結果。

    WHERE 子句

    WHERE 子句用來指定 FROM 子句輸入的謂詞, 使用戶可以檢索所需的記錄。

    <where_clause> ::= WHERE

    ::= OR | AND | NOT | ( ) |

    ::= <comparison_predicate> | <range_preciate> | <in_predicate> | <exist_predicate> | <like_predicate> | <null_predicate>

    <comparison_predicate> ::= { = | != | <> | > | < | >= | <= } [ ANY | SOME | ALL ] ({<expression_list> | })

    <range_predicate> ::= [NOT] BETWEEN AND

    <in_predicate> ::= [NOT] IN ( { <expression_list> | } )

    <exist_predicate> ::= [NOT] EXISTS ( )

    <like_predicate> ::= [NOT] LIKE [ESCAPE ]

    <null_predicate> ::= IS [NOT] NULL

    <expression_list> ::= {, … }

    GROUP BY 子句

    <group_by_clause> ::=GROUP BY { { , … } | <grouping_set> }

    <grouping_set> ::= { GROUPING SETS | ROLLUP | CUBE }[BEST ] [LIMIT [OFFSET ] ] [WITH SUBTOTAL] [WITH BALANCE] [WITH TOTAL]

    [TEXT_FILTER [FILL UP [SORT MATCHES TO TOP]]] [STRUCTURED RESULT [WITH OVERVIEW] [PREFIX <string_literal>] | MULTIPLE RESULTSETS] ( <grouping_expression_list> )

    <grouping_expression_list> ::= { <grouping_expression>, … }

    <grouping_expression> ::=| ( , … ) | ( ( , … ) <order_by_clause> )

    GROUP BY 用來對基于指定列值選定的行進行分組。

    GROUPING SETS

    在一條語句中, 生成多個特定數據分組結果。如果沒有設置例如 best 和 limit 的可選項,結果將和 UNION ALL 每個指定組的聚合值相同。例如:

    "select col1, col2, col3, count() from t groupbygrouping sets ( (col1, col2), (col1, col3) )“與” select col1, col2, NULL, count() from t groupby col1, col2 unionallselect col1, NULL, col3,count(*) from t groupby col1, col3"相同。在 grouping-sets 語句中,

    每個(col1, col2) 和(col1, col3)定義了分組。

    ROLLUP

    在一條語句中,生成多級聚合結果。例如, "rollup (col1, col2,col3)"與有額外 聚合,但沒有分組的"grouping sets ( (col1, col2, col3), (col1, col2), (col1) )"結果相同。因此,結果集所包含的分組的數目是 ROLLUP 列表中的列加上一個最后聚合的數目,如果沒有額外的選項。

    CUBE

    在一條語句中,生成多級聚合的結果。例如, “cube (col1, col2,col3)” 與有額外聚合,但沒有分組的"grouping sets ( (col1, col2, col3), (col1, col2), (col1, col3), (col2, col3), (col1), (col2),(col3) )"結果相同。因此,結果集所包含分組的數目與所有可能排列在 CUBE 列表的列加上一個最后聚合的數目是相同的,如果沒有附加的選項。

    BEST n

    返回每個以行聚合數降序排列的分組集中前 n 個分組集(返回的是某個分組里的所有記錄,而不是某幾條)。 n 可以是任意零,正數或負數。當 n 為零時,作用和沒有 BEST 選項一樣。當 n 為負數表示以升序排序。

    LIMIT n1 [OFFSET n2]

    返回每個分組集中(取每個組中的部分行)第一個 N1 分組記錄跳過 N2 個后的結果。

    WITH SUBTOTAL

    返回每個分組集中由 OFFSET 或者 LIMIT 控制的返回結果的分類匯總。除非設置了 OFFSET 和LIMIT,返回值將和 WITH TOTAL 相同。

    WITH BALANCE

    返回每個分組集中 OFFSET 或者 LIMIT 沒有返回的其余結果值。

    WITH TOTAL

    返回每個分組集中額外的合計總值行。 OFFSET 和 LIMIT 選項不能修改該值。

    TEXT_FILTER

    執行文本過濾或者用高亮分組列, 為單引號字符串,語法如下:

    ::= ‘[]{, …}’

    ::= + | - | NOT

    ::= |

    ::= !! Unicode letters or digits

    ::= !! double-quoted string that does not contain double quotations inside

    ::= [<prefix_subsequent>]

    <prefix_subsequent> ::= + | - | NOT | AND | AND NOT | OR

    定義的過濾是由與邏輯操作符 AND, OR 和 NOT 連接的標記/詞組或者短語組成。 一個標記相匹配的字符串,其中包含對應不區分大小寫的單詞, ‘ab’ 匹配 ‘ab cd’ 和 ‘cd Ab’ ,但不匹配’abcd’。一個標記可以包含通配字符’,匹配任何字符串, ’匹配任意字母。但是在詞組內, ’和’不是通配符。邏輯運算符 AND, OR 和 NOT 可以與標記,詞組一起使用。由于 OR 是默認操作符, ‘ab cd’ 和’ab OR cd’意義一樣。注意,邏輯運算符應該大寫。作為一種邏輯運算符,前綴’+’ 和 '-'各自表示包含(AND) 和不包含 (AND NOT)。例如, ‘ab -cd’ 和 'ab AND NOT cd’意義相同。如果沒有 FILL UP 選項,只返回含有匹配值的分組記錄。 需要注意的是一個過濾器僅被運用到每個分組集的第一個分組列。

    FILL UP

    不僅返回匹配的分組記錄,也包含不匹配的記錄。 text_filter 函數對于識別哪一個匹配是很有用的。參閱下面的’Related Functions’。

    SORT MATCHES TO TOP

    返回匹配值位于非匹配值前的分組集。該選項不能和 SUBTOTAL, BALANCE 和 TOTAL 一起使用。

    STRUCTURED RESULT

    結果作為臨時表返回。 對于每一個分組集創建一個臨時表,如果設置 WITH OVERVIEW 選項,將為分組集的總覽創建額外的臨時表,該臨時表的名字由 PREFIX 選項定義。

    WITH OVERVIEW

    將總覽返回至單獨的額外一張表中。

    PREFIX 值

    使用前綴命名臨時表。必須以"#“開始,代表是臨時表。如果省略,默認前綴為”#GN", 然后,連接該前綴值和一個非負整數,用作臨時表的名稱,比如"#GN0", “#GN1” 和 “#GN2”。

    MULTIPLE RESULTSETS

    返回多個結果集中的結果。

    相關函數

    grouping_id ( <grouping_column1, …, grouping_columnn> )函數返回一個整數,判斷每個分組記錄屬于哪個分組集。 text_filter ( <grouping_column> ) 函數與 TEXT_FILTER, FILL UP, 和 SORT MATCHES TO TOP 一起使用,顯示匹配值或者 NULL。當指定了 FILL UP 選項時,未匹配值顯示為 NULL。

    返回格式

    如果 STRUCTURED RESULT 和 MULTIPLE RESULTSETS 都沒有設置,返回所有分組集 的聯合,以及對于沒有包含在指定分組集中的屬性填充的 NULL 值。使用 STRUCTURED RESULT,額外的創建臨時表,在同一會話中用"SELECT * FROM

    "可以查詢。表名遵循的格式:

    0:如果定義了 WITH OVERVIEW,該表將包含總覽。

    n: 由 BEST 參數重新排序的第 n 個分組集。

    使用 MULTIPLE RESULTSETS,將返回多個結果集。每個分組集的分組記錄都在單個結果集中。

    HAVING 子句:

    HAVING 子句用于選擇滿足謂詞的特定分組。如果省略了該子句,將選出所有分組。

    <having_clause> ::= HAVING

    SET OPERATORS

    SET OPERATORS 使多個 SELECT 語句相結合,并只返回一個結果集。

    <set_operator> ::= UNION [ ALL | DISTINCT ] | INTERSECT [DISTINCT] | EXCEPT [DISTINCT]

    UNION ALL

    選擇所有 select 語句中的所有(并集)記錄。重復記錄將不會刪除。

    UNION [DISTINCT]

    選擇所有 SELECT 語句中的唯一記錄,在不同的 SELECT 語句中刪除重復記錄。 UNION 和 UNION DISTINCT 作用相同。

    INTERSECT [DISTINCT]

    選擇所有 SELECT 語句中共有(交集)的唯一記錄。

    EXCEPT [DISTINCT]

    在位于后面的 SELECT 語句刪除(差集)重復記錄后,返回第一個 SELECT 語句中所有唯一的記錄。

    ORDER BY 子句

    <order_by_clause> ::= ORDER BY { <order_by_expression>, … }

    <order_by_expression> ::= [ ASC | DESC ]| [ ASC | DESC]

    ::=

    ORDER BY 子句用于根據表達式或者位置對記錄排序。位置表示選擇列表的索引。對"select col1,col2 from t order by 2", 2 表示 col2 在選擇列表中使用的第二個表達式。 ASC 用于按升序排列記錄,DESC 用于按降序排列記錄。默認值為 ASC。

    LIMIT

    LIMIT 關鍵字定義輸出的記錄數量。

    ::= LIMIT [ OFFSET ]

    LIMIT n1 [OFFSET n2]:返回跳過 n2 條記錄后的最先 n1 條記錄。

    FOR UPDATE

    FOR UPDATE 關鍵字鎖定記錄,以便其他用戶無法鎖定或修改記錄,直到本次事務結束。

    <for_update> ::= FOR UPDATE

    TIME TRAVEL

    該關鍵字與時間旅行有關,用于語句級別時間旅行回到 commit_id 或者時間指定的快照。

    <time_travel> ::= AS OF { { COMMIT ID <commit_id> } | { UTCTIMESTAMP }}時間旅行只對歷史列表適用。 <commit_id>在每次提交后可以從 m_history_index_last_commit_id 獲得,其相關的可以從 sys.m_transaction_history 讀取。

    createhistorycolumntable x ( a int, b int ); // after turnning off auto commit

    insertinto x values (1,1);

    commit;

    select last_commit_id from m_history_index_last_commit_id where session_id = current_connection;// e.g., 10

    insertinto x values (2,2);

    commit;

    select last_commit_id from m_history_index_last_commit_id where session_id = current_connection; // e.g., 20

    deletefrom x;

    commit;

    select last_commit_id from m_history_index_last_commit_id where session_id = current_connection; // e.g., 30

    select * from x asofcommit id 30; // return nothing

    select * from x asofcommit id 20; // return two records (1,1) and (2,2)

    select * from x asofcommit id 10; // return one record (1,1)

    select commit_time from sys.transaction_history where commit_id = 10; // e.g., ‘2012-01-01 01:11:11’

    select commit_time from sys.transaction_history where commit_id = 20; // e.g., ‘2012-01-01 02:22:22’

    select commit_time from sys.transaction_history where commit_id = 30; // e.g., ‘2012-01-01 03:33:33’

    select * from x asof utctimestamp ‘2012-01-02 02:00:00’; // return one record (1,1)

    select * from x asof utctimestamp ‘2012-01-03 03:00:00’; // return two records (1,1) and (2,2)

    select * from x asof utctimestamp ‘2012-01-04 04:00:00’; // return nothing

    例子:

    表 t1:

    droptable t1;

    createcolumntable t1 ( id intprimarykey, customer varchar(5), yearint, product varchar(5), sales int );

    insertinto t1 values(1, ‘C1’, 2009, ‘P1’, 100);

    insertinto t1 values(2, ‘C1’, 2009, ‘P2’, 200);

    insertinto t1 values(3, ‘C1’, 2010, ‘P1’, 50);

    insertinto t1 values(4, ‘C1’, 2010, ‘P2’, 150);

    insertinto t1 values(5, ‘C2’, 2009, ‘P1’, 200);

    insertinto t1 values(6, ‘C2’, 2009, ‘P2’, 300);

    insertinto t1 values(7, ‘C2’, 2010, ‘P1’, 100);

    insertinto t1 values(8, ‘C2’, 2010, ‘P2’, 150);

    以下的 GROUPING SETS 語句和第二個 group-by 查詢相等。 需要注意的是,兩組在第一個查詢的分組集內指定的各組在第二個查詢。

    select customer, year, product, sum(sales) from t1 groupbyGROUPING SETS((customer, year),(customer, product));

    select customer, year, NULL, sum(sales) from t1 groupby customer, year

    unionall

    select customer, NULL, product, sum(sales) from t1 groupby customer, product;

    注:Union時,兩個Select語句的字段個數,對應字段的類型要相同。BW中的MultiCube是將多個InfoProvider的記錄插入到MultiCube所對應的物理表中,這一過程并不是通過Union SQL語句來完成的,而是一個個將InfoProvider的數據插入到MultiCube中,所以來自InfoProvider的字段個數可以不同,只是在報表展示時,通過 Group進行了合并

    ROLLUP 和 CUBE 經常使用的分組集的簡明表示。 下面的 ROLLUP 查詢與第二個 group-by 查詢相等。

    select customer, year, sum(sales) from t1 groupby ROLLUP(customer, year);

    select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer))

    unionall

    selectNULL, NULL, sum(sales) from t1;

    selectNULL, NULL, sum(sales) from t1;

    select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer))

    select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer),())

    以下的 CUBE 查詢與第二個 group-by 查詢相等。

    select customer, year, sum(sales) from t1 groupby CUBE(customer, year);

    select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer),(year))

    unionall

    selectNULL, NULL, sum(sales) from t1;

    select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer),(year))

    select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer),(year),())

    BEST 1 指定以下查詢語句只能返回最上面的 1 個 best 組。在該個例子中,對于(customer, year)組存在 4 條記錄,而(product)組存在 2 條記錄,因此返回之前的 4 條記錄。對于 ‘BEST -1’ 而非 ‘BEST 1’,返回后 2 條記錄。

    select customer, year, product, sum(sales) from t1 groupbygrouping sets ((customer, year),(product));

    select customer, year, product, sum(sales) from t1 groupbygrouping sets BEST 1((customer, year),(product));

    select customer, year, product, sum(sales) from t1 groupbygrouping sets BEST 2((customer, year),(product));

    select customer, year, product, sum(sales) from t1 groupbygrouping sets BEST -1((customer, year),(product));

    LIMIT2 限制每組最大記錄數為 2。對于(customer, year) 組,存在 4 條記錄,只返回前 2 條記錄;(product)組的記錄條數為 2,因此返回所有結果。

    select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2((customer, year),(product));

    WITH SUBTOTAL 為每一組生成額外的一條記錄,顯示返回結果的分類匯總(沒有顯示出來的不會被統計,這與With Total是不一樣的,請參考后面的With Total)。這些記錄的匯總對customer, year, product 列返回 NULL,選擇列表中 sum(sales)的總和。

    select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2 WITH SUBTOTAL((customer, year),(product));

    WITH BALNACE 為每一組生成額外的一條記錄,顯示未返回結果的分類匯總(如果未返回結果行不存在,則以分類匯總行還是會顯示,只不過都是問號,而不是不顯示)。

    select customer, year, product, sum(sales) from t1 groupbygrouping sets WITH BALANCE((customer, year),(product));

    select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2 WITH BALANCE((customer, year),(product));

    select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 1 WITH BALANCE((customer, year),(product));

    WITH TOTAL為每一組生成額外的一條記錄,顯示所有分組記錄的匯總,不考慮該分組記錄是否返回(即沒有顯示在分組里的數據也會匯總起來,如下面的 300 + 500 <> 1250,因為使用了Limit限制了每組返回的條數,但那些未顯示出來的數據也會被一起統計,這與 With SubTotal不一樣)。

    select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2 WITH TOTAL((customer, year),(product))

    TEXT_FILTER 允許用戶獲得有指定的的分組的第一列。以下查詢將搜索以’2’結尾的列:對于第一個分組集為 customers, 第二個為 products。只返回三條匹配的記錄。在 SELECT 列表中的 TEXT_FILTER 對于查看哪些值匹配是很有用的。

    select customer, year, product, sum(sales), text_filter(customer), text_filter(product) from t1

    groupbygrouping sets TEXT_FILTER ‘*2’((customer, year),(product));–只是去搜索每個分組里里的第一列,如這里的customer與product,但不搜索Year列,因為不是分組中的首列

    FILL UP 用于返回含有的匹配和不匹配的記錄。 因此,下面的查詢返回 6 條記錄,而先前的查詢返回 3 條。

    select customer, year, product, sum(sales), text_filter(customer), text_filter(product)

    from t1 groupbygrouping sets TEXT_FILTER ‘*2’ FILL UP ((customer, year),(product));

    SORT MATCHES TO TOP 用于提高匹配記錄。對于每個分組集,將對其分組記錄進行排序。

    select customer, year, product, sum(sales), text_filter(customer), text_filter(product)

    from t1 groupbygrouping sets TEXT_FILTER ‘*2’ FILL UP SORT MATCHES TO TOP((customer, year),(product));

    STRUCTURED RESULT 為每個分組集創建一張臨時表,并且可選地,為總覽表也創建一張。表"#GN1" 為 分組集(customer, year),表"#GN2" 為分組集(product)。注意,每張表只含有一列相關列。也就是說,表"#GN1"不包含列"product",而表"#GN2"不包含列"customer" and “year”。

    select customer, year, product, sum(sales) from t1 groupbygrouping sets STRUCTURED RESULT((customer, year),(product));

    select * from"#GN1";

    select * from"#GN2";

    WITH OVERVIEW 為總覽表創建臨時表"#GN0"。

    select customer, year, product, sum(sales)

    from t1 groupbygrouping sets structured result WITH OVERVIEW((customer, year),(product));

    select * from"#GN0";

    select * from"#GN1";

    select * from"#GN2";

    用戶可以通過使用 PREFIX 關鍵字修改臨時表的名字。注意,名字必須以臨時表的前綴’#'開始,下面與上面結果是一樣,只是臨時表名不一樣而已:

    select customer, year, product, sum(sales)

    from t1

    groupbygrouping sets STRUCTURED RESULT WITH OVERVIEW PREFIX ‘#MYTAB’((customer, year),(product));

    select * from"#MYTAB0";

    select * from"#MYTAB1";

    select * from"#MYTAB2";

    當相應的會話被關閉或用戶執行 drop 命令,臨時表被刪除。 臨時列表是顯示在m_temporary_tables。

    select * from m_temporary_tables;

    MULTIPLE RESULTSETS 返回多個結果的結果集。在 SAP HANA Studio 中,以下查詢將返回三個結果集:一個為總覽表,兩個為分組集。

    select customer, year, product, sum(sales) from t1 groupbygrouping sets MULTIPLE RESULTSETS((customer, year),(product));

    7.2.8 UNLOAD
    語法:

    UNLOAD <table_name>

    描述:

    UNLOAD 語句從內存中卸載列存儲表, 以釋放內存。表將在下次訪問時重新加載。

    例子:

    在下面的例子中,表 a_table 將從內存中卸載。

    UNLOAD a_table;

    卸載表的狀態可以通過以下語句查詢:

    select loaded from m_cs_tables where table_name = ‘t1’;

    7.2.9 UPDATE
    語法

    UPDATE [<schema_name>.]<table_name> [ AS <alias_name> ] <set_clause> [ WHERE ]

    <set_clause> ::= SET {<column_name> = },…

    關于表達式的詳情,請參見 Expressions。

    ::= OR | AND | NOT | ( ) |

    關于謂詞的詳情,請參見 Predicates。

    描述:

    UPDATE 語句修改滿足條件的表中記錄的值。如果 WHERE 子句中條件為真,將分配該列至表達式的結果中。如果省略了 WHERE 子句,語句將更新表中所有的記錄。

    例子:

    CREATETABLE T (KEYINTPRIMARYKEY, VAL INT);

    INSERTINTO T VALUES (1, 1);

    INSERTINTO T VALUES (2, 2);

    如果 WHERE 條件中的條件為真,記錄將被更新。

    UPDATE T SET VAL = VAL + 1 WHEREKEY = 1;

    如果省略了 WHERE 子句,將更新表中所有的記錄。

    UPDATE T SET VAL = KEY + 10;

    7.3系統管理語句
    7.3.1 SET SYSTEM LICENSE
    語法:

    SET SYSTEM LICENSE ‘’

    描述:

    安裝許可證密鑰的數據庫實例。許可證密鑰(="">) 將從許可證密鑰文件中復制黏貼。

    執行該命令需要系統權限 LICENSE ADMIN。

    例子:

    SETSYSTEM LICENSE '----- Begin SAP License -----

    SAPSYSTEM=HD1

    HARDWARE-KEY=K4150485960

    INSTNO=0110008649

    BEGIN=20110809

    EXPIRATION=20151231

    LKEY=…

    SWPRODUCTNAME=SAP-HANA

    SWPRODUCTLIMIT=2147483647

    SYSTEM-NR=00000000031047460’

    7.3.2 ALTER SYSTEM ALTER CONFIGURATION
    語法:

    ALTER CONFIGURATION (, [, <layer_name>]) SET | UNSET <parameter_key_value_list> [ WITH RECONFIGURE]

    語法元素:

    ::= <string_literal>

    行存儲引擎配置的情況下,文件名是’indexserver.ini’。 所使用的文件名必須是一個位于’DEFAULT’層的 ini 文件。如果選擇文件的文件名在所需的層不存在,該文件將用 SET 命令創建。

    ::= <string_literal>

    設置配置變化的目標層。 該參數可以是’SYSTEM’或’HOST’。 SYSTEM 層為客戶設置的推薦層。 HOST層應該一般僅可用于少量的配置,例如, daemon.ini 包含的參數。

    <layer_name> ::= <string_literal>

    如果上述的層設為’HOST’, layer_name 將用于設置目標 tenant 名或者目標主機名。例如,

    ‘selxeon12’ 為目標 ‘selxeon12’ 主機名。

    SET

    SET 命令更新鍵值,如果該鍵已存在,或者需要的話插入該鍵值。

    UNSET

    UNSET 命令刪除鍵及其關聯值。

    <parameter_key_value_list> ::={(<section_name>,<parameter_name>) = <parameter_value>},…

    指定要修改的 ini 文件的段、鍵和值語句如下:

    <section_name> ::= <string_literal>

    將要修改的參數段名:

    <parameter_name> ::= <string_literal>

    將要修改的參數名:

    <parameter_value> ::= <string_literal>

    將要修改的參數值。

    WITH RECONFIGURE

    當指定了 WITH RECONFIGURE,配置的修改將直接應用到 SAP HANA 數據庫實例。

    當未指定 WITH RECONFIGURE,新的配置將寫到文件 ini 中,然而,新的值將不會應用到當前運行系統中,只在數據庫下次的啟動時應用。這意味 ini 文件中的內容可能和 SAP HANA 數據庫使用的實際配置值存在不一致。

    描述:

    設置或刪除 ini 文件中的配置參數。 ini 文件配置用于 DEFAULT, SYSTEM, HOST 層。

    注意: DEFAULT 層配置不能使用此命令更改或刪除。

    以下為 ini 文件位置的例子:

    DEFAULT: /usr/sap//HDB/exe/config/indexserver.ini

    SYSTEM: /usr/sap//SYS/global/hdb/custom/config/indexserver.ini

    HOST: /usr/sap//HDB//indexserver.ini

    配置層的優先級: DEFAULT < SYSTEM < HOST。這表示 HOST 層具有最高優先級,跟著是 SYSTEM層,最后是 DEFAULT 層。最高優先級的配置將應用到運行環境中。 如果最高優先級的配置被刪除,具有下一個最高優先級的配置將被應用。

    系統和監控視圖:

    目前可供使用的 ini 文件在系統表 M_INIFILES 列出,并且當前配置在系統表 M_INIFILE_CONTENTS可見。

    例子:

    修改系統層配置的例子如下:

    ALTERSYSTEMALTER CONFIGURATION (‘filename’, ‘layer’) SET (‘section1’, ‘key1’) = ‘value1’, (‘section2’,‘key2’) = ‘value2’, … [WITH RECONFIGURE];

    ALTERSYSTEMALTER CONFIGURATION (‘filename’, ‘layer’, ‘layer_name’ ) UNSET (‘section1’, ‘key1’),(‘section2’), …[WITH RECONFIGURE];

    7.3.3 ALTER SYSTEM ALTER SESSION SET
    語法:

    ALTER SYSTEM ALTER SESSION <session_id> SET =

    語法元素:

    <session_id> ::= <unsigned_integer>

    應當設置變量的會話的 ID。

    ::= <string_literal>

    會話變量的鍵值,最大長度為 32 個字符。

    ::= <string_literal>

    會話變量的期望值,最大長度為 512 個字符。

    描述:

    使用該命令,你可以設置數據庫會話的會話變量:

    注意:有幾個只讀會話變量,你不能使用該命令修改值: APPLICATION, APPLICATIONUSER,TRACEPROFILE。

    會話變量可以使用 SESSION_CONTEXT 函數獲得,使用 ALTER SYSTEM ALTER SESSION UNSET 命令取消設置。

    例子:

    在以下的例子中,你在會話 200006 將變量’MY_VAR’ 設為 ‘dummy’:

    ALTERSYSTEMALTER SESSION 200006 SET’MY_VAR’= ‘dummy’;

    7.3.4 ALTER SYSTEM ALTER SESSION UNSET
    語法:

    ALTER SYSTEM ALTER SESSION <session_id> UNSET

    語法元素:

    <session_id> ::= <unsigned_integer>

    應當取消設置變量的會話 ID。

    ::= <string_literal>

    會話變量的鍵值, 最大長度為 32 個字符。

    描述:

    使用該命令,你可以取消設置數據庫會話的會話變量。

    會話可以通過 SESSION_CONTEXT 函數獲得。

    例子:

    獲得當前會話的會話變量:

    SELECT * FROM M_SESSION_CONTEXT WHERE CONNECTION_ID = CURRENT_CONNECTION

    從特定會話中刪除會話變量:

    ALTERSYSTEMALTER SESSION 200001 UNSET ‘MY_VAR’;

    7.3.5 ALTER SYSTEM CANCEL [WORK IN] SESSION
    語法

    ALTER SYSTEM CANCEL [WORK IN] SESSION <session_id>

    語法元素:

    <session_id> ::= <string_literal>

    所需會話的會話 ID。

    描述:

    通過指定會話 ID 取消當前正在運行的語句。取消的會話將在取消后回滾,執行中的語句將返回錯誤代碼 139(current operation cancelled by request and transaction rolled back)。

    例子:

    你可以使用下面的查詢來獲取當前的連接 ID 和它們執行的語句。

    SELECT C.CONNECTION_ID, PS.STATEMENT_STRING

    FROM M_CONNECTIONS C JOIN M_PREPARED_STATEMENTS PS

    ON C.CONNECTION_ID = PS.CONNECTION_ID AND C.CURRENT_STATEMENT_ID = PS.STATEMENT_ID

    WHERE C.CONNECTION_STATUS = 'RUNNING’AND C.CONNECTION_TYPE = ‘Remote’

    利用上文中的查詢語句獲得的連接 ID,你現在可以取消一條正在運行的查詢,語句如下:

    ALTERSYSTEM CANCEL SESSION ‘400037’;

    7.3.6 ALTER SYSTEM CLEAR SQL PLAN CACHE
    語法:

    ALTER SYSTEM CLEAR SQL PLAN CACHE

    描述:

    SQL PLAN CACHE 存儲之前執行的 SQL 語句生成的計劃, SAP HANA 數據庫使用該計劃緩存加速查詢語句的執行,如果同樣的 SQL 語句 再次執行。計劃緩存也收集關于計劃準備和執行的數據。

    你可以從以下的監控視圖中找到更多有關 SQL 緩存計劃的內容:

    M_SQL_PLAN_CACHE, M_SQL_PLAN_CACHE_OVERVIEW

    ALTER SYSTEM CLEAR SQL PLAN CACHE 語句刪除所有當前計劃緩存沒有執行的 SQL 計劃。該命令還可以從計劃緩存中刪除所有引用計數為 0 的計劃,并重置所有剩余計劃的統計數據。最后,該命令也重置監控視圖 M_SQL_PLAN_CACHE_OVERVIEW 的內容。

    例子:

    ALTERSYSTEM CLEAR SQLPLANCACHE

    7.3.7 ALTER SYSTEM CLEAR TRACES
    語法:

    ALTER SYSTEM CLEAR TRACES (<trace_type_list>)

    語法元素:

    <trace_type_list> ::= <trace_type> [,…]

    通過在逗號分隔的列表中加入多個 trace_types,您可以同時清除多個追蹤。

    <trace_type> ::= <string_literal>

    你可以通過設置 trace_type 為以下類型之一,有選擇地清除特定的追蹤文件:

    描述:

    你可以使用 ALTER SYSTEM CLEAR TRACES 清除追蹤文件中的追蹤內容。當您使用此命令所有開設了 SAP HANA 數據庫的跟蹤文件將被刪除或清除。在分布式系統中,該命令將清除所有主機上的所有跟蹤文件。

    使用此命令可以減少大跟蹤文件使用的磁盤空間,例如,當追蹤組件設為 INFO 或 DEBUG。

    你可以使用系統表 M_TRACEFILES, M_TRACEFILE_CONTENTS 各自監控追蹤文件及其內容。

    例子:

    要清除警告的跟蹤文件,使用下面的命令:

    ALTERSYSTEM CLEAR TRACES(‘ALERT’);

    要清除警告和客戶端跟蹤文件,使用下面的命令:

    ALTERSYSTEM CLEAR TRACES(‘ALERT’, ‘CLIENT’);

    7.3.8 ALTER SYSTEM DISCONNECT SESSION
    語法:

    ALTER SYSTEM DISCONNECT SESSION <session_id>

    語法元素:

    <session_id> ::= <string_literal>

    要斷開連接的會話 ID。

    描述:

    你使用 ALTER SYSTEM DISCONNECT SESSION 來斷開數據庫指定的會話。在斷開連接之前,與會話相關聯的所有正在運行的操作將被終止。

    例子:

    你使用如下的命令獲得空閑會話的會話 ID:

    SELECT CONNECTION_ID, IDLE_TIME FROM M_CONNECTIONS WHERE CONNECTION_STATUS = 'IDLE’AND CONNECTION_TYPE = 'Remote’ORDERBY IDLE_TIME DESC

    你使用如下命令斷開會話連接:

    ALTERSYSTEMDISCONNECT SESSION ‘400043’

    7.3.9 ALTER SYSTEM LOGGING
    語法:

    ALTER SYSTEM LOGGING <on_off>

    語法元素:

    <on_off> ::= ON | OFF

    描述:

    啟動或禁用日志。

    日志記錄被禁用后,任何日志條目將不會持久化。當完成一個保存點,只有數據區被寫入數據。

    這可能會導致損失已提交的事務,當 indexserver 在加載中時被終止。在終止的情況下,你必須截斷,并再次插入的所有數據。

    啟用日志記錄后,你必須執行一個保存點,以確保所有的數據都保存,并且你必須執行數據備份,否則你將不能恢復這些數據。

    只在初次加載時使用該命令!

    你可以使用 ALTER TABLE … ENABLE/DISABLE DELTA LOG 為單個列表完成操作。

    7.3.10 ALTER SYSTEM RECLAIM DATAVOLUME
    語法:

    ALTER SYSTEM RECLAIM DATAVOLUME [SPACE] [<host_port>] <percentage_of_overload_size>

    <shrink_mode>

    語法元素:

    <host_port> ::= ‘host_name:port_number’

    指定服務器在持久層應減少的大小:

    <percentage_of_overload_size> ::= <int_const>

    指定過載的數據量應減少的百分比。

    <shrink_mode> ::= DEFRAGMENT | SPARSIFY

    指定持續層減少大小的策略,默認值為 DEFRAGEMENT。請注意, SPARSIFY 尚未支持,并保留以備將來使用

    描述:

    該命令應在持久層中未使用的空間釋放時使用。 它減少數據量到過載量的 N%; 它的工作原理就像一個硬盤進行碎片整理,散落在頁面的數據將被移動到數據量的前端和數據量尾端的自由空間將被截斷。

    如果省略了<host_port> ,該語句將持久化地分配至所有服務器。

    例子:

    在下面的例子中,架構中的所有服務器持久層將進行碎片整理,并減少至過載尺寸的 120%。

    ALTERSYSTEM RECLAIM DATAVOLUME 120 DEFRAGMENT

    7.3.11 ALTER SYSTEM RECLAIM LOG
    語法:

    ALTER SYSTEM RECLAIM LOG

    描述:

    當數據庫中已經積累了大量的日志段時,你可以使用此命令,收回磁盤空間目前未使用的日志段。

    日志段的積累,可以以多種方式引起。 例如,當自動日志備份不可長期操作或日志保存點被阻塞很長時間, 當這樣的問題發生時,你只能在修復日志積累的根本原因后, 使用 ALTER SYSTEM CLAIM LOG 命令。

    例子:

    你回收目前未使用的日志段的磁盤空間,使用下面的命令:

    ALTERSYSTEM RECLAIM LOG

    7.3.12 ALTER SYSTEM RECLAIM VERSION SPACE
    語法:

    ALTER SYSTEM RECLAIM VERSION SPACE

    描述:

    執行 MVCC 版本垃圾回收來重用資源。

    7.3.13 ALTER SYSTEM RECONFIGURE SERVICE
    語法:

    ALTER SYSTEM RECONFIGURE SERVICE (<service_name>,,)

    語法元素:

    <service_name> ::= <string_literal>

    你希望重新配置的服務名稱。關于可用的服務類型的列表,請參閱監控視圖 M_SERVICE_TYPES。

    ::= <string_literal>

    ::=

    你將重新配置服務的主機和端口號。

    描述:

    你可以使用 ALTER SYSTEM RECONFIGURE SERVICE 通過應用當前配置參數,重新配置指定的服務。

    在使用沒有 RECONFIGURE 選項的 ALTER CONFIGURATION 修改多個配置參數使用該命令。參見ALTER SYSTEM ALTER CONFIGURATION。

    欲重新配置特定的服務,指定 和 的 值, 而<service_name> 留空。

    欲重新配置一種類型的所有服務,指定<service_name> 的值, 而 host> 和 留空。

    欲重新配置所有服務,所有參數留空。

    例子:

    你可以使用以下命令來重新配置 ld8520.sap.com 主機上所有使用端口號 30303 的服務:

    ALTERSYSTEM RECONFIGURE SERVICE (’’,‘ld8520.sap.com’,30303)

    你可以使用以下命令重新配置類型 indexserver 的所有服務:

    ALTERSYSTEM RECONFIGURE SERVICE (‘indexserver’,’’,0)

    參見 ALTER SYSTEM ALTER CONFIGURATION。

    7.3.14 ALTER SYSTEM REMOVE TRACES
    語法:

    ALTER SYSTEM REMOVE TRACES (, <trace_file_name_list>)

    <trace_file_name_list> ::= <trace_file>,…

    語法元素:

    :== <string_literal>

    將要刪除追蹤記錄的主機名。

    <trace_file_name_list> ::= <trace_file> [,…]

    你可以通過在逗號分隔的列表中添加多條 trace_file 記錄,同時刪除多條追蹤記錄。

    <trace_file> :== see table below.

    你可以將 trace_file 設置為以下類型之一:

    描述:

    你可以使用該命令刪除指定主機中的追蹤文件,減少大追蹤文件占用的硬盤空間。當某個服務的追蹤文件已打開,則不能被刪除。這種情況下,你可以使用 ALTER SYSTEM CLEAR TRACES 命令清除追蹤文件。

    例子:

    你使用以下命令刪除主機 lu873.sap.com 上所有 ALERT 追蹤文件:

    ALTERSYSTEM REMOVE TRACES (‘lu873.sap.com’, ‘alert_.trc’);

    參見 ALTER SYSTEM CLEAR TRACES。

    7.3.15 ALTER SYSTEM RESET MONITORING VIEW
    語法:

    ALTER SYSTEM RESET MONITORING VIEW <view_name>

    語法元素:

    <view_name> ::=

    重設可重置監控視圖的名字。

    注意:不是所有監控視圖可以使用該命令進行重置。可重設視圖的名字后綴為"_RESET",你可以通過其名字判斷是否可以重置。

    描述:

    你可以使用此命令重置指定的監視視圖的統計數據。

    你可以使用此命令來定義測量的起始點。首先,你重置監控視圖,然后執行一個操作。當該操作完成后,查詢監控視圖"_RESET"版本獲得從上次重置之后收集到的統計信息。

    例子:

    在以下的例子中,你重置"SYS"."M_HEAP_MEMORY_RESET"監控視圖:

    ALTERSYSTEMRESET MONITORING VIEW"SYS".“M_HEAP_MEMORY_RESET”

    7.3.16 ALTER SYSTEM SAVE PERFTRACE
    語法:

    ALTER SYSTEM SAVE PERFTRACE [INTO FILE <file_name>]

    語法元素:

    <file_name> ::= <string_literal>

    原始性能數據保存的文件。

    描述:

    你可以使用命令收集.prf 文件中的原始性能數據,保存該信息至.tpt 文件。 .tpt 文件保存在 SAP HANA 數據庫實例的追蹤文件目錄中。如果你未指定文件名,則文件將保存為’perftrace.tpt’。

    性能追蹤數據文件(.tpt)可以從’SAP HANA Computing Studio’->Diagnosis-Files 下載,之后性能追蹤可以利用 SAP HANA 實例中的 HDBAdmin 加載和分析。

    監控視圖:

    性能文件的狀態可以從 M_PERFTRACE 監控。

    例子:

    你可以使用如下命令將原始性能數據保存至’mytrace.tpt’文件:

    ALTERSYSTEM SAVE PERFTRACE INTO FILE ‘mytrace.tpt’

    7.3.17 ALTER SYSTEM SAVEPOINT
    語法:

    ALTER SYSTEM SAVEPOINT

    描述:

    持久層管理器上執行保存點。 保存點是一個數據庫的完整連續鏡像保存在磁盤上的時間點,該鏡像可以用于重啟數據庫。

    通常情況下,保存點定期執行,由[persistence]部分的參數 savepoint_interval_s 配置。 對于特殊的(通常測試)的目的,保存點可能會被禁用。在這種情況下,你可以使用此命令來手動執行保存點。

    7.3.18 ALTER SYSTEM START PERFTRACE
    語法:

    ALTER SYSTEM START PERFTRACE [<user_name>] [<application_user_name>] [PLAN_EXECUTION][FUNCTION_PROFILER] [DURATION <duration_seconds>]

    語法元素:

    <user_name> ::=

    限制 perftrace 收集為指定的 SQL 用戶名。

    <application_user_name> ::=

    限制為指定的 SQL 用戶名收集 perftrace,應用用戶可以通過會話變量 APPLICATIONUSER 定義。

    PLAN_EXECUTION

    收集計劃執行細節:

    FUNCTION_PROFILER

    收集函數級別細節:

    <duration_seconds> ::=

    經過 duration_seconds 后, perftrace 自動停止。如果未指定該參數,僅停止有 ALTER SYSTEM STOP PERFTRACE 的 perftrace。

    描述:

    開始性能追蹤。

    利用’Explain Plan’ 或 ‘Visualize Plan’,你可以在邏輯級別查看語句的執行。利用’Perfomance Trace’,語句的執行將記錄在線程和函數級別。

    一次只能有一個 perftrace 活動。

    性能追蹤文件狀態可以從 M_PERFTRACE 監控。

    例子:

    ALTERSYSTEM START PERFTRACE sql_user app_user PLAN_EXECUTION FUNCTION_PROFILER

    7.3.19 ALTER SYSTEM STOP PERFTRACE
    語法:

    ALTER SYSTEM STOP PERFTRACE

    描述:

    停止先前啟動的性能追蹤。停止后,需要利用 ALTER SYSTEM SAVE PERFTRACE 收集和保存性能追蹤數據。

    例子:

    ALTERSYSTEM STOP PERFTRACE

    7.3.20 ALTER SYSTEM STOP SERVICE
    語法:

    ALTER SYSTEM STOP SERVICE <host_port> [IMMEDIATE [WITH COREFILE]]

    語法元素:

    <host_port> ::= <host_name:port_number> | (’<host_name>’,<port_number>)

    將停止的服務的位置。

    IMMEDIATE

    立即停止(中止)服務,無需等待正常關機。

    WITH COREFILE

    寫入 core 文件。

    描述:

    停止或終止單個或者多個服務。 通常,該服務將由守護進程重新啟動。

    修改了不能在線更改的參數之后使用。

    例子:

    ALTERSYSTEM STOP SERVICE ‘ld8520:30303’

    UNSET SYSTEM LICENSE ALL

    語法:

    7.3.21 UNSET SYSTEM LICENSE ALL
    描述:

    刪除所有已安裝的許可證密鑰。 使用此命令后,系統將被立即鎖定,并且需要一個新的有效許可證密鑰,然后才可以繼續使用。執行該命令需要有 LICENSE ADMIN 權限。

    例子:

    UNSET SYSTEM LICENSE ALL

    7.4會話管理語句
    7.4.1 CONNECT
    語法:

    CONNECT <connect_option>

    語法元素:

    <connect_option> ::=<user_name> PASSWORD | WITH SAML ASSERTION ‘’

    描述:

    通過指定 user_name 和密碼或者指定 SAML 斷言連接數據庫實例。

    例子:

    CONNECT my_user PASSWORD myUserPass1

    7.4.2 SET HISTORY SESSION
    語法:

    SET HISTORY SESSION TO

    語法元素:

    :

    用戶應該指定一個確切的會話旅行的時間。

    ::= NOW | COMMIT ID <commit_id> | UTCTIMESTAMP <utc_timestamp>

    描述:

    SET HISTORY SESSION 使當前會話查看歷史記錄表過去的版本。用戶可以指定 COMMIT ID 中的版本或 UTCTIMESTAMP 格式,或者通過指定 NOW 回到當前版本。發布帶有 COMMIT ID 或UTCTIMESTAMP 的 SET HISTORY SESSION 之后,當前會話中看到了一個舊版本的歷史記錄表,而不能寫進系統任何東西。如果給定了 NOW 選項,當前會話恢復到一個正常的會話,看到當前版本的歷史記錄表,并能寫入系統。 此命令只適用于歷史記錄表,普通表的可見性不會受到影響。

    例子:

    SELECT CURRENT_UTCTIMESTAMP FROM SYS.DUMMY

    SELECT LAST_COMMIT_ID FROM M_HISTORY_INDEX_LAST_COMMIT_ID WHERE SESSION_ID =

    CURRENT_CONNECTION COMMIT

    SET HISTORY SESSION TO UTCTIMESTAMP ‘2012-03-09 07:01:41.428’

    SET HISTORY SESSION TO NOW

    7.4.3 SET SCHEMA
    語法:

    SET SCHEMA <schema_name>

    描述:

    你可以修改會話的當前schema。 如果表前不限制schema,則使用當前用戶的schema。

    7.4.4 SET [SESSION]
    語法:

    SET [SESSION] =

    (SESSION選項可以省略)

    語法元素:

    ::= <string_literal>

    會話變量的鍵值,最大長度為 32 個字符。

    ::= <string_literal>

    會話變量的期望值,最大長度為 512 個字符。

    描述:

    你可以使用該命令設置你數據庫會話的會話變量,通過提供鍵值對。

    注意:有幾個只讀會話變量,你不能使用該命令修改值: APPLICATION, APPLICATIONUSER,TRACEPROFILE。

    會話變量可以使用 SESSION_CONTEXT 函數獲得,使用 UNSET [SESSION]命令取消設置。

    例子:

    SET’MY_VAR’ = ‘dummy’;

    SELECT SESSION_CONTEXT(‘MY_VAR’) FROM dummy;

    UNSET ‘MY_VAR’;

    7.4.5 UNSET [SESSION]
    語法:

    UNSET [SESSION]

    語法元素:

    ::= <string_literal>

    會話變量的鍵值,最大長度為 32 個字符。

    描述:

    你可以使用 UNSET [SESSION]取消設置當前會話的會話變量。

    注意:有幾個只讀會話變量,你不能使用該命令修改值: APPLICATION, APPLICATIONUSER,TRACEPROFILE。

    例子:

    SET’MY_VAR’= ‘dummy’;

    SELECT SESSION_CONTEXT(‘MY_VAR’) FROM dummy;

    UNSET ‘MY_VAR’;

    7.5事務管理語句
    7.5.1 COMMIT
    語法:

    COMMIT

    描述:

    該系統支持事務一致性,保證了當前作業是完全應用到系統中或者棄用。如果用戶希望持久地應用當前作業至系統中,用戶應使用 COMMIT 命令。 如果 COMMIT 命令發出后,并成功處理,任何改變將應用到當前事務完成的系統中,改變也將對其他未來開始的作業可見。通過 COMMIT 命令已經承諾的工作,將不能恢復。 分布式系統中,遵守標準的兩階段提交協議。在第一階段, 事務處理協調器將詢問每一位參與者是否準備提交,并將結果發送到第二階段的參與者。 COMMIT 命令只適用于’autocommit’的禁用會話。

    例子:

    COMMIT

    7.5.2 LOCK TABLE
    語法:

    LOCK TABLE <table_name> IN EXCLUSIVE MODE [NOWAIT]

    描述:

    LOCK TABLE 命令顯式地嘗試獲取表的互斥鎖。如果指定了 NO WAIT 選項, 其只是試圖獲得表的鎖。如果指定了 NOWAIT 選項不能獲得鎖,將返回一個錯誤代碼,但是當前事務將回滾。

    例子:

    LOCKTABLE t1 INEXCLUSIVEMODE NOWAIT

    7.5.3 ROLLBACK
    語法:

    ROLLBACK

    描述:

    該系統支持事務一致性,保證了當前作業是完全應用到系統中或者棄用。在事務的中間過程, 可以顯式恢復,因為由于 ROLLBACK 命令,事務尚未執行。發布 ROLLBACK 命令后, 將完全恢復事務系統做的任何變化,當前會話將處于閑置狀態。 ROLLBACK 命令只適用于’autocommit’的禁用會話。

    例子:

    ROLLBACK

    7.5.4 SET TRANSACTION
    語法:

    SET TRANSACTION <isolation_level> | <transaction_access_mode>

    語法元素:

    isolation_level ::= ISOLATION LEVEL

    隔離級別設置數據庫中的數據語句級讀一致性。如果省略了 isolation_level,默認值為 READ COMMITTED。

    level ::= READ COMMITTED(提交讀取) | REPEATABLE READ(可重復讀) | SERIALIZABLE(序列化讀)

    READ COMMITTED

    READ COMMITTED 隔離級別提供事務過程中語句級別讀一致性。 在語句開始執行時,事務中的每條語句都能看到已提交狀態的數據。這意味著在同一事務中,每個語句可能會看到執行時數據庫中不同的快照,因為數據可以在事務中提交。

    REPEATABLE READ/SERIALIZABLE

    REPEATABLE READ/SERIALIZABLE 隔離級別提供了事務級快照隔離。事務所有語句共享數據庫同樣的快照。該快照包含所有已提交的事務開始的時間以及事務本身的修改。

    transaction_access_mode ::= READ ONLY | READ WRITE

    SQL 事務訪問模式控制事務是否可以在執行期間修改數據。如果省略了transaction_access_mode,默認值為 READ ONLY。

    READ ONLY

    如果設置了 READ ONLY 訪問模式,則只允許只讀的 SELECT 語句。如果在這種模式下嘗試更新或插入操作,會拋出一個異常。

    READ WRITE

    如果設置了 READ WRITE 訪問模式,在一個事務中的語句可以按需自由地讀取或更改數據庫的數據。

    描述:

    SAP HANA 數據庫使用多版本并發控制 (MVCC) 確保讀取操作的一致性(提交讀取隔離級別+MVCC,可以解決數據不可重復讀的問題)。并發的讀操作不阻塞并發寫操作數據庫中的數據的一致視圖。并發的讀操作不阻塞并發寫數據庫數據的一致視圖。更新操作通過插入數據的新版本而不是覆蓋已有數據執行。

    指定的隔離級別確定將要使用的鎖操作類型。系統同時支持語句級快照隔離和事務級快照隔離。

    ? 對于語句級快照隔離,使用READ COMMITED。

    ? 對于事務級快照隔離,使用REPEATABLE READ 或者 SERIALIZABLE。

    在一個事務中,當記錄被插入、更新或刪除時,系統對事務執行中,受影響的記錄設置互斥鎖的持續時間,也對受影響的表設置鎖。這樣可以保證當表中的記錄正在更新時,該表不會被刪除或更改。數據庫在事務結束時釋放這些鎖。

    注意:讀取操作不設置任何數據庫中表或行的鎖,無論使用何種隔離級別。

    數據定義語言和事務隔離

    數據定義語言(DDL) 語句(CREATE TABLE, DROP TABLE, CREATE VIEW, etc )總是立即對隨后的 SQ 語句生效,無論使用何種隔離級別。對于這種行為的一個例子,請考慮下面的順序:

  • 一個長期運行 SERIALIZABLE 的隔離事務在表 C 開始操作。

  • 一些 DDL 語句在事務外運行,添加一列新列至表 C。

  • 在 SERIALIZABLE 隔離事務內,只要 DDL 語句執行完畢,新生成的列可以要訪問。訪問發生不論使用何種隔離級別。

  • 例子:

    SETTRANSACTION READ COMMITTED;

    數據庫的隔離級別:并發性作用。

    l Read Uncommited(未提交讀):沒有提交就可以讀取到數據(發出了Insert,但沒有commit就可以讀取到。)很少用。在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用于實際應用,因為它的性能也不比其他級別好多少。讀取未提交的數據,也被稱之為臟讀(Dirty Read)。

    l Read Commited(提交讀):只有提交后才可以讀,常用。這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的,MySql默認為可重復讀)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。解決了臟讀問題。

    l Repeatable Read(可重復讀):mysql默認級別, 必需提交才能見到,讀取數據時數據被鎖住。它確保同一事務的多個實例在并發讀取數據時,會看到同樣的數據行。不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)。簡單的說,幻讀指當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的“幻影” 行。InnoDB和Falcon存儲引擎通過多版本并發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。解決了不可重復讀的問題

    l Serialiazble(序列化讀):最高隔離級別,串型的,你操作完了,我才可以操作,并發性特別不好。這是最高的隔離級別,它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

    隔離級別

    是否存在臟讀

    是否存在不可重復讀

    是否存在幻讀

    Read Uncommitted(未提交讀)

    Y

    Y

    Y

    Read Commited(提交讀)

    N

    Y(可采用悲觀鎖解決)

    Y

    Repeatable Read(可重復讀)

    N

    N

    Y

    Serialiazble(序列化讀)

    N

    N

    N

    事務并發時可能出現問題:臟讀、不可重復讀、幻讀

    臟讀:沒有提交就可以讀取到數據稱為臟讀

    不可重復讀:再重復讀一次,數據與你上的不一樣。稱不可重復讀。

    幻讀:在查詢某一條件的數據,開始查詢的后,別人又加入或刪除些數據,再讀取時與原來的數據不一樣了。

    臟讀(Drity Read):某個事務已更新一份數據,另一個事務在此時讀取了同一份數據,由于某些原因前一個RollBack了操作,則后一個事務所讀取的數據就會是不正確的。

    不可重復讀(Non-repeatable read):在一個事務的兩次查詢之中數據不一致,這可能是兩次查詢過程中間插入了一個事務更新的原有的數據。

    幻讀(Phantom Read):在一個事務的兩次查詢中數據筆數不一致,例如有一個事務查詢了幾行(Row)數據,而另一個事務卻在此時插入了新的幾行數據,先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。

    設置 JDBC 事務隔離級別(注意多數數據庫都不支持所有的隔離級別):

    1 java.sql.Connection.TRANSACTION_READ_COMMITTED

    2 java.sql.Connection.TRANSACTION_READ_UNCOMMITTED

    4 java.sql.Connection.TRANSACTION_REPEATABLE_READ

    8 java.sql.Connection.TRANSACTION_SERIALIZABLE

    一般我們將級別設置為1(提交讀)級別后,再通過程序的方式來避免“不可重復讀”問題。

    如果我們在Hibernate中沒有設置數據庫的隔離級別,則默認是依賴于數據庫的,所以我們最好設置。

    銀行系統需要將數據庫的隔離級別設置成“可重復讀”。

    一、悲觀鎖
    悲觀鎖:具有排他性(我鎖住當前數據后,別人看到不此數據)

    悲觀鎖一般由數據機制來做到的。select … for update

    1、 悲觀鎖的實現
    通常依賴于數據庫機制,在整修過程中將數據鎖定,其它任何用戶都不能讀取或修改(如:必需我修改完之后,別人才可以修改)

    2、 悲觀鎖的適用場景:
    悲觀鎖一般適合短事務比較多(如某一數據取出后加1,立即釋放)

    長事務占有時間(如果占有1個小時,那么這個1小時別人就不可以使用這些數據),不常用。

    3、 實例:

    用戶1、用戶2 同時讀取到數據,但是用戶2先 -200,這時數據庫里的是800,現在用戶1也開始-200,可是用戶1剛才讀取到的數據是1000,現在用戶用剛剛一開始讀取的數據1000-200為800,而用戶1在更新時數據庫里的是用房更新的數據800,按理說用戶1應該是800-200=600,而現在是800,這樣就造成的更新丟失。這種情況該如何處理呢,可采用兩種方法:悲觀鎖、樂觀鎖。先看看悲觀鎖:用戶1讀取數據后,用鎖將其讀取的數據鎖上,這時用戶2是讀取不到數據的,只有用戶1釋放鎖后用戶2才可以讀取,同樣用戶2讀取數據也鎖上。這樣就可以解決更新丟失的問題了。

    二、樂觀鎖
    樂觀鎖:不是鎖,是一種沖突檢測機制,如Hibernate就是這樣。

    樂觀鎖的并發性較好,因為我改的時候,別人隨邊修改。樂觀鎖的實現方式:常用的是版本的方式(每個數據表中有一個版本字段version,某一個用戶更新數據后,版本號+1,另一個用戶修改后再+1,當用戶更新發現數據庫當前版本號與讀取數據時版本號不一致(等于小于數據庫當前版本號),則更新不了。

    7.5.4.1 數據庫鎖相關概念
    為了確保并發用戶在存取同一數據庫對象時的正確性(即無丟失修改、可重復讀、不讀“臟”數據),數據庫中引入了鎖機制。基本的鎖類型有兩種:排它鎖(exclusive locks 記為x 鎖)和共享鎖(share locks記為 s鎖)。加鎖是實現數據庫并發控制的一個非常重要的技術。當事務在對某個數據對象進行操作前,先向系統發出請求,對其加鎖。加鎖后事務就對該數據對象有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此數據對象進行更新操作。

    排它鎖:若事務t對數據d加x鎖,則其它任何事務都不能再對d加任何類型的鎖,直至t 釋放d 上的x 鎖;一般要求在修改數據前要向該數據加排它鎖,所以排它鎖又稱為寫鎖。

    共享鎖:若事務t對數據d加s 鎖,則其它事務只能對d加 s鎖,而不能加x 鎖,直至t 釋放d 的s 鎖;一般要求在讀取數據前要向該數據加共享鎖,所以共享鎖又稱為讀鎖。

    7.5.4.1.1 悲觀封鎖
    鎖在用戶修改之前就發揮作用:
    Select …for update(nowait)
    Select * from tab1 for update
    用戶發出這條命令之后,oracle將會對返回集中的數據建立行級封鎖,以防止其他用戶的修改。
    如果此時其他用戶對上面返回結果集的數據進行dml或ddl操作都會返回一個錯誤信息或發生阻塞。
    1:對返回結果集進行update或delete操作會發生阻塞。
    2:對該表進行ddl操作將會報:Ora-00054:resource busy and acquire with nowait specified.

    原因分析
    此時Oracle已經對返回的結果集上加了排它的行級鎖,所有其他對這些數據進行的修改或刪除操作都必須等待這個鎖的釋放,產生的外在現象就是其他的操作將發生阻塞,這個這個操作commit或rollback.
    同樣這個查詢的事務將會對該表加表級鎖,不允許對該表的任何ddl操作,否則將會報出ora-00054錯誤::resource busy and acquire with nowait specified.

    7.5.4.1.2 樂觀封鎖
    樂觀的認為數據在select出來到update進取并提交的這段時間數據不會被更改。這里面有一種潛在的危險就是由于被選出的結果集并沒有被鎖定,是存在一種可能被其他用戶更改的可能。因此Oracle仍然建議是用悲觀封鎖,因為這樣會更安全。樂觀鎖一般通過程序版本控制來實現,如Hibernate

    7.5.4.1.3 阻塞
    定義:
    當一個會話保持另一個會話正在請求的資源上的鎖定時,就會發生阻塞。被阻塞的會話將一直掛起,直到持有鎖的會話放棄鎖定的資源為止。4個常見的dml語句會產生阻塞
    INSERT
    UPDATE
    DELETE
    SELECT…FOR UPDATE

    INSERT

    Insert發生阻塞的唯一情況就是用戶擁有一個建有主鍵約束的表。當2個的會話同時試圖向表中插入相同的數據時,其中的一個會話將被阻塞,直到另外一個會話提交或會滾。一個會話提交時,另一個會話將收到主鍵重復的錯誤。回滾時,被阻塞的會話將繼續執行。

    UPDATE 和DELETE當執行Update和delete操作的數據行已經被另外的會話鎖定時,將會發生阻塞,直到另一個會話提交或會滾。

    Select …for update

    當一個用戶發出select…for update的錯作準備對返回的結果集進行修改時,如果結果集已經被另一個會話鎖定,就是發生阻塞。需要等另一個會話結束之后才可繼續執行。可以通過發出 select… for update nowait的語句來避免發生阻塞,如果資源已經被另一個會話鎖定,則會返回以下錯誤:Ora-00054:resource busy and acquire with nowait specified.

    7.5.4.1.4 死鎖-deadlock
    定義:當兩個用戶希望持有對方的資源時就會發生死鎖.
    即兩個用戶互相等待對方釋放資源時,oracle認定為產生了死鎖,在這種情況下,將以犧牲一個用戶作為代價,另一個用戶繼續執行,犧牲的用戶的事務將回滾.
    例子:
    1:用戶1對A表進行Update,沒有提交。
    2:用戶2對B表進行Update,沒有提交。
    此時雙反不存在資源共享的問題。
    3:如果用戶2此時對A表作update,則會發生阻塞,需要等到用戶一的事物結束。
    4:如果此時用戶1又對B表作update,則產生死鎖。此時Oracle會選擇其中一個用戶進行會滾,使另一個用戶繼續執行操作。
    起因:
    Oracle的死鎖問題實際上很少見,如果發生,基本上都是不正確的程序設計造成的,經過調整后,基本上都會避免死鎖的發生。

    7.6訪問控制語句
    7.6.1 ALTER SAML PROVIDER
    ALTER SAML PROVIDER <saml_provider_name> WITH SUBJECT <subject_name> ISSUER <issuer_distinguished_name>

    語法元素:

    <subject_name> ::=

    <string_literal>

    <issuer_distinguished_name> ::=

    <string_literal>

    描述:

    ALTER SAML PROVIDER 語句修改 SAP HANA 數據庫已知的 SAML 提供商的屬性。

    <saml_provider_name> 必須是一個現有的 SAML 提供商。只有擁有系統權限 USER ADMIN 的數據庫

    用戶允許修改 SAML 提供商。

    <subject_name> 以及 <issuer_distinguished_name>是 SAML 身份提供程序中證書對應的名字。

    系統和監控視圖:

    SAML_PROVIDER:顯示所有 SAML 提供商主題名和 issuer_name。

    7.6.2 ALTER USER
    語法:

    ALTER USER <user_name> <alter_user_option>

    語法元素:

    <alter_user_option> ::=PASSWORD [<user_parameter_option>]

    | <user_parameter_option>

    | IDENTIFIED EXTERNALLY AS <external_identity> [<user_parameter_option>]

    | RESET CONNECT ATTEMPTS

    | DROP CONNECT ATTEMPTS

    | DISABLE PASSWORD LIFETIME

    | FORCE PASSWORD CHANGE

    | DEACTIVATE [USER NOW]

    | ACTIVATE [USER NOW]

    | DISABLE <authentication_mechanism>

    | ENABLE <authentication_mechanism>

    | ADD IDENTITY <provider_identity>…

    | ADD IDENTITY <external_identity> FOR KERBEROS

    | DROP IDENTITY <provider_info>…

    | DROP IDENTITY FOR KERBEROS

    | <string_literal>

    <authentication_mechanism> ::= PASSWORD | KERBEROS | SAML

    <provider_identity> ::=<mapped_user_name> FOR SAML PROVIDER <saml_provider_name>| <external_identity> FOR KERBEROS

    <mapped_user_name> ::=ANY | <string_literal>

    <saml_provider_name> ::=<simple_identifier>

    <provider_info> ::= FOR SAML PROVIDER <saml_provider_name>

    ::=<letter_or_digit>…

    <user_parameter_option> ::=<set_user_parameters> [<clear_user_parameter_option>] | <clear_user_parameter_option>

    <set_user_parameters> ::=SET PARAMETER CLIENT = <string_literal>

    <clear_user_parameter_option> ::=CLEAR PARAMETER CLIENT| CLEAR ALL PARAMETERS

    <external_identity> ::=<simple_identifier>

    描述:

    ALTER USER 語句修改數據庫用戶。 <user_name>必須指定一個現有的數據庫用戶。

    每個用戶可以為自己執行 ALTER USER。但并非所有<alter_user_option>可以由用戶自己指定。對于<alter_user_option>其他用戶,只有擁有系統權限 USER ADMIN 權限的用戶可以執行 ALTER USER。

    使用 PASSWORD 創建的用戶不能修改為 EXTERNALLY,反之亦然。但他們的或者<external_identity>是可以修改的。

    你可以使用此命令更改用戶的密碼。密碼的修改必須遵循當前數據庫定義的規則,包括最小密碼長度和定義的字符類型(大寫、小寫、數字、特殊字符)必須是密碼的一部分。用戶根據指定數據庫實例定義的策略,必須定期更換密碼,或者由首次連接到數據庫實例的用戶,自己更改密碼。

    你可以更改外部認證。外部用戶使用外部系統需要進行身份驗證,例如, Kerberos 系統。這些用戶沒有密碼,但是有 Kerberos 實體名稱。有關外部身份的詳細信息,請聯系您的域管理員。

    <user_parameter_option>可以用來設置、修改或者清除用戶參數 CLIENT。

    <set_user_parameters>用來為數據庫中的用戶設置用戶參數 CLIENT。

    當使用報表時,該用戶參數 CLIENT 可以用于限制用戶 <user_name>訪問有關特定客戶端的信息。

    <user_parameter_option>不能由用戶自己指定。

    如果在成功連接(正確的用戶/密碼組合)前,達到參數 MAXIMUM_INVALID_CONNECT_ATTEMPTS(參見監控視圖 M_PASSWORD_POLICY)定義的錯誤次數,用戶將在允許重新連接前,被鎖定幾分鐘。擁有系統權限 USER ADMIN 的用戶或者用戶自己,可以使用命令 ALTER USER <user_name>

    RESET CONNECT ATTEMPTS 可以刪除已發生的無效連接嘗試的信息。

    擁有系統權限 USER ADMIN 的用戶可以使用命令 ALTER USER <user_name> DISABLE PASSWORD

    LIFETIME 排除用戶<user_name>的所有密碼生命周期檢查。這應該只為技術用戶使用,而非正常的數據庫用戶。

    擁有系統權限 USER ADMIN 的用戶可以使用命令 ALTER USER <user_name> FORCE PASSWORD CHANGE 強制用戶<user_name>在下次連接后立即修改密碼,然后才可以正常工作。

    擁有系統權限 USER ADMIN 的用戶可以使用命令 ALTER USER <user_name> DEACTIVATE USER NOW關閉/鎖定用戶<user_name>的賬號。用戶<user_name>的賬號關閉/鎖定之后,用戶將不能連接到

    SAP HANA 數據庫。欲重新激活/解鎖用戶<user_name>,系統權限 USER ADMIN 用戶使用命令USER <user_name> ACTIVATE USER NOW,或者,在用戶使用 PASSWORD 身份驗證機制的情況下,使用 ALTER USER <user_name> PASSWORD 重設用戶密碼。

    擁有系統權限 USER ADMIN 的用戶可以使用命令 ALTER USER <user_name> ACTIVATE USER NOW 重新激活/解鎖之前已經關閉的用戶<user_name>賬號。

    配置參數:

    有關密碼的配置參數,可以查看監控視圖 M_PASSWORD_POLICY。這些參數存儲在

    indexserver.ini, 'password policy’部分中。相關的參數描述可以在 SAP HANA 安全指南,附錄,密碼策略參數中找到。

    系統和監控視圖:

    USERS: 顯示所有用戶、用戶的創建者、創建時間和當前狀態的信息。

    USER_PARAMETERS:顯示定義的 user_parameters,目前只提供 CLIENT。

    INVALID_CONNECT_ATTEMPTS:顯示每個用戶無效連接的嘗試次數。

    LAST_USED_PASSWORDS: 顯示用戶上次密碼修改日期。

    M_PASSWORD_POLICY:顯示描述密碼所允許的樣式的配置參數及其生命周期。

    例子:

    在可能使用給定的密碼連接數據庫以及已有的 SAML 提供商 OUR_PROVIDER 斷言之前,用戶名為NEW_USER 的用戶已經創建完成。由于斷言將提供數據庫用戶名, <mapped_user_name>設為ANY。這由如下的語句完成:

    CREATEUSER new_user PASSWORD Password1 WITHIDENTITYANYFOR SAML PROVIDER OUR_PROVIDER;

    現在,該用戶將被強制修改密碼,用戶被禁止使用 SAML。

    ALTERUSER new_user FORCE PASSWORD CHANGE;

    ALTERUSER new_user DISABLE SAML;

    假設用戶已經過于頻繁的嘗試一個錯誤的密碼,管理員將重置無效的連接嘗試數為零。

    ALTERUSER new_user RESETCONNECT ATTEMPTS;

    用戶 new_user 應當允許使用 KERBEROS 機制進行身份驗證。因此,需要定義該連接的外部身份。

    ALTERUSER new_user ADDIDENTITY’testkerberosName’FOR KERBEROS;

    ALTERUSER new_user ENABLE KERBEROS;

    另一方面,用戶 new_user 將放松使用 SAML 提供商 OUR_PROVIDER 斷言的可能性。

    ALTERUSER new_user DROPIDENTITYFOR SAML PROVIDER OUR_PROVIDER;

    最后,管理員希望禁止此用戶 new_user 的所有連接,因為他最近執行的可疑操作。

    ALTERUSER new_user DEACTIVATE;

    7.6.3 CREATE ROLE
    語法:

    CREATE ROLE <role_name>

    語法元素:

    <role_name> ::=

    描述:

    CREATE ROLE 語句創建一個新的角色。

    只有擁有系統權限 ROLE ADMIN 的用戶可以創建新角色。

    指定的角色名稱不能與現有用戶或角色的名稱相同。

    角色是權限的一個命名集合,可以授予一個用戶或角色。如果你想允許多個數據庫用戶執行相同的操作,你可以創建一個角色,授予該角色所需的權限,并將角色授予不同的數據庫用戶。

    每個用戶允許將權限授予一個已有的角色,但只有只有擁有系統權限 ROLE ADMIN 的用戶可以將角色授予角色和用戶。

    SAP HANA 數據庫提供了四種角色:

    PUBLIC:每個數據庫用戶默認已被授予該角色。

    該角色包括只讀訪問系統視圖、監控視圖和一些存儲過程的執行權限。這些權限可以被撤銷。

    該角色可以授予過后將被撤銷的權限。

    MODELING:該角色包含使用 SAP HANA Studio 信息建模器所需的權限。

    CONTENT_ADMIN:該角色包含與 MODELING 角色相同的角色,但是使用擴展該角色將被允許授予其他用戶這些權限。此外,它包含了與導入對象工作的元庫權限。

    MONITORING:該角色包含所有元數據、當前的系統狀態、監控視圖和服務器統計數據的只讀訪問。

    系統和監控視圖:

    ROLES:顯示所有角色、它們的創建者和創建時間。

    GRANTED_ROLES:顯示每個用戶或角色被授予的角色。

    GRANTED_PRIVILEGES:顯示每個用戶或角色被授予的權限。

    例子:

    創建名稱為 role_for_work_on_my_schema 的角色。

    CREATE ROLE role_for_work_on_my_schema;

    7.6.4 CREATE SAML PROVIDER
    語法:

    CREATE SAML PROVIDER <saml_provider_name> WITH SUBJECT <subject_distinguished_name> ISSUER <issuer_distinguished_name>

    描述:

    CREATE SAML PROVIDER 語句定義 SAP HANA 數據庫已知的 SAML 提供商。 <saml_provider_name>必須與已有的 SAML 提供商不同。

    只有擁有系統權限 USER ADMIN 的用戶可以創建 SAML 提供商,每個有該權限的用戶允許刪除任何 SAML 提供商。

    需要一個現有的 SAML 提供商,能夠為用戶指定 SAML 連接。 <subject_distinguished_name> 和<issuer_distinguished_name>是 SAML 提供商使用的 X.509 證書的主題和發布者的 X.500 可分辨名字。這些名字的語法可以在 ISO/IEC 9594-1 中找到。

    SAML 概念的詳細細節可以在 Oasis SAML 2.0 中找到。

    系統和監控視圖:

    SAML_PROVIDERS:顯示所有 SAML 提供商主題名和發布者名字。

    例子:

    創建一個名稱為 gm_saml_provider 的 SAML 提供商,指定主題和發布者所屬的公司。

    CREATE SAML PROVIDER gm_saml_provider WITH SUBJECT ‘CN = wiki.detroit.generalmotors.corp,OU = GMNet,O = GeneralMotors,C = EN’

    ISSUER ‘E = John.Do@gm.com,CN = GMNetCA,OU = GMNet,O = GeneralMotors,C = EN’;

    7.6.5 CREATE USER
    語法:

    CREATE USER <user_name> [PASSWORD ] [IDENTIFIED EXTERNALLY AS <external_identity>] [WITH IDENTITY <provider_identity>…] [<set_user_parameters>]

    語法元素:

    <external_identity> ::=<simple_identifier> | <string_literal>

    <provider_identity> ::=<mapped_user_name> FOR SAML PROVIDER <saml_provider_name> | <external_identity> FOR KERBEROS

    <mapped_user_name> ::=ANY | <string_literal>

    <saml_provider_name> ::=<simple_identifier>

    <set_user_parameters> ::=SET PARAMETER CLIENT = <string_literal>

    描述:

    CREATE USER 創建一個新的數據庫用戶。

    只有擁有系統權限 USER ADMIN 的用戶可以創建另一個數據庫用戶。

    指定的用戶名必須不能與已有的用戶名、角色名或集合名相同。

    SAP HANA 數據庫提供的用戶有: SYS, SYSTEM, _SYS_REPO,_SYS_STATISTICS。

    數據庫中的用戶可以通過不同的機制進行身份驗證,內部使用密碼的身份驗證機制和而外部則使用 Kerberos 或 SAML 等機制驗證。用戶可以同時使用不止一種方式進行身份驗證,但在同一時間,只有一個密碼和一個外部識別有效。與之相反的是,同一時間可以有一個以上<provider_identity>為一個用戶存在。至少需指定一種驗證機制允許用戶連接和在數據庫實例上工作。

    由于兼容性原因,語法 IDENTIFIED EXTERNALLY AS <external_identity>以及<external_identity> FORKERBEROS 會繼續使用。

    密碼必須遵循當前數據庫定義的規則。密碼的修改必須遵循當前數據庫定義的規則,包括最小密碼長度和定義的字符類型(大寫、小寫、數字、特殊字符)必須是密碼的一部分.用戶根據指定數據庫實例定義的策略,必須定期更換密碼。在執行 CREATE USER 命令期間提供的密碼將被視為已提供, <user_name>將會修改為大寫作為每個<simple_identifier>。

    外部用戶使用外部系統進行身份驗證,例如 Kerberos 系統。這些用戶沒有密碼,但是有 Kerberos實體名稱。有關外部身份的詳細信息,請聯系您的域管理員。

    如果 ANY 作為映射的用戶名, SAML 斷言將包含斷言生效的數據庫用戶名。 <saml_provider_name>必須指定一個已有的 SAML 提供商。

    <set_user_parameters>可以用于為數據庫中的用戶設置用戶參數 CLIENT。

    當使用報表時,該用戶參數 CLIENT 可以用于限制用戶 <user_name>訪問有關特定客戶端的信息。

    <user_parameter_option>不能由用戶自己指定。

    對于每個數據庫用戶,數據集合將以包含用戶名方式創建。這是不能顯式刪除。用戶刪除時,該集合也將被刪除。數據庫用戶擁有該集合,并當他不顯式指定集合名稱時,作為自己的默認集合使用。

    配置參數:

    與密碼相關的配置參數可以在監控視圖 M_PASSWORD_POLICY 查看。這些參數存儲 indexserver.ini的’password policy’部分中。相關的參數描述可以在 SAP HANA 安全指南,附錄,密碼策略參數中找到。

    系統和監控視圖:

    USERS: 顯示所有用戶、用戶的創建者、創建時間和當前狀態的信息。

    USER_PARAMETERS:顯示定義的 user_parameters,目前只提供 CLIENT。

    INVALID_CONNECT_ATTEMPTS:顯示每個用戶無效連接的嘗試次數。

    LAST_USED_PASSWORDS: 顯示用戶上次密碼修改日期。

    M_PASSWORD_POLICY:顯示描述密碼所允許的樣式的配置參數及其生命周期。

    SAML_PROVIDERS;顯示已有的 SAML 提供商。

    SAML_USER_MAPPING:顯示每個 SAML 提供商的映射用戶名。

    例子:

    在可能使用給定的密碼連接數據庫以及已有的 SAML 提供商 OUR_PROVIDER 斷言之前,用戶名為NEW_USER 的用戶已經創建完成。由于斷言將提供數據庫用戶名, <mapped_user_name>設為ANY。 這由如下的語句完成:

    CREATEUSER new_user PASSWORD Password1 WITHIDENTITYANYFOR SAML PROVIDER OUR_PROVIDER;

    7.6.6 DROP ROLE
    語法:

    DROP ROLE <role_name>

    例子:

    DROP ROLE 語句刪除角色。 <drop_name>必須指定已經存在的角色。

    只有擁有系統權限 ROLE ADMIN 的用戶可以刪除角色。任何有該權限的用戶允許刪除任意角色。

    只有 SAP HANA 提供的角色可以刪除: PUBLIC, CONTENT_ADMIN, MODELING and MONITORING。

    如果一個角色授予用戶或角色,在角色刪除時將被撤銷。撤銷角色可能會導致一些視圖無法訪問或者存儲過程再也不工作,如果一個視圖或存儲過程依賴于該角色中的任意權限,會發生這種情況。

    系統和監控視圖:

    ROLES:顯示所有角色、它們的創建者和創建時間。

    GRANTED_ROLES:顯示每個用戶或角色被授予的角色。

    GRANTED_PRIVILEGES:顯示每個用戶或角色被授予的權限。

    例子:

    創建名為 role_for_work_on_my_schema 的角色,隨后立即刪除。

    CREATE ROLE role_for_work_on_my_schema;

    DROP ROLE role_for_work_on_my_schema;

    7.6.7 DROP SAML PROVIDER
    語法:

    DROP SAML PROVIDER <saml_provider_name>

    描述:

    DROP SAML PROVIDER 語句刪除指定的 SAML 提供商。 <saml_provider_name>必須是一個已有的SAML 提供商。如果指定的 SAML 提供商正在被 SAP HANA 用戶使用,則該提供商不能被刪除。

    只有擁有系統 USER ADMIN 權限的用戶可以刪除 SAML 提供商。

    系統和監控視圖:

    SAML_PROVIDERS:顯示所有 SAML 提供商主題名稱和 issuer_name。

    7.6.8 DROP USER
    語法:

    DROP USER <user_name> [<drop_option>]

    語法元素:

    <drop_option> ::= CASCADE | RESTRICT

    Default = RESTRICT

    描述:

    DROP USER 語句刪除數據庫用戶。 <user_name>必須指定一個已有的數據庫用戶。

    只有擁有系統 USER ADMIN 權限的用戶可以刪除用戶。擁有該權限的用戶可以刪除任何用戶。 SAPHANA 數據庫提供的用戶不能刪除: SYS, SYSTEM, _SYS_REPO,_SYS_STATISTICS。

    如果顯式或隱式指定了<drop_option> RESTRICT,則當用戶為數據集合的所有者或以及創建了其他集合,或者該用戶集合下存有非本人創建的對象時,該用戶不能被刪除。

    如果指定了<drop_option> CASCADE,包含用戶名的集合和屬于該用戶的集合,連同所有存在這些集合中的對象(即使是由其他用戶創建)一起刪除。用戶擁有的對象,即使為其他集合中的一部分,將被刪除。依賴于已刪除對象的對象將被刪除,即使已刪除的用戶所擁有的公共同義詞。

    已刪除對象的權限將被撤銷,授予已刪除用戶的權限也將被撤銷。撤銷權限可能會造成更多的撤銷操作,如果這些權限被進一步授予。

    已刪除用戶創建的用戶和由他們創建的角色將不會被刪除。已刪除的用戶創建的審核策略也不會被刪除。

    如果用戶存在一個已打開的會話,仍然可以刪除該用戶。

    系統和監控視圖:

    已刪除用戶將從以下視圖刪除:

    USERS: 顯示所有用戶、用戶的創建者、創建時間和當前狀態的信息。

    USER_PARAMETERS:顯示定義的 user_parameters,目前只提供 CLIENT。

    INVALID_CONNECT_ATTEMPTS:顯示每個用戶無效連接的嘗試次數。

    LAST_USED_PASSWORDS: 顯示用戶上次密碼修改日期。

    M_PASSWORD_POLICY:顯示描述密碼所允許的樣式的配置參數及其生命周期。

    對象的刪除可能影響所有描述對象的系統視圖,例如 TABLES, VIEWS,PROCEDURES, … .

    對象的刪除可能影響描述權限的視圖:例如 GRANTED_PRIVILEGES 以及所有監控視圖,例如M_RS_TABLES, M_TABLE_LOCATIONS, …

    例子:

    例如,使用這條語句創建名稱為 NEW_USERd 的用戶:

    CREATEUSER new_user PASSWORD Password1;

    已有的用戶 new_user 將被刪除,連同其所有對象一起:

    DROPUSER new_user CASCADE;

    7.6.9 GRANT
    語法:

    GRANT <system_privilege>,… TO [WITH ADMIN OPTION] | GRANT <schema_privilege>,… ON SCHEMA <schema_name> TO [WITH GRANT OPTION]| GRANT <object_privilege>,… ON <object_name> TO [WITH GRANT OPTION] | GRANT <role_name>,… TO [WITH ADMIN OPTION]| GRANT STRUCTURED PRIVILEGE <privilege_name> TO

    語法元素:

    <system_privilege> ::=AUDIT ADMIN | BACKUP ADMIN| CATALOG READ | CREATE SCENARIO| CREATE SCHEMA | CREATE STRUCTURED PRIVILEGE| DATA ADMIN | EXPORT| IMPORT
    | INIFILE ADMIN| LICENSE ADMIN | LOG ADMIN| MONITOR ADMIN | OPTIMIZER ADMIN| RESOURCE ADMIN | ROLE ADMIN| SAVEPOINT ADMIN | SCENARIO ADMIN| SERVICE ADMIN | SESSION ADMIN| STRUCTUREDPRIVILEGE ADMIN | TRACE ADMIN| USER ADMIN | VERSION ADMIN| .

    系統權限用來限制管理任務。定義如下的系統權限:

    AUDIT ADMIN

    該權限控制以下審計有關命令的執行: CREATE AUDIT POLICY, DROP AUDIT POLICY and ALTER AUDIT POLICY.

    BACKUP ADMIN

    該權限授權 ALTER SYSTEM BACKUP 命令來定義和啟動備份進程或執行恢復過程。

    CATALOG READ

    該權限賦予所有用戶未經過濾的只讀訪問所有的系統和監控視圖。正常情況下,這些視圖的內容根據正在訪問用戶的權限過濾。權限 CATALOG READ 使用戶有只讀訪問所有的系統和監控視圖的內容。

    CREATE SCENARIO

    該權限控制計算場景和多維數據集(數據庫計算)的創建。

    CREATE SCHEMA

    該權限控制使用 CREATE SCHEMA 命令創建數據庫數據集合。每個用戶都有個集合。擁有該權限,用戶允許創建更多的集合。

    CREATE STRUCTURED PRIVILEGE

    該權限授權創建結構化權限(分析權限)。注意,只有分析權限的所有者可以進一步授予其他用戶或者角色,以及撤銷。

    DATA ADMIN

    該強大的權限授權讀取系統和監控視圖中的所有數據,包括在 SAP HANA 數據庫中執行 DDL (DataDefinition Language) 以及 DDL 命令。這表示擁有該權限的用戶不能選擇或者修改存儲在其他用戶表中的數據,但是可以修改表的定義或甚至刪除該表。

    EXPORT

    該權限授權通過 EXPORT TABLE 命令導出數據庫中的活動。注意,除了該權限,用戶仍需要將要導出的源表 SELECT 權限。

    IMPORT

    該權限授權通過 IMPORT TABLE 命令導入數據庫中的活動。注意,除了該權限,用戶仍需要將要導入的目標表 SELECT 權限。

    INIFILE ADMIN

    該權限授權修改系統設置的不同方式。

    LICENSE ADMIN

    該權限授權 SET SYSTEM LICENSE 命令安裝一個新的許可。

    LOG ADMIN

    該權限授權 ALTER SYSTEM LOGGING [ON|OFF] 命令啟用或禁用 刷新日志機制。

    MONITOR ADMIN

    該權限授權關于 EVENT 的 ALTER SYSTEM 命令。

    OPTIMIZER ADMIN

    該權限授權關于 SQL PLAN CACHE 和 ALTER SYSTEM 的 ALTER SYSTEM 命令。

    UPDATE STATISTICS 命令影響查詢優化器的行為。

    RESOURCE ADMIN

    該權限授權關于資源,例如 ALTER SYSTEM RECLAIM、 DATAVOLUME 和 ALTER SYSTEM RESET

    MONITORING VIEW 的命令,并且授權 Management Console 中的許多命令。

    ROLE ADMIN

    該權限授權使用 CREATE ROLE 命令創建和刪除角色。同時也授權使用 GRANT 和 REVOKE 命令授予和撤銷角色。

    SAVEPOINT ADMIN

    該權限使用 ALTER SYSTEM SAVEPOINT 命令授權保存點流程的執行。

    SCENARIO ADMIN

    該權限授權所有計算場景相關的活動,包括新建。

    SERVICE ADMIN

    該權限授權 ALTER SYSTEM [START|CANCEL|RECONFIGURE] 命令,用于管理數據庫中的系統服務。

    SESSION ADMIN

    該權限授權會話相關的 ALTER SYSTEM 命令 ,停止或重新連接用戶會話或者修改會話參數。

    STRUCTUREDPRIVILEGE ADMIN

    該權限授權結構化權限的創建、重新激活和刪除。

    TRACE ADMIN

    該權限授權數據庫追蹤文件的操作 ALTER SYSTEM [CLEAR|REMOVE] TRACES 命令。

    USER ADMIN

    該權限授權使用 CREATE USER, ALTER USER, and DROP 命令創建和修改用戶。

    VERSION ADMIN

    該權限授權多版本并發控制(MVCC) ALTER SYSTEM RECLAIM VERSION SPACE command 命令。

    .

    SAP HANA 數據庫組件可以創建自己需要的權限。這些權限使用組件名作為系統權限的第一標識符,使用組件-權限-名字作為第二標識符。目前元庫使用該特點。有關名為 REPO.的權限,請參閱元庫手冊。

    <schema_privilege> ::=CREATE ANY| DEBUG| DELETE| DROP| EXECUTE| INDEX| INSERT| SELECT| TRIGGER| UPDATE

    數據集合權限用于集合和存儲在該集合中對象的訪問和修改。集合權限的定義如下:

    CREATE ANY

    該權限允許用戶在數據庫中創建各種對象,尤其是表、視圖、序列、同義詞、 SQL 腳本、或者存儲過程。

    DELETE, DROP, EXECUTE, INDEX, INSERT, SELECT, UPDATE

    指定的權限被授予每個目前和以后存儲在集合中的每個對象。有關權限詳細說明,請參閱下面的描述對象權限的部分,請檢查以下權限適用于哪些類型的對象。

    <object_privilege> ::=ALL PRIVILEGES| ALTER| DEBUG| DELETE| DROP| EXECUTE| INDEX| INSERT| SELECT| TRIGGER| UPDATE| .

    對象權限用于限制用戶訪問和修改數據庫對象,例如表、 視圖、序列或者存儲過程以及諸如此類。并不是所有的這些權限適用于所有類型的數據庫對象。

    對于對象類型允許的權限,見下表。

    對象權限的定義如下:

    ALL PRIVILEGES

    該權限為所有 DDL(數據定義語言)和 DML(數據操縱語言)權限的組合。該權限一方面是授予人目前有的和允許進一步授予的權限,另一方面,特定對象上可以被授予的權限。該組合為給定的授予人和對象進行動態評估。 ALL PRIVILEGES 適用于表或試圖。

    ALTER

    該 DDL 權限授權對象的 ALTER 命令。

    DEBUG

    該 DML 權限授權 存儲過程或者計算視圖的調試功能。

    DELETE

    該 DML 權限授權對象的 DELETE 和 TRUNCATE 命令。

    DROP

    該 DDL 權限授權對象的 DROP 命令。

    EXECUTE

    該 DML 權限授權 SQL Script 函數或者使用 CALLS 或 CALL 命令的存儲過程。

    INDEX

    該 DDL 權限授權對象索引的創建、修改或者刪除。

    INSERT

    該 DML 權限授權對象的 INSERT 命令。 INSERT 連同 UPDATE 權限一起允許使用對該對象的 REPLACE

    和 UPSERT 命令。

    SELECT

    該 DML 權限授予對象的 SELECT 命令或者序列的使用。

    TRIGGER

    該 DDL 權限授權指定表或者指定集合中表的 CREATE TRIGGER / DROP TRIGGER 命令。

    UPDATE

    該 DML 權限授權對象的 UPDATE 命令 INSERT 連同 UPDATE 權限一起允許使用對該對象的 REPLACE

    和 UPSERT 命令。

    .

    SAP HANA 數據庫組件可以創建自己需要的權限。這些權限使用組件名作為系統權限的第一標識符,使用組件-權限-名字作為第二標識符。目前元庫使用該特點。有關名為 REPO.的權限,請參閱元庫手冊。

    對視圖的 DELETE, INSERT and UPDATE 操作只適用于可更新的視圖,表示這些視圖遵守這樣的一些限制:不包含聯接、 UNION,沒有聚合以及進一步的一些限制。

    DEBUG 只對計算視圖適用,而非其他類型的視圖。

    這些限制適用于同義詞,以及同義詞代表的對象也適用。

    <object_name> ::=<table_name>| <view_name>| <sequence_name>| <procedure_name>| <synonym_name>

    對象權限用于限制用戶訪問和修改數據庫對象,例如表、 視圖、序列、存儲過程和同義詞。

    :: =<user_name>| <role_name>

    grantee 可以是一個用戶或者角色。在權限或角色授予角色的情況下,角色授予的所有用戶,將有指定的權限或角色。

    角色是權限的一個命名集合,可以授予一個用戶或角色。

    如果你想允許多個數據庫用戶執行相同的操作,你可以創建一個角色,授予該角色所需的權限,并將角色授予不同的數據庫用戶。

    當授予角色給角色時,將建立一顆角色樹。當將一個角色?授予另一個角色或者用戶(G) , G 將擁有所有直接授予 R 的權限和角色。

    描述:

    GRANT 用于授予權限和結構化權限給用戶和角色,也用于授予權限給用戶和其他角色。

    指定的用戶、角色、對象和結構化權限必須在使用 GRANT 命令前已經存在。

    只有擁有權限并且允許進一步授予權限的用戶才能授予權限。每個擁有 ROLE ADMIN 權限的用戶允許授予角色給其他角色和用戶。

    用戶不能授予自己權限。

    SYSTEM 用戶有至少一個系統權限和 PUBLIC 角色。所有其他用戶也有 PUBLIC 角色。這些權限和角色不能自己撤銷。

    雖然 SYSTEM 用戶擁有許多權限,該用戶不能選擇或者修改其他用戶的表,如果他沒有顯式地授權可以這樣做。

    SYSTEM 用戶有在自己默認集合中創建對象的權限,名字和用戶本身一樣。

    對于由用戶創建的表,他們擁有所有權限并且可以將權限授予給用戶和角色。

    對依賴于例如基于表的視圖的其他對象,可能發生的是用戶如果沒有底層對象的權限則在依賴對象也沒有權限。或者可能發生的是用戶有權限,但是不允許進一步授權。該用戶將不能授予這些權限。

    WITH ADMIN OPTION 和 WITH GRANT OPTION 指定了已分配的權限可以被特定的用戶進一步分配,或者被擁有指定角色的用戶分配。

    使用 GRANT STRUCTURED PRIVILEGE <structured_privilege_name>,一個之前定義過的分析權限(基于通用結構化權限)被分配給用戶或角色。該分析權限用于限制只讀訪問分析視圖、屬性視圖和計算視圖特定的數據,通過過濾屬性值。

    系統和監控視圖:

    USERS: 顯示所有用戶、用戶的創建者、創建時間和當前狀態的信息。

    ROLES:顯示所有角色、它們的創建者和創建時間。

    GRANTED_ROLES:顯示每個用戶或角色被授予的角色。

    GRANTED_PRIVILEGES:顯示每個用戶或角色被授予的權限。

    例子:

    假設已經創建了擁有創建集合、角色和用戶權限的用戶,他新建了數據集合:

    CREATESCHEMA myschema;

    另外,他還在該集合中新建了一張名為 work_done 的表。

    CREATETABLE myschema.work_done (t TIMESTAMP, userNVARCHAR (256), work_done VARCHAR (256);

    他創建了一個新的用戶 named worker,在可能使用給定的密碼和名為role_for_work_on_my_schema 的角色連接數據庫

    CREATEUSER worker PASSWORD His_Password_1;

    CREATE ROLE role_for_work_on_my_schema;

    他將其集合下所有對象的 SELECT 權限授予 role_for_work_on_my_schema 角色:

    GRANTSELECTONSCHEMA myschema TO role_for_work_on_my_schema;

    另外,用戶將表 work_done to 的 INSERT 權限授予 role_for_work_on_my_schema 角色:

    GRANTINSERTON myschema.work_done TO role_for_work_on_my_schema;

    接著,他將角色授予新的用戶:

    GRANT role_for_work_on_my_schema TO worker WITHGRANTOPTION;

    另外, worker 用戶被直接授予表刪除權限。該權限的選項允許進一步授予此權限。

    GRANTDELETEON myschema.work_done TO worker;

    現在,用戶將創建任何類型對象的權限授予 worker 用戶:

    GRANTCREATEANYONSCHEMA myschema TO worker;

    結果, worker 用戶擁有集合 myschema 下所有表和視圖的 SELECT 權限,表 myschema.work_done的 INSERT 和 DELETE 權限,以及在集合 myschema 下創建對象的權限。另外,該用戶允許授予表myschema.work_done 的 DELETE 權限給其他用戶和角色。

    第二個例子中,用戶有相應的權限,包括允許進一步授予權限、將系統權限 INIFILE ADMIN 和TRACE ADMIN 授予已有的用戶 worker。他允許 worker 進一步授予這些權限。

    GRANT INIFILE ADMIN, TRACE ADMIN TO worker WITH ADMIN OPTION;

    7.6.10 REVOKE
    語法:

    REVOKE <system_privilege>,… FROM || REVOKE <schema_privilege>,… ON SCHEMA <schema_name> FROM | REVOKE <object_privilege>,… ON <object_name> FROM | REVOKE <role_name>,… FROM | REVOKE STRUCTURED PRIVILEGE <privilege_name> FROM

    語法元素:

    有關語法元素的定義,參見 GRANT。

    描述:

    REVOKE 語句撤銷指定的角色或者結構化權限或者從指定用戶或角色的指定對象中撤銷權限。

    只有擁有授權的用戶可以撤銷該權限。這對于有 ROLE ADMIN 的用戶和角色的撤銷也一樣。

    SYSTEM 用戶有至少一個系統權限和 PUBLIC 角色。所有其他用戶也有 PUBLIC 角色。這些權限和角色不能自己撤銷。

    如果用戶也被授予一個角色,就不可能撤銷屬于該角色的一些權限。這種情況下,必須撤銷所有角色,并且需要用戶已授予給他的權限。

    如果一個角色授予用戶或角色,在角色刪除時將被撤銷。撤銷角色可能會導致一些視圖無法訪問或者存儲過程再也不工作,如果一個視圖或存儲過程依賴于該角色中的任意權限,會發生這種情況。

    撤銷已用 WITH GRANT OPTION 或 WITH ADMIN OPTION 授權的權限將導致不僅從指定的用戶中撤銷,也將從所有該用戶直接或間接授權給用戶和角色的權限中撤銷。

    由于權限可以用個不同的用戶授給用戶或角色,用戶撤銷該權限并一定意味著,該用戶將失去這權限。有關語法元素的詳請,請參見 GRANT。

    系統和監控視圖:

    USERS: 顯示所有用戶、用戶的創建者、創建時間和當前狀態的信息。

    ROLES:顯示所有角色、它們的創建者和創建時間。

    GRANTED_ROLES:顯示每個用戶或角色被授予的角色。

    GRANTED_PRIVILEGES:顯示每個用戶或角色被授予的權限。

    例子:

    假設用戶已經執行如下語句:

    CREATEUSER worker PASSWORD His_Password_1;

    CREATE ROLE role_for_work_on_my_schema;

    CREATETABLE myschema.work_done (t TIMESTAMP, userNVARCHAR (256), work_done VARCHAR (256);

    GRANTSELECTONSCHEMA myschema TO role_for_work_on_my_schema;

    GRANTINSERTON myschema.work_done TO role_for_work_on_my_schema;

    GRANT role_for_work_on_my_schema TO worker;

    GRANT TRACE ADMIN TO worker WITH ADMIN OPTION;

    GRANTDELETEON myschema.work_done TO worker WITHGRANTOPTION;

    已授權的用戶允許撤銷這些權限。他從角色中撤銷權限,因此,暗示著從所有已授予角色的用戶撤銷權限。另外, worker 用戶將不再有 TRACE ADMIN 權限。撤銷權限將導致撤回操作發生至worker 用戶授予該權限的所有用戶。

    REVOKESELECTONSCHEMA myschema FROM role_for_work_on_my_schema;

    REVOKE TRACE ADMIN FROM worker;

    7.7數據導入導出語句
    7.7.1 EXPORT
    語法:

    EXPORT <object_name_list> AS <export_format> INTO [WITH <export_option_list>]

    語法元素:

    WITH <export_option_list>:

    可以使用 WITH 子句傳入 EXPORT 選項。

    <object_name_list> ::= <OBJECT_NAME>,… | ALL

    <export_import_format> ::= BINARY | CSV

    ::= ‘FULL_PATH’

    <export_option_list> ::= <export_option> | <export_option_list> <export_option>

    <export_option> ::=REPLACE |CATALOG ONLY |NO DEPENDENCIES |SCRAMBLE [BY ] |THREADS <number_of_threads>

    描述:

    EXPORT 命令以指定的格式 BINARY 或者 CSV,導出表、視圖、列視圖、同義詞、序列或者存儲過程。臨時表的數據和"no logging"表不能使用 EXPORT 導出表。

    OBJECT_NAME

    將導出對象的 SQL 名。欲導出所有集合下的所有對象,你要使用 ALL 關鍵字。如果你想導出指定集合下的對象,你應該使用集合名和星號,如"SYSTEM"."*"。

    BINARY

    表數據將以內部 BINARY 格式導出。使用這種方式導出數據比以 CSV 格式快幾個數量級。只有列式表可以以二進制格式導出。行式表總是以 CSV 格式導出,即使指定了 BINARY 格式。

    CSV

    表數據將以 CSV 格式導出。導出的數據可以導入至其他數據庫中。另外,導出的數據順序可能被打亂。列式和行式表都可以以 CSV 格式導出。

    FULL_PATH

    將導出的服務器路徑。

    注意:當使用分布式系統, FULL_PATH 必須指向一個共享磁盤。由于安全性原因,路徑可能不包含符號鏈接,也可能不指向數據庫實例的文件夾內,除了’backup’ 和 'work’子文件夾。有效路徑(假設數據庫實例位于/usr/sap/HDB/HDB00)的例子:

    ‘/tmp’

    ‘/usr/sap/HDB/HDB00/backup’

    ‘/usr/sap/HDB/HDB00/work’

    REPLACE

    使用 REPLACE 選項,之前導出的數據將被刪除,而保存最新導出的數據。如果未指定 REPLACE 選項,如果在指定目錄下存在先前導出的數據,將拋出錯誤。

    CATALOG ONLY

    使用 CATALOG ONLY 選項,只導出數據庫目錄,不含有數據。

    NO DEPENDENCIES

    使用 NO DEPENDENCIES 選項,將不導出已導出對象的相關對象。

    SCRAMBLE

    以 CSV 格式導出時,使用 SCRAMBLE [BY ‘’],可以擾亂敏感的客戶數據。當未指定額外的數據庫,將使用默認的擾亂密碼。只能擾亂字符串數據。導入數據時,擾亂數據將以亂序方式導入,使最終用戶無法讀取數據,并且不可能回復原狀。

    THREADS

    表示用于并行導出的線程數。

    使用的線程數

    給定 THREADS 數目指定并行導出的對象數,默認為 1。增加數字可能減少導出時間,但也會影響系統性能。

    應當考慮如下:

    ? 對于單個表, THREADS 沒有效果。

    ? 對于視圖或者存儲過程,應使用2 個或更多的線程(最多取決于對象數)。

    ? 對于整個集合,考慮使用多余10 個線程(最多取決于系統內核數)。

    ? 對于整個 BW / ERP 系統( ALL 關鍵字)的上千張表,數量大的線程是合理的(最多 256)。

    系統和監控視圖:

    你可以使用系統視圖 M_EXPORT_BINARY_STATUS 監控導出的進度。

    你可以在如下語句中,使用會話 ID 從相應的視圖中終止導出會話。

    ALTERSYSTEM CANCEL [WORKIN] SESSION ‘sessionId’

    導出的詳細結果存儲在本地會話臨時表#EXPORT_RESULT。

    例子:

    EXPORT"SCHEMA"."*"AS CSV INTO’/tmp’WITHREPLACE SCRAMBLE THREADS 10

    7.7.2 IMPORT
    語法:

    IMPORT <object_name_list> [AS <import_format>] FROM [WITH <import_option_list>]

    語法元素:

    WITH <import_option_list>:可以使用 WITH 子句傳入 IMPORT 選項。

    <object_name_list> ::= <object_name>,… | ALL

    <import_format> ::= BINARY | CSV

    ::= ‘FULL_PATH’

    <import_option_list> ::= <import_option> | <import_option_list> <import_option>

    <import_option> ::=REPLACE |CATALOG ONLY |NO DEPENDENCIES |THREADS <number_of_threads>

    描述:

    IMPORT 命令導入表、視圖、列視圖、同義詞、序列或者存儲過程。臨時表的數據和"no logging"表不能使用 IMPORT 導入。

    OBJECT_NAME

    將導入對象的 SQL 名。欲導入路徑中的所有對象,你要使用 ALL 關鍵字。如果你想將對象導入至指定集合下,你應該使用集合名和星號,如"SYSTEM"."*"。

    BINARY | CSV

    導入過程可能忽略格式的定義,因為在導入過程中,將自動檢測格式。將以導出的同樣格式導入。

    FULL_PATH

    從該服務器路徑導入。

    注意:當使用分布式系統, FULL_PATH 必須指向一個共享磁盤。如果未指定 REPLACE 選項,在指定目錄下存在相同名字的表,將拋出錯誤。

    CATALOG ONLY

    使用 CATALOG ONLY 選項,只導入數據庫目錄,不含有數據。

    NO DEPENDENCIES

    使用 NO DEPENDENCIES 選項,將不導入已導入對象的相關對象。

    THREADS

    表示用于并行導入的線程數。

    使用的線程數

    給定 THREADS 數目指定并行導入的對象數,默認為 1。增加數字可能減少導入時間,但也會影響系統性能。

    應當考慮如下:

    ? 對于單個表, THREADS 沒有效果。

    ? 對于視圖或者存儲過程,應使用2 個或更多的線程(最多取決于對象數)。

    ? 對于整個集合,考慮使用多余10 個線程(最多取決于系統內核數)。

    ? 對于整個 BW / ERP 系統( ALL 關鍵字)的上千張表,數量大的線程是合理的(最多 256)。

    系統和監控視圖:

    你可以使用系統視圖 M_IMPORT_BINARY_STATUS 監控導入的進度。

    你可以在如下語句中,使用會話 ID 從相應的視圖中終止導入會話。

    ALTER SYSTEM CANCEL [WORK IN] SESSION ‘sessionId’

    導入的詳細結果存儲在本地會話臨時表#IMPORT_RESULT。

    7.7.3 IMPORT FROM
    語法:

    IMPORT FROM [<file_type>] <file_path> [INTO <table_name>] [WITH <import_from_option_list>]

    語法元素:

    WITH <import_from_option_list>:

    可以使用 WITH 子句傳入 IMPORT FROM 選項。

    <file_path> ::= ‘…’

    <table_name> ::= [<schema_name>.]

    <import_from_option_list> ::= <import_from_option> | <import_from_option_list> <import_from_option>

    <import_from_option> :: =THREADS <number_of_threads> |BATCH <number_of_records_of_each_commit> |TABLE LOCK |NO TYPE CHECK |SKIP FIRST <number_of_rows_to_skip>
    ROW |COLUMN LIST IN FIRST ROW |COLUMN LIST ( <column_name_list> ) |RECORD DELIMITED BY ‘<string_for_record_delimiter>’ |FIELD DELIMITED BY ‘<string_for_field_delimiter>’ |OPTIONALLY ENCLOSED BY ‘<character_for_optional_enclosure>’ |DATE FORMAT ‘<string_for_date_format>’ |TIME FORMAT ‘<string_for_time_format>’ |TIMESTAMP FORMAT ‘<string_for_timestamp_format>’ |

    描述:

    IMPORT FROM 語句將外部 csv 文件的數據導入至一個已有的表中。

    THREADS:表示可以用于并行導出的線程數。默認值為 1,最大值為 256。

    BATCH:表示每個提交中可以插入的記錄數。

    THREADS 和 BATCH 可以通過啟用并行加載和一次提交多條記錄,實現加載的高性能。一般而言,對于列式表, 10 個并行加載線程以及 10000 條記錄的提交頻率是比較好的設置。

    TABLE LOCK:鎖住表為了更快的導入數據至列式表。如果指定了 NO TYPE CHECK,記錄將在插入時,不檢查每個字段的類型。

    SKIP FIRST ROW:跳過插入前 n 條記錄。

    COLUMN LIST IN FIRST ROW:表示在 CSV 文件中第一行的列。

    COLUMN LIST ( <column_name_list> ):表示將要插入的字段列表。

    RECORD DELIMITED BY ‘’:表示 CSV 文件中的記錄分隔符。

    FIELD DELIMITED BY ‘’:表示 CSV 文件中的字段分隔符。

    OPTIONALLY ENCLOSED BY ‘’:表示字段數據的可選關閉符。

    DATE FORMAT ‘’:表示字符的日期格式。如果 CSV 文件有日期類型,將為日期類型字段使用指定的格式。

    TIME FORMAT ‘’:表示字符的時間格式。如果 CSV 文件有時間類型,將為時間類型字段使用指定的格式。

    TIMESTAMP FORMAT ‘’:表示字符的時間戳格式。如果 CSV 文件有時間戳類型,將為日期類型字段使用指定的格式。

    例子:

    IMPORTFROM CSV FILE ‘/data/data.csv’INTO"MYSCHEMA"."MYTABLE"WITH RECORD DELIMITED BY’\n’ FIELD DELIMITED BY’,’

    總結

    以上是生活随笔為你收集整理的hana SQL函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久久久久成人片免费观看蜜芽 | 蜜臀aⅴ国产精品久久久国产老师 | 麻花豆传媒剧国产免费mv在线 | 自拍偷自拍亚洲精品10p | 老熟妇仑乱视频一区二区 | 日日噜噜噜噜夜夜爽亚洲精品 | 97久久国产亚洲精品超碰热 | 久久人人爽人人爽人人片av高清 | 特级做a爰片毛片免费69 | 国产内射爽爽大片视频社区在线 | 亚洲综合色区中文字幕 | 精品国产一区二区三区四区 | 久久精品国产大片免费观看 | 成人欧美一区二区三区黑人 | 亚洲中文字幕av在天堂 | 国产精品久久国产三级国 | 四虎永久在线精品免费网址 | 欧美真人作爱免费视频 | 任你躁国产自任一区二区三区 | 国产无遮挡又黄又爽免费视频 | 精品无码国产一区二区三区av | 沈阳熟女露脸对白视频 | 性生交片免费无码看人 | 久久久久av无码免费网 | 狠狠噜狠狠狠狠丁香五月 | 成 人 免费观看网站 | 国产无av码在线观看 | 久久久成人毛片无码 | 欧美喷潮久久久xxxxx | 大胆欧美熟妇xx | 日本丰满护士爆乳xxxx | 成人无码视频免费播放 | 国产欧美亚洲精品a | 内射爽无广熟女亚洲 | 国产激情无码一区二区app | 国产av一区二区精品久久凹凸 | 永久免费观看美女裸体的网站 | 久久午夜无码鲁丝片 | 乱人伦人妻中文字幕无码 | 性生交大片免费看女人按摩摩 | 对白脏话肉麻粗话av | 熟女俱乐部五十路六十路av | 99re在线播放 | 午夜男女很黄的视频 | 欧美乱妇无乱码大黄a片 | 激情综合激情五月俺也去 | 熟女少妇在线视频播放 | 国产精品a成v人在线播放 | 国产精品丝袜黑色高跟鞋 | 国产激情一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 亚洲人交乣女bbw | 岛国片人妻三上悠亚 | 国产又爽又黄又刺激的视频 | 亚洲精品一区二区三区在线 | 亚洲精品国产a久久久久久 | 久久久久久国产精品无码下载 | 亚洲欧美日韩成人高清在线一区 | 午夜精品一区二区三区在线观看 | 亚洲欧洲日本无在线码 | 男女猛烈xx00免费视频试看 | 我要看www免费看插插视频 | 中文字幕人妻无码一夲道 | 欧美人与物videos另类 | 中文字幕人妻丝袜二区 | 偷窥村妇洗澡毛毛多 | 国产亚洲人成在线播放 | 免费观看激色视频网站 | 天天爽夜夜爽夜夜爽 | 国产在线无码精品电影网 | 欧美亚洲日韩国产人成在线播放 | 成人免费视频在线观看 | 牛和人交xxxx欧美 | 性色av无码免费一区二区三区 | 网友自拍区视频精品 | 久久99精品久久久久久动态图 | 丰满少妇熟乱xxxxx视频 | 国产无遮挡吃胸膜奶免费看 | 大地资源中文第3页 | 亚洲精品久久久久中文第一幕 | www成人国产高清内射 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 巨爆乳无码视频在线观看 | 人妻少妇被猛烈进入中文字幕 | 日欧一片内射va在线影院 | 亚洲成av人片天堂网无码】 | 国产在线精品一区二区三区直播 | 欧美人与善在线com | 最近的中文字幕在线看视频 | 丰满少妇女裸体bbw | 国产做国产爱免费视频 | 国产猛烈高潮尖叫视频免费 | 精品久久久无码人妻字幂 | 亚洲中文字幕成人无码 | 久久久久久久久蜜桃 | 少妇无码av无码专区在线观看 | 少妇高潮一区二区三区99 | 丰满少妇熟乱xxxxx视频 | 国产精品久久福利网站 | 色综合久久久久综合一本到桃花网 | 亚洲aⅴ无码成人网站国产app | 在线a亚洲视频播放在线观看 | 无码国产激情在线观看 | 小sao货水好多真紧h无码视频 | 国产欧美亚洲精品a | 久久久精品成人免费观看 | 又大又硬又黄的免费视频 | 中文字幕乱码人妻无码久久 | 亚洲一区二区三区播放 | 97夜夜澡人人双人人人喊 | 久久人妻内射无码一区三区 | 日韩视频 中文字幕 视频一区 | 熟女俱乐部五十路六十路av | 久久综合香蕉国产蜜臀av | 久热国产vs视频在线观看 | 亚洲综合精品香蕉久久网 | 牲交欧美兽交欧美 | 亚洲精品成人av在线 | 露脸叫床粗话东北少妇 | 四虎4hu永久免费 | 免费观看又污又黄的网站 | 鲁大师影院在线观看 | 久久久久亚洲精品男人的天堂 | 丝袜人妻一区二区三区 | a在线观看免费网站大全 | 国产精品.xx视频.xxtv | 亚洲一区二区三区 | 午夜精品久久久内射近拍高清 | 丰满护士巨好爽好大乳 | 日本精品少妇一区二区三区 | 久久久中文字幕日本无吗 | 麻豆精产国品 | 国产又粗又硬又大爽黄老大爷视 | 又紧又大又爽精品一区二区 | 久久久亚洲欧洲日产国码αv | 理论片87福利理论电影 | 国产精品无码久久av | 国产特级毛片aaaaaa高潮流水 | 扒开双腿疯狂进出爽爽爽视频 | 久久亚洲日韩精品一区二区三区 | 国产偷抇久久精品a片69 | 午夜精品久久久久久久 | 性色欲网站人妻丰满中文久久不卡 | 99精品无人区乱码1区2区3区 | 77777熟女视频在线观看 а天堂中文在线官网 | 色老头在线一区二区三区 | 中文字幕无码免费久久9一区9 | 久激情内射婷内射蜜桃人妖 | 欧美freesex黑人又粗又大 | 亚洲a无码综合a国产av中文 | 亚洲精品久久久久avwww潮水 | 日日麻批免费40分钟无码 | 正在播放东北夫妻内射 | 一本久道久久综合狠狠爱 | 亚洲aⅴ无码成人网站国产app | 欧美人与禽zoz0性伦交 | 国产小呦泬泬99精品 | 成人毛片一区二区 | 国产偷抇久久精品a片69 | 啦啦啦www在线观看免费视频 | 性做久久久久久久免费看 | 国产精品18久久久久久麻辣 | 亚洲另类伦春色综合小说 | 牲交欧美兽交欧美 | 亚洲s色大片在线观看 | 学生妹亚洲一区二区 | 免费乱码人妻系列无码专区 | 青青草原综合久久大伊人精品 | 人妻少妇被猛烈进入中文字幕 | 88国产精品欧美一区二区三区 | 男女性色大片免费网站 | 99re在线播放 | 国产一精品一av一免费 | 内射后入在线观看一区 | 午夜肉伦伦影院 | av无码不卡在线观看免费 | 99视频精品全部免费免费观看 | 亚洲精品一区二区三区婷婷月 | 国产人妻人伦精品1国产丝袜 | 日韩精品久久久肉伦网站 | 中文字幕乱码亚洲无线三区 | 精品亚洲成av人在线观看 | 东京热一精品无码av | 亚洲熟女一区二区三区 | 无码人妻出轨黑人中文字幕 | 77777熟女视频在线观看 а天堂中文在线官网 | 99久久精品日本一区二区免费 | 亚洲精品一区二区三区婷婷月 | 国产艳妇av在线观看果冻传媒 | 荫蒂被男人添的好舒服爽免费视频 | 任你躁在线精品免费 | 精品无码一区二区三区爱欲 | 一二三四在线观看免费视频 | 2020最新国产自产精品 | 欧美xxxx黑人又粗又长 | 人人妻人人澡人人爽人人精品浪潮 | 久久精品国产一区二区三区肥胖 | 狠狠噜狠狠狠狠丁香五月 | 婷婷综合久久中文字幕蜜桃三电影 | 久久久久久亚洲精品a片成人 | 日本熟妇乱子伦xxxx | yw尤物av无码国产在线观看 | 精品无码av一区二区三区 | 永久免费观看国产裸体美女 | 未满小14洗澡无码视频网站 | 国产精品久久久久无码av色戒 | 国产精品久久精品三级 | 全球成人中文在线 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 日日夜夜撸啊撸 | 99精品视频在线观看免费 | 在线天堂新版最新版在线8 | 国产网红无码精品视频 | 欧洲极品少妇 | 女人被男人躁得好爽免费视频 | 欧美日韩综合一区二区三区 | av在线亚洲欧洲日产一区二区 | 福利一区二区三区视频在线观看 | 天堂亚洲免费视频 | 人妻互换免费中文字幕 | 一二三四社区在线中文视频 | 日韩视频 中文字幕 视频一区 | 精品一区二区三区波多野结衣 | 男女爱爱好爽视频免费看 | 国产精品久久久久影院嫩草 | 国产精品无码mv在线观看 | 国产精品毛多多水多 | 国产午夜无码精品免费看 | www一区二区www免费 | 亚洲国产精华液网站w | 亚洲自偷自偷在线制服 | 一本无码人妻在中文字幕免费 | 成人欧美一区二区三区黑人 | 精品国产精品久久一区免费式 | 未满成年国产在线观看 | 久久久久久久久888 | 精品久久久久久亚洲精品 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 欧美日韩在线亚洲综合国产人 | 国产va免费精品观看 | 亚洲色大成网站www国产 | 欧美野外疯狂做受xxxx高潮 | 中文字幕人妻丝袜二区 | 国产两女互慰高潮视频在线观看 | 荫蒂被男人添的好舒服爽免费视频 | 国产精华av午夜在线观看 | 中文字幕无码免费久久9一区9 | 色妞www精品免费视频 | 曰韩无码二三区中文字幕 | 久青草影院在线观看国产 | 99精品视频在线观看免费 | 国产精品美女久久久 | 色综合视频一区二区三区 | 成人试看120秒体验区 | 精品国产精品久久一区免费式 | 又紧又大又爽精品一区二区 | 久久午夜夜伦鲁鲁片无码免费 | 久久国产精品偷任你爽任你 | 波多野结衣av一区二区全免费观看 | 成人aaa片一区国产精品 | 波多野结衣 黑人 | 亚洲国产精品久久久久久 | 欧美丰满熟妇xxxx性ppx人交 | 中文字幕乱码人妻二区三区 | 亚洲 另类 在线 欧美 制服 | 未满成年国产在线观看 | 无人区乱码一区二区三区 | 最新版天堂资源中文官网 | 国产av无码专区亚洲awww | 十八禁真人啪啪免费网站 | 丰满人妻翻云覆雨呻吟视频 | 亚洲精品一区三区三区在线观看 | 久久精品无码一区二区三区 | 日本饥渴人妻欲求不满 | 国产精品亚洲lv粉色 | 免费无码av一区二区 | 动漫av一区二区在线观看 | 国产亚洲精品久久久久久大师 | 国产亚洲精品久久久久久 | 无码人妻少妇伦在线电影 | 亚洲日韩av片在线观看 | 亚洲精品久久久久久一区二区 | 亚洲国产欧美日韩精品一区二区三区 | 国产九九九九九九九a片 | 亚洲成熟女人毛毛耸耸多 | 四虎国产精品免费久久 | 欧美日本日韩 | 午夜嘿嘿嘿影院 | 中文字幕乱码中文乱码51精品 | 97夜夜澡人人爽人人喊中国片 | 久久久精品国产sm最大网站 | 国产精品无码成人午夜电影 | 欧美亚洲国产一区二区三区 | 1000部夫妻午夜免费 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 日本乱人伦片中文三区 | 中文字幕乱码人妻二区三区 | 国产无遮挡又黄又爽免费视频 | 天天拍夜夜添久久精品大 | 无码人妻av免费一区二区三区 | 水蜜桃色314在线观看 | 中文字幕av伊人av无码av | 人妻少妇精品无码专区二区 | 老熟女重囗味hdxx69 | 国产在线精品一区二区三区直播 | 国产亚洲精品久久久ai换 | 国产麻豆精品一区二区三区v视界 | 人妻互换免费中文字幕 | 亚洲中文字幕乱码av波多ji | 粗大的内捧猛烈进出视频 | 色偷偷人人澡人人爽人人模 | 中文字幕亚洲情99在线 | 国产亚洲日韩欧美另类第八页 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 亚洲の无码国产の无码步美 | 日韩少妇内射免费播放 | 成年美女黄网站色大免费视频 | 亚洲欧美精品伊人久久 | 宝宝好涨水快流出来免费视频 | 欧美怡红院免费全部视频 | 色五月丁香五月综合五月 | 亚洲精品一区二区三区在线观看 | 久久久久久国产精品无码下载 | 日产国产精品亚洲系列 | 一个人看的www免费视频在线观看 | 久久亚洲中文字幕精品一区 | 性生交大片免费看女人按摩摩 | 成人无码精品1区2区3区免费看 | 亚洲自偷自拍另类第1页 | 亚无码乱人伦一区二区 | 免费无码av一区二区 | 丰满护士巨好爽好大乳 | 天天躁日日躁狠狠躁免费麻豆 | 一本色道婷婷久久欧美 | 欧美人与禽zoz0性伦交 | 国产精品人妻一区二区三区四 | 中文字幕无码免费久久9一区9 | 亚洲综合无码久久精品综合 | 国产精品毛多多水多 | 特大黑人娇小亚洲女 | 国产成人精品三级麻豆 | 久久午夜夜伦鲁鲁片无码免费 | aⅴ在线视频男人的天堂 | 国产av一区二区三区最新精品 | 四虎永久在线精品免费网址 | 天天拍夜夜添久久精品 | 国产亚洲欧美在线专区 | 特级做a爰片毛片免费69 | 欧美黑人乱大交 | 国产无遮挡又黄又爽免费视频 | 日本精品久久久久中文字幕 | 亚洲精品成人av在线 | 在线看片无码永久免费视频 | 无码人妻久久一区二区三区不卡 | 精品厕所偷拍各类美女tp嘘嘘 | 76少妇精品导航 | 51国偷自产一区二区三区 | 午夜无码人妻av大片色欲 | 欧美xxxx黑人又粗又长 | 国产两女互慰高潮视频在线观看 | 激情国产av做激情国产爱 | 夜夜影院未满十八勿进 | 十八禁视频网站在线观看 | 欧美丰满熟妇xxxx性ppx人交 | 一区二区三区乱码在线 | 欧洲 | 性色av无码免费一区二区三区 | 蜜桃av抽搐高潮一区二区 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产精品鲁鲁鲁 | 国产农村妇女高潮大叫 | 国产高清不卡无码视频 | 久久久久亚洲精品男人的天堂 | 国产亚洲精品久久久久久国模美 | 天天摸天天透天天添 | 亚洲精品国产品国语在线观看 | 最新国产乱人伦偷精品免费网站 | 亲嘴扒胸摸屁股激烈网站 | 青青久在线视频免费观看 | 亚洲国产精品久久人人爱 | 日本丰满熟妇videos | 亚洲娇小与黑人巨大交 | 捆绑白丝粉色jk震动捧喷白浆 | av小次郎收藏 | 日本精品人妻无码免费大全 | 老熟妇仑乱视频一区二区 | 日韩视频 中文字幕 视频一区 | 国产高清av在线播放 | 性欧美牲交在线视频 | 婷婷综合久久中文字幕蜜桃三电影 | 欧美人与禽猛交狂配 | 久久久精品成人免费观看 | 亚洲精品国产精品乱码视色 | 奇米影视7777久久精品人人爽 | 免费乱码人妻系列无码专区 | 国产97在线 | 亚洲 | 少妇被黑人到高潮喷出白浆 | 成人亚洲精品久久久久软件 | 国产精品a成v人在线播放 | 精品日本一区二区三区在线观看 | 国产亚洲精品久久久久久国模美 | 久久综合久久自在自线精品自 | 强伦人妻一区二区三区视频18 | 久久精品国产一区二区三区肥胖 | 西西人体www44rt大胆高清 | 97精品人妻一区二区三区香蕉 | 日韩精品成人一区二区三区 | 亚洲成av人片天堂网无码】 | 少妇人妻偷人精品无码视频 | 国产美女精品一区二区三区 | 欧美 亚洲 国产 另类 | 亚洲熟妇色xxxxx欧美老妇 | 久久aⅴ免费观看 | 中文字幕av日韩精品一区二区 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产免费久久精品国产传媒 | 中文字幕人成乱码熟女app | 亚洲爆乳大丰满无码专区 | 欧美性色19p | 亚洲国产日韩a在线播放 | 欧美日韩色另类综合 | 欧美阿v高清资源不卡在线播放 | 日本熟妇人妻xxxxx人hd | 中文精品久久久久人妻不卡 | 国内精品九九久久久精品 | 青春草在线视频免费观看 | 又大又紧又粉嫩18p少妇 | 俺去俺来也www色官网 | 国产精品久久久久9999小说 | 婷婷丁香五月天综合东京热 | 国产美女精品一区二区三区 | 免费播放一区二区三区 | 偷窥村妇洗澡毛毛多 | 一本无码人妻在中文字幕免费 | 国内少妇偷人精品视频免费 | 久久成人a毛片免费观看网站 | 自拍偷自拍亚洲精品10p | 狠狠综合久久久久综合网 | 亚洲欧洲日本综合aⅴ在线 | 超碰97人人做人人爱少妇 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 久久 国产 尿 小便 嘘嘘 | 国产精品美女久久久网av | 无码毛片视频一区二区本码 | www国产亚洲精品久久久日本 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲日本va中文字幕 | 日本精品人妻无码免费大全 | 国产精品自产拍在线观看 | 伊人久久大香线蕉亚洲 | 国产绳艺sm调教室论坛 | 国产成人无码午夜视频在线观看 | 欧美性猛交xxxx富婆 | 婷婷五月综合缴情在线视频 | 亚洲理论电影在线观看 | av在线亚洲欧洲日产一区二区 | 99久久精品日本一区二区免费 | 久久国产36精品色熟妇 | 国产三级精品三级男人的天堂 | 蜜臀aⅴ国产精品久久久国产老师 | 97夜夜澡人人爽人人喊中国片 | 大屁股大乳丰满人妻 | 丰满少妇熟乱xxxxx视频 | 欧洲熟妇色 欧美 | 无码人妻丰满熟妇区毛片18 | 国产精品-区区久久久狼 | 强开小婷嫩苞又嫩又紧视频 | 狂野欧美性猛xxxx乱大交 | 一本久道高清无码视频 | 少妇性l交大片欧洲热妇乱xxx | 无码精品国产va在线观看dvd | 日韩av无码一区二区三区 | 一区二区传媒有限公司 | 国产精品人人妻人人爽 | a在线观看免费网站大全 | 少妇邻居内射在线 | 成人亚洲精品久久久久 | 国产办公室秘书无码精品99 | 蜜桃臀无码内射一区二区三区 | 伊人色综合久久天天小片 | 无码播放一区二区三区 | 国内精品人妻无码久久久影院 | 亚洲中文字幕在线观看 | 色综合视频一区二区三区 | 日韩人妻少妇一区二区三区 | 亚洲阿v天堂在线 | 丰满少妇熟乱xxxxx视频 | 国产乱人伦偷精品视频 | 久久久www成人免费毛片 | 亚洲春色在线视频 | 对白脏话肉麻粗话av | 亚洲精品久久久久中文第一幕 | 欧洲vodafone精品性 | 国产成人无码av一区二区 | 2019午夜福利不卡片在线 | 亚洲成在人网站无码天堂 | 国产精品爱久久久久久久 | 搡女人真爽免费视频大全 | 久久伊人色av天堂九九小黄鸭 | 小鲜肉自慰网站xnxx | 小sao货水好多真紧h无码视频 | 日产精品高潮呻吟av久久 | 亚洲 欧美 激情 小说 另类 | 国产后入清纯学生妹 | 日韩av激情在线观看 | 丝袜美腿亚洲一区二区 | 无码中文字幕色专区 | 亚洲 高清 成人 动漫 | 国产午夜福利100集发布 | 亚洲色欲色欲欲www在线 | 久久婷婷五月综合色国产香蕉 | 国内综合精品午夜久久资源 | 亚洲精品中文字幕乱码 | 久久久久99精品成人片 | 色一情一乱一伦一视频免费看 | 国产精品久久久久久亚洲毛片 | 一个人免费观看的www视频 | 欧美亚洲国产一区二区三区 | 欧美自拍另类欧美综合图片区 | 牲欲强的熟妇农村老妇女 | 一二三四社区在线中文视频 | 欧美色就是色 | 日本一卡二卡不卡视频查询 | 300部国产真实乱 | 国产电影无码午夜在线播放 | 一本久道久久综合婷婷五月 | 中文字幕日产无线码一区 | 伊人久久大香线焦av综合影院 | 蜜桃臀无码内射一区二区三区 | 中文无码精品a∨在线观看不卡 | 国产猛烈高潮尖叫视频免费 | 巨爆乳无码视频在线观看 | 久久国产精品二国产精品 | 国产午夜福利100集发布 | 日本大乳高潮视频在线观看 | 午夜无码人妻av大片色欲 | 成人精品视频一区二区三区尤物 | 狂野欧美性猛交免费视频 | 国产乱人伦偷精品视频 | 牲欲强的熟妇农村老妇女 | 精品 日韩 国产 欧美 视频 | 永久免费观看国产裸体美女 | 亚洲成色在线综合网站 | 精品无人区无码乱码毛片国产 | 国产在线一区二区三区四区五区 | 99久久精品日本一区二区免费 | 国产午夜视频在线观看 | 日本爽爽爽爽爽爽在线观看免 | 少妇性l交大片欧洲热妇乱xxx | 午夜精品久久久久久久久 | 天堂久久天堂av色综合 | 欧美freesex黑人又粗又大 | 一个人免费观看的www视频 | 97无码免费人妻超级碰碰夜夜 | 中文字幕+乱码+中文字幕一区 | 又紧又大又爽精品一区二区 | 久久99热只有频精品8 | 精品偷自拍另类在线观看 | 亚洲毛片av日韩av无码 | 国产成人一区二区三区在线观看 | 免费人成在线观看网站 | 桃花色综合影院 | 亚洲一区二区三区在线观看网站 | 亚洲综合久久一区二区 | 高清不卡一区二区三区 | 丝袜美腿亚洲一区二区 | 午夜精品一区二区三区的区别 | 高潮喷水的毛片 | 亚洲成在人网站无码天堂 | 在线欧美精品一区二区三区 | 天堂一区人妻无码 | 久久亚洲国产成人精品性色 | 亚洲一区av无码专区在线观看 | 亚洲精品国产品国语在线观看 | 人妻aⅴ无码一区二区三区 | 欧美性猛交内射兽交老熟妇 | 国产精品久久久av久久久 | 人人妻在人人 | 亚洲中文字幕无码中字 | 小鲜肉自慰网站xnxx | 影音先锋中文字幕无码 | 67194成是人免费无码 | 爽爽影院免费观看 | 国产猛烈高潮尖叫视频免费 | 东京一本一道一二三区 | 日本爽爽爽爽爽爽在线观看免 | 国产精品亚洲专区无码不卡 | 国产亲子乱弄免费视频 | 欧美日韩一区二区综合 | 亚洲欧美国产精品专区久久 | 久久久久成人片免费观看蜜芽 | 亚洲aⅴ无码成人网站国产app | 成熟女人特级毛片www免费 | 人妻天天爽夜夜爽一区二区 | 一本久久伊人热热精品中文字幕 | 最近中文2019字幕第二页 | 风流少妇按摩来高潮 | 99久久久国产精品无码免费 | 强奷人妻日本中文字幕 | 蜜桃av抽搐高潮一区二区 | 一本加勒比波多野结衣 | 国产成人精品一区二区在线小狼 | 国产乱子伦视频在线播放 | 欧美老熟妇乱xxxxx | 国产电影无码午夜在线播放 | 亚洲精品一区二区三区大桥未久 | 欧美老熟妇乱xxxxx | 亚洲国产精品无码一区二区三区 | 国产麻豆精品一区二区三区v视界 | 国产偷国产偷精品高清尤物 | 国产手机在线αⅴ片无码观看 | 亚洲欧美日韩综合久久久 | 欧洲美熟女乱又伦 | 无遮挡啪啪摇乳动态图 | 成 人影片 免费观看 | 黄网在线观看免费网站 | 国产特级毛片aaaaaa高潮流水 | 国内精品九九久久久精品 | 在线 国产 欧美 亚洲 天堂 | 午夜福利一区二区三区在线观看 | 红桃av一区二区三区在线无码av | 久久 国产 尿 小便 嘘嘘 | 亚洲成av人综合在线观看 | 亚洲中文无码av永久不收费 | 国产真人无遮挡作爱免费视频 | 国产亚洲精品久久久久久久久动漫 | 欧美老人巨大xxxx做受 | 中文字幕无码日韩欧毛 | 老头边吃奶边弄进去呻吟 | 欧美猛少妇色xxxxx | 免费中文字幕日韩欧美 | 又粗又大又硬毛片免费看 | 人妻少妇精品无码专区动漫 | 中文字幕无码免费久久99 | 久久精品女人天堂av免费观看 | 亚洲精品欧美二区三区中文字幕 | 人人澡人人透人人爽 | 天堂无码人妻精品一区二区三区 | 亚洲自偷自拍另类第1页 | 久久精品丝袜高跟鞋 | 欧洲vodafone精品性 | 久久国产精品萌白酱免费 | 一本大道久久东京热无码av | 成人亚洲精品久久久久 | 草草网站影院白丝内射 | 久久99精品久久久久久动态图 | 日产精品高潮呻吟av久久 | 国产一区二区三区影院 | а√资源新版在线天堂 | 久久国产精品_国产精品 | 性生交大片免费看女人按摩摩 | 日本爽爽爽爽爽爽在线观看免 | 国产两女互慰高潮视频在线观看 | 妺妺窝人体色www在线小说 | 好男人www社区 | 国模大胆一区二区三区 | 亚洲中文字幕无码中字 | 国产亚洲视频中文字幕97精品 | 亚洲а∨天堂久久精品2021 | 国产又粗又硬又大爽黄老大爷视 | 性欧美牲交xxxxx视频 | 少妇人妻偷人精品无码视频 | 亚洲日韩乱码中文无码蜜桃臀网站 | 色婷婷香蕉在线一区二区 | 国产熟女一区二区三区四区五区 | 野狼第一精品社区 | 日本一卡2卡3卡四卡精品网站 | 国产麻豆精品一区二区三区v视界 | 玩弄中年熟妇正在播放 | 中文字幕人妻丝袜二区 | 亚洲成熟女人毛毛耸耸多 | 天天拍夜夜添久久精品大 | 色老头在线一区二区三区 | 亚洲国产精品一区二区美利坚 | 国产精品久久福利网站 | 国产性生交xxxxx无码 | 无码人妻av免费一区二区三区 | 国产一区二区三区影院 | 国产精品99爱免费视频 | 伊人久久大香线蕉午夜 | 性啪啪chinese东北女人 | 日本熟妇乱子伦xxxx | 国产9 9在线 | 中文 | 精品国产国产综合精品 | 好屌草这里只有精品 | 亚洲精品国偷拍自产在线麻豆 | 久久久亚洲欧洲日产国码αv | 国产精品.xx视频.xxtv | av小次郎收藏 | 亚洲成av人综合在线观看 | 福利一区二区三区视频在线观看 | 日韩欧美中文字幕在线三区 | 午夜无码区在线观看 | 亚洲中文字幕无码中文字在线 | 亚洲精品国产精品乱码视色 | 成人欧美一区二区三区黑人 | 国产精品无码一区二区桃花视频 | 欧美人与禽猛交狂配 | 久久久久久av无码免费看大片 | 亚洲乱码国产乱码精品精 | 国产香蕉尹人视频在线 | 97无码免费人妻超级碰碰夜夜 | 亚洲国产精品成人久久蜜臀 | 久久亚洲精品成人无码 | 国产精品沙发午睡系列 | 国产在线aaa片一区二区99 | 3d动漫精品啪啪一区二区中 | 精品久久久久久人妻无码中文字幕 | 亚洲色大成网站www | 久久国内精品自在自线 | 国产精华av午夜在线观看 | 亚洲精品午夜国产va久久成人 | 鲁大师影院在线观看 | 无码人妻黑人中文字幕 | 国产精品无套呻吟在线 | 欧美阿v高清资源不卡在线播放 | 97资源共享在线视频 | 久久精品丝袜高跟鞋 | 亚洲天堂2017无码 | 亚洲国产成人a精品不卡在线 | 亚洲精品综合一区二区三区在线 | 麻豆果冻传媒2021精品传媒一区下载 | 亚洲一区二区三区播放 | 国产av久久久久精东av | 国产性生交xxxxx无码 | 成人动漫在线观看 | 精品亚洲韩国一区二区三区 | 色老头在线一区二区三区 | 天下第一社区视频www日本 | av人摸人人人澡人人超碰下载 | 免费国产成人高清在线观看网站 | 人人爽人人澡人人人妻 | 国产免费无码一区二区视频 | 欧美熟妇另类久久久久久不卡 | 性色欲情网站iwww九文堂 | 亚洲欧美中文字幕5发布 | 人妻aⅴ无码一区二区三区 | 99久久人妻精品免费一区 | 亚洲精品成人av在线 | 色婷婷香蕉在线一区二区 | 日韩欧美中文字幕在线三区 | 又粗又大又硬毛片免费看 | 国产免费观看黄av片 | 亚洲一区二区三区在线观看网站 | 国产激情艳情在线看视频 | 欧美精品一区二区精品久久 | 欧洲精品码一区二区三区免费看 | 任你躁国产自任一区二区三区 | 国产手机在线αⅴ片无码观看 | 激情内射亚州一区二区三区爱妻 | 国产av久久久久精东av | 日本xxxx色视频在线观看免费 | 日韩人妻无码中文字幕视频 | 中文字幕乱码人妻二区三区 | 成人免费视频视频在线观看 免费 | 欧美高清在线精品一区 | 亚洲欧美中文字幕5发布 | 国产午夜无码精品免费看 | 日韩少妇白浆无码系列 | 国精产品一区二区三区 | 国产精品亚洲专区无码不卡 | 欧美freesex黑人又粗又大 | 少妇高潮一区二区三区99 | 人人妻人人澡人人爽精品欧美 | 国产偷自视频区视频 | 亚洲人交乣女bbw | 国产又粗又硬又大爽黄老大爷视 | 亚洲一区二区三区 | 99精品国产综合久久久久五月天 | 免费无码午夜福利片69 | 麻豆蜜桃av蜜臀av色欲av | 亚洲人成人无码网www国产 | 国产人成高清在线视频99最全资源 | 国产精品久免费的黄网站 | 99久久人妻精品免费二区 | 成人欧美一区二区三区黑人免费 | 日欧一片内射va在线影院 | 精品国精品国产自在久国产87 | 国产精品无码一区二区三区不卡 | 18精品久久久无码午夜福利 | 鲁大师影院在线观看 | 亚洲国产精品一区二区美利坚 | 国内精品人妻无码久久久影院 | 澳门永久av免费网站 | 精品日本一区二区三区在线观看 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 免费观看激色视频网站 | 日韩欧美中文字幕在线三区 | 久久久婷婷五月亚洲97号色 | 波多野结衣av一区二区全免费观看 | 国内精品九九久久久精品 | 久久久亚洲欧洲日产国码αv | 国产人妻久久精品二区三区老狼 | 妺妺窝人体色www在线小说 | 男人扒开女人内裤强吻桶进去 | 久久无码中文字幕免费影院蜜桃 | 野狼第一精品社区 | 日本欧美一区二区三区乱码 | 福利一区二区三区视频在线观看 | 狠狠cao日日穞夜夜穞av | 日韩精品久久久肉伦网站 | 中文无码伦av中文字幕 | 人人妻人人澡人人爽欧美精品 | yw尤物av无码国产在线观看 | 亚洲 欧美 激情 小说 另类 | 十八禁真人啪啪免费网站 | 亚洲精品一区二区三区四区五区 | 99久久精品国产一区二区蜜芽 | 亚洲熟熟妇xxxx | 麻豆国产丝袜白领秘书在线观看 | 久久国产精品偷任你爽任你 | 国产乱子伦视频在线播放 | 国产va免费精品观看 | 亚洲综合无码一区二区三区 | 中文字幕色婷婷在线视频 | 色欲综合久久中文字幕网 | 国产精品资源一区二区 | 国产精品久久久久无码av色戒 | 在线欧美精品一区二区三区 | 无码午夜成人1000部免费视频 | 双乳奶水饱满少妇呻吟 | 少妇太爽了在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 十八禁真人啪啪免费网站 | 少妇激情av一区二区 | 久久www免费人成人片 | 99精品无人区乱码1区2区3区 | 欧美xxxx黑人又粗又长 | 老子影院午夜伦不卡 | 久久人人爽人人爽人人片av高清 | 亚洲国产精品美女久久久久 | 蜜桃av抽搐高潮一区二区 | 亚洲高清偷拍一区二区三区 | 欧美人妻一区二区三区 | 女人被男人爽到呻吟的视频 | 天天躁夜夜躁狠狠是什么心态 | 东京无码熟妇人妻av在线网址 | 成人免费视频在线观看 | 撕开奶罩揉吮奶头视频 | 中文无码成人免费视频在线观看 | 人人爽人人澡人人人妻 | 1000部啪啪未满十八勿入下载 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲精品www久久久 | 丰满人妻精品国产99aⅴ | 国产精品无码永久免费888 | 蜜臀av无码人妻精品 | 国产亚洲人成a在线v网站 | 丝袜美腿亚洲一区二区 | 2020久久超碰国产精品最新 | 午夜肉伦伦影院 | 精品国产福利一区二区 | 午夜成人1000部免费视频 | 中文毛片无遮挡高清免费 | 强辱丰满人妻hd中文字幕 | 久久 国产 尿 小便 嘘嘘 | 亚洲精品综合一区二区三区在线 | 久热国产vs视频在线观看 | 成熟女人特级毛片www免费 | 午夜福利试看120秒体验区 | 国产三级久久久精品麻豆三级 | 中文精品久久久久人妻不卡 | 欧美日本免费一区二区三区 | 亚洲 激情 小说 另类 欧美 | 欧美兽交xxxx×视频 | 日日鲁鲁鲁夜夜爽爽狠狠 | 澳门永久av免费网站 | 亚洲中文字幕无码中文字在线 | 波多野结衣av在线观看 | 丁香啪啪综合成人亚洲 | 九九热爱视频精品 | 东京热一精品无码av | 久久精品女人天堂av免费观看 | 日本www一道久久久免费榴莲 | 丝袜足控一区二区三区 | 九月婷婷人人澡人人添人人爽 | 午夜性刺激在线视频免费 | 色一情一乱一伦一视频免费看 | 精品国产国产综合精品 | 精品国产乱码久久久久乱码 | 久久精品国产99久久6动漫 | 国产激情一区二区三区 | 午夜丰满少妇性开放视频 | 国精品人妻无码一区二区三区蜜柚 | 亚洲国产精品久久久久久 | 丰满人妻一区二区三区免费视频 | 麻豆国产丝袜白领秘书在线观看 | 国产亚洲精品久久久久久久久动漫 | 奇米影视888欧美在线观看 | 乱人伦人妻中文字幕无码久久网 | 午夜时刻免费入口 | 精品一区二区三区无码免费视频 | 人人妻人人藻人人爽欧美一区 | 欧美精品国产综合久久 | 成人无码精品1区2区3区免费看 | 日韩成人一区二区三区在线观看 | 性欧美疯狂xxxxbbbb | 亚洲国产精品一区二区美利坚 | 亚洲国精产品一二二线 | 天天做天天爱天天爽综合网 | 欧美野外疯狂做受xxxx高潮 | 丝袜美腿亚洲一区二区 | 日韩av无码一区二区三区 | 少妇无码一区二区二三区 | www国产亚洲精品久久网站 | 九一九色国产 | 男人的天堂2018无码 | 无码国产色欲xxxxx视频 | 国产成人久久精品流白浆 | 久久久久久a亚洲欧洲av冫 | 国产尤物精品视频 | 人人爽人人澡人人人妻 | 99久久久无码国产精品免费 | 鲁一鲁av2019在线 | 亚洲乱码国产乱码精品精 | 天天爽夜夜爽夜夜爽 | 欧美日韩久久久精品a片 | 露脸叫床粗话东北少妇 | 丝袜人妻一区二区三区 | 亚洲自偷自拍另类第1页 | 欧美三级a做爰在线观看 | 一本久久a久久精品亚洲 | 免费国产成人高清在线观看网站 | 黑人玩弄人妻中文在线 | 中文字幕无码视频专区 | 国产亲子乱弄免费视频 | 日产精品高潮呻吟av久久 | www成人国产高清内射 | 欧美大屁股xxxxhd黑色 | 中文字幕日韩精品一区二区三区 | 亚洲午夜福利在线观看 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲啪av永久无码精品放毛片 | 日本一卡二卡不卡视频查询 | 久久国产自偷自偷免费一区调 | 精品久久综合1区2区3区激情 | 18无码粉嫩小泬无套在线观看 | 99久久久国产精品无码免费 | 久久综合色之久久综合 | 国产超级va在线观看视频 | 少妇高潮一区二区三区99 | 国产人妻大战黑人第1集 | 国产精品久久久久久无码 | 欧美真人作爱免费视频 | 亚洲s码欧洲m码国产av | 红桃av一区二区三区在线无码av | 国产精品久免费的黄网站 | 久久久久久a亚洲欧洲av冫 | 男女超爽视频免费播放 | 亚洲精品一区二区三区婷婷月 | 水蜜桃色314在线观看 | 色婷婷欧美在线播放内射 | 精品久久综合1区2区3区激情 | 欧美成人午夜精品久久久 | 77777熟女视频在线观看 а天堂中文在线官网 | 毛片内射-百度 | 久久99精品久久久久久动态图 | 亚洲精品久久久久avwww潮水 | 亚洲国产欧美在线成人 | 无码人妻出轨黑人中文字幕 | 国产精品久久久久久久9999 | 无码播放一区二区三区 | 中文字幕乱码中文乱码51精品 | 国产av一区二区三区最新精品 | av人摸人人人澡人人超碰下载 | 国产精品久久久午夜夜伦鲁鲁 | 99久久99久久免费精品蜜桃 | 欧美 丝袜 自拍 制服 另类 | 久久久亚洲欧洲日产国码αv | www国产亚洲精品久久网站 | 国产又爽又猛又粗的视频a片 | 午夜熟女插插xx免费视频 | 久久精品国产一区二区三区肥胖 | 国产激情艳情在线看视频 | 亚洲国产午夜精品理论片 | 中文无码精品a∨在线观看不卡 | 超碰97人人做人人爱少妇 | 国产激情综合五月久久 | 亚洲成av人综合在线观看 | 成人亚洲精品久久久久软件 | 国产精品亚洲综合色区韩国 | 嫩b人妻精品一区二区三区 | 99精品无人区乱码1区2区3区 | 麻花豆传媒剧国产免费mv在线 | 国产做国产爱免费视频 | 国产亚洲精品精品国产亚洲综合 | 麻豆国产97在线 | 欧洲 | 野外少妇愉情中文字幕 | 人人澡人人妻人人爽人人蜜桃 | 欧美性生交xxxxx久久久 | 久久人人97超碰a片精品 | 国産精品久久久久久久 | 天堂亚洲免费视频 | 未满成年国产在线观看 | 国产免费久久久久久无码 | 国精品人妻无码一区二区三区蜜柚 | 久久久久免费看成人影片 | 国产精品99爱免费视频 | 黄网在线观看免费网站 | 荫蒂被男人添的好舒服爽免费视频 | 日日橹狠狠爱欧美视频 | 亚洲国产精品成人久久蜜臀 | 久久人人97超碰a片精品 | 内射爽无广熟女亚洲 | 青青草原综合久久大伊人精品 | 久久人人爽人人爽人人片av高清 | 久久久精品456亚洲影院 | 亚洲aⅴ无码成人网站国产app | 久久www免费人成人片 | 日韩亚洲欧美精品综合 | 2020久久超碰国产精品最新 | 国产成人精品视频ⅴa片软件竹菊 | 欧美熟妇另类久久久久久多毛 | 中文字幕亚洲情99在线 | 老头边吃奶边弄进去呻吟 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 亚洲精品一区二区三区在线观看 | 久久精品中文闷骚内射 | 99久久久国产精品无码免费 | 人人澡人人妻人人爽人人蜜桃 | 欧美日韩综合一区二区三区 | 成 人 免费观看网站 | 欧美日韩在线亚洲综合国产人 | 国产suv精品一区二区五 | 久久国产36精品色熟妇 | 青草视频在线播放 | 亚洲中文字幕va福利 | 欧洲精品码一区二区三区免费看 | а√天堂www在线天堂小说 | 日韩av无码一区二区三区不卡 | 国产成人精品视频ⅴa片软件竹菊 | 国产成人久久精品流白浆 | 久久www免费人成人片 | av无码电影一区二区三区 | 日韩少妇白浆无码系列 | 色一情一乱一伦一区二区三欧美 | 亚洲狠狠婷婷综合久久 | 成人无码视频在线观看网站 | 免费无码的av片在线观看 | 18黄暴禁片在线观看 | 久久久久免费精品国产 | 欧美老妇交乱视频在线观看 | 国产成人无码av片在线观看不卡 | 日本精品久久久久中文字幕 | 久久综合九色综合欧美狠狠 | 欧洲vodafone精品性 | 领导边摸边吃奶边做爽在线观看 | 国产人成高清在线视频99最全资源 | 久久久久亚洲精品中文字幕 | 日本精品久久久久中文字幕 | 55夜色66夜色国产精品视频 | 性生交片免费无码看人 | 东京热一精品无码av | 国精产品一品二品国精品69xx | 亚洲日本一区二区三区在线 | 97精品国产97久久久久久免费 | 国产特级毛片aaaaaa高潮流水 | 亚洲国产欧美国产综合一区 | 精品国产麻豆免费人成网站 | 国产精品久久久午夜夜伦鲁鲁 | 一本无码人妻在中文字幕免费 | 成人精品视频一区二区三区尤物 | 麻豆国产人妻欲求不满谁演的 | 精品成人av一区二区三区 | 久精品国产欧美亚洲色aⅴ大片 | 亚洲国精产品一二二线 | 亚洲日本va午夜在线电影 | 国产 精品 自在自线 | 蜜臀av无码人妻精品 | 欧美日本日韩 | 久久亚洲精品中文字幕无男同 | 国产深夜福利视频在线 | 亚洲 a v无 码免 费 成 人 a v | 亚洲中文字幕久久无码 | 国产精品igao视频网 | 亚欧洲精品在线视频免费观看 | 国产亚洲精品久久久久久大师 | 国产三级久久久精品麻豆三级 | 国产农村乱对白刺激视频 | 色偷偷人人澡人人爽人人模 | 婷婷丁香五月天综合东京热 | 亚洲男人av香蕉爽爽爽爽 | 精品一二三区久久aaa片 | 免费男性肉肉影院 | 中文字幕无码免费久久9一区9 | 日本护士毛茸茸高潮 | 粉嫩少妇内射浓精videos | 无码乱肉视频免费大全合集 | 无套内谢老熟女 | 成人试看120秒体验区 | 又粗又大又硬又长又爽 | 动漫av一区二区在线观看 | 国产精品国产自线拍免费软件 | 无码人妻出轨黑人中文字幕 | 色婷婷久久一区二区三区麻豆 | 久久国产精品萌白酱免费 | 亚洲精品中文字幕 | 性欧美牲交在线视频 | 又大又硬又黄的免费视频 | 日韩在线不卡免费视频一区 | 蜜桃视频韩日免费播放 | 真人与拘做受免费视频 | 无码av最新清无码专区吞精 | 东北女人啪啪对白 | 国产熟妇高潮叫床视频播放 | 少妇一晚三次一区二区三区 | 国产在线aaa片一区二区99 | 日韩人妻系列无码专区 | 九九久久精品国产免费看小说 | 国产办公室秘书无码精品99 | 欧美午夜特黄aaaaaa片 | 在线播放免费人成毛片乱码 | √天堂中文官网8在线 | 国产热a欧美热a在线视频 | 色综合久久久无码网中文 | 乌克兰少妇性做爰 | 波多野结衣一区二区三区av免费 | 无码福利日韩神码福利片 | 色综合久久久无码网中文 | 国产精品亚洲综合色区韩国 | 国产精品无码永久免费888 | 国产精品久久福利网站 | а√资源新版在线天堂 | 欧美黑人性暴力猛交喷水 | 欧美精品无码一区二区三区 | 日本一卡2卡3卡四卡精品网站 | 国内精品人妻无码久久久影院蜜桃 | 国产三级久久久精品麻豆三级 | 精品午夜福利在线观看 | 国产精品久久久久7777 | 久久综合香蕉国产蜜臀av | 秋霞特色aa大片 | 久久久久免费看成人影片 | 少妇被粗大的猛进出69影院 | 成年美女黄网站色大免费全看 | 少妇人妻av毛片在线看 | 亚洲男人av天堂午夜在 | 国产电影无码午夜在线播放 | 亚洲一区二区三区在线观看网站 | 国产在线无码精品电影网 | 理论片87福利理论电影 | 欧美变态另类xxxx | 青青青爽视频在线观看 | 永久免费精品精品永久-夜色 | 成 人 网 站国产免费观看 | 国产精品久久久午夜夜伦鲁鲁 | 久久aⅴ免费观看 | 国产成人人人97超碰超爽8 | 中文字幕乱码中文乱码51精品 | 欧美日本免费一区二区三区 | 色欲人妻aaaaaaa无码 | 久久亚洲中文字幕精品一区 | 狠狠躁日日躁夜夜躁2020 | 国产无遮挡又黄又爽又色 | 又紧又大又爽精品一区二区 | 欧美放荡的少妇 | 激情国产av做激情国产爱 | 国产人妻精品午夜福利免费 | 无码av岛国片在线播放 | 精品人妻中文字幕有码在线 | 奇米影视888欧美在线观看 | 未满小14洗澡无码视频网站 | yw尤物av无码国产在线观看 | 国产精品美女久久久久av爽李琼 | 国产亚洲精品久久久久久 | 久久久精品欧美一区二区免费 | 亚洲精品午夜无码电影网 | 日韩精品无码一本二本三本色 | 99精品久久毛片a片 | 粗大的内捧猛烈进出视频 | 亚洲中文字幕av在天堂 | 国产亚洲美女精品久久久2020 | 亚洲aⅴ无码成人网站国产app | 成人无码视频在线观看网站 | 激情综合激情五月俺也去 | 久久久国产精品无码免费专区 | 国产电影无码午夜在线播放 | 人妻有码中文字幕在线 | 亚洲人成影院在线观看 | 人人澡人摸人人添 | 婷婷色婷婷开心五月四房播播 | 波多野结衣av在线观看 | 奇米影视888欧美在线观看 | 精品乱码久久久久久久 | 乱人伦人妻中文字幕无码 | 日日噜噜噜噜夜夜爽亚洲精品 | 丰满少妇弄高潮了www | 永久免费精品精品永久-夜色 | 永久免费观看国产裸体美女 | 2020久久超碰国产精品最新 | 大地资源网第二页免费观看 | 国产精品久久久久久亚洲影视内衣 | 免费乱码人妻系列无码专区 | 少妇无套内谢久久久久 | yw尤物av无码国产在线观看 | 熟妇激情内射com | 久久成人a毛片免费观看网站 | 国产sm调教视频在线观看 | 精品久久久久香蕉网 | 无码任你躁久久久久久久 | 免费人成在线观看网站 | 国产午夜视频在线观看 | 无人区乱码一区二区三区 | 小sao货水好多真紧h无码视频 | 亚洲日本va午夜在线电影 | 亚洲精品一区二区三区四区五区 | 欧美成人家庭影院 | 亚洲の无码国产の无码步美 | 国产香蕉尹人综合在线观看 | 亚洲精品中文字幕乱码 | 久久人人爽人人爽人人片ⅴ | 国产成人午夜福利在线播放 | 国产成人无码av一区二区 | 熟女俱乐部五十路六十路av | 最新国产麻豆aⅴ精品无码 | 台湾无码一区二区 | 中国大陆精品视频xxxx | 国产国产精品人在线视 | 一本无码人妻在中文字幕免费 | 国产亚av手机在线观看 | 日韩少妇白浆无码系列 | 欧美 日韩 人妻 高清 中文 | 最近免费中文字幕中文高清百度 | 国产精品免费大片 | 久久99精品国产麻豆 | 国产电影无码午夜在线播放 | 亚洲国产成人av在线观看 | 午夜无码人妻av大片色欲 | 国产亚洲欧美在线专区 | 久久精品人妻少妇一区二区三区 | 欧美日韩一区二区三区自拍 | 日本一区二区更新不卡 | 一本大道伊人av久久综合 | 亚洲小说春色综合另类 | 日韩无套无码精品 | 日日橹狠狠爱欧美视频 | 日日摸天天摸爽爽狠狠97 | 无码人妻少妇伦在线电影 | 国产午夜亚洲精品不卡下载 | 国产精品内射视频免费 | 亚洲人成影院在线观看 | 亚洲成av人片在线观看无码不卡 | 国产婷婷色一区二区三区在线 | 午夜理论片yy44880影院 | 色诱久久久久综合网ywww | 亚洲爆乳大丰满无码专区 | 无码人妻出轨黑人中文字幕 | 女人和拘做爰正片视频 | 亚洲一区二区三区香蕉 | 国产内射爽爽大片视频社区在线 | 精品国产精品久久一区免费式 | 麻豆果冻传媒2021精品传媒一区下载 | 极品嫩模高潮叫床 | 欧美黑人巨大xxxxx | 狠狠色丁香久久婷婷综合五月 | 日产国产精品亚洲系列 | 午夜福利电影 | 欧美xxxx黑人又粗又长 | 丰满诱人的人妻3 | 久久亚洲精品中文字幕无男同 | 玩弄中年熟妇正在播放 | 亚洲中文字幕成人无码 | 亚洲色大成网站www | 黑人粗大猛烈进出高潮视频 | 在线观看免费人成视频 | 日日麻批免费40分钟无码 | 欧美日韩一区二区综合 | 国产真实夫妇视频 | 久久久久成人精品免费播放动漫 | 97精品人妻一区二区三区香蕉 | 精品国精品国产自在久国产87 | 日本丰满护士爆乳xxxx | 亚洲呦女专区 | 草草网站影院白丝内射 | 大色综合色综合网站 | 久久99久久99精品中文字幕 | 精品国偷自产在线 | 国产av一区二区三区最新精品 | 亚洲狠狠色丁香婷婷综合 | 日本爽爽爽爽爽爽在线观看免 | 精品久久综合1区2区3区激情 | 一二三四在线观看免费视频 | 高清无码午夜福利视频 | 国产精品无码一区二区桃花视频 | 欧美成人家庭影院 | 亚洲人成影院在线观看 | 扒开双腿疯狂进出爽爽爽视频 | 色一情一乱一伦一区二区三欧美 | 亚洲欧美日韩国产精品一区二区 | 国产美女极度色诱视频www | а√天堂www在线天堂小说 | 国产乱人伦av在线无码 | 国语精品一区二区三区 | av无码不卡在线观看免费 | 日欧一片内射va在线影院 | 久久97精品久久久久久久不卡 | 无码帝国www无码专区色综合 | 亚洲精品综合一区二区三区在线 | 丰满少妇女裸体bbw | 国产人妖乱国产精品人妖 | 九九久久精品国产免费看小说 | 国产成人一区二区三区别 | 在线观看免费人成视频 | 国产精品无码一区二区桃花视频 | 四虎4hu永久免费 | 亚洲精品一区国产 | 国产尤物精品视频 | 欧美三级不卡在线观看 | 狠狠色色综合网站 | 老司机亚洲精品影院无码 | 我要看www免费看插插视频 | 久久久久av无码免费网 | 国产在线精品一区二区三区直播 | 久久综合色之久久综合 | 成年美女黄网站色大免费视频 | 久久成人a毛片免费观看网站 | 俄罗斯老熟妇色xxxx | 色老头在线一区二区三区 | 国产两女互慰高潮视频在线观看 | 一个人看的www免费视频在线观看 | 亚洲午夜福利在线观看 | 狠狠色噜噜狠狠狠7777奇米 | 国内揄拍国内精品人妻 | 午夜精品久久久内射近拍高清 | 成人亚洲精品久久久久软件 | 国产精品久久久一区二区三区 | 色 综合 欧美 亚洲 国产 | 久久久久成人精品免费播放动漫 | 女人被男人躁得好爽免费视频 | 精品久久久久久人妻无码中文字幕 | 中文字幕乱码人妻无码久久 | 国产一区二区三区四区五区加勒比 | 国产亚洲欧美在线专区 | 亚洲第一无码av无码专区 | 又大又黄又粗又爽的免费视频 | 国产又爽又黄又刺激的视频 | 在线视频网站www色 | 久久国产精品二国产精品 | 亚洲一区二区三区四区 | 免费国产黄网站在线观看 | 图片小说视频一区二区 | 扒开双腿吃奶呻吟做受视频 | 国产精品爱久久久久久久 | 欧洲熟妇色 欧美 | 熟女俱乐部五十路六十路av | 国内少妇偷人精品视频 | 亚洲日本在线电影 | 狂野欧美性猛交免费视频 | av人摸人人人澡人人超碰下载 | 一本色道婷婷久久欧美 | 青青青爽视频在线观看 | 无套内谢老熟女 | 国产 精品 自在自线 | 久久亚洲日韩精品一区二区三区 | 日欧一片内射va在线影院 | 极品嫩模高潮叫床 | 清纯唯美经典一区二区 | 色婷婷综合激情综在线播放 | 99久久久国产精品无码免费 | 亚洲欧洲无卡二区视頻 | 黑人粗大猛烈进出高潮视频 | 激情人妻另类人妻伦 | 亚洲成色在线综合网站 | 中文字幕久久久久人妻 | 色欲av亚洲一区无码少妇 | 18无码粉嫩小泬无套在线观看 | 日韩视频 中文字幕 视频一区 | 日日摸天天摸爽爽狠狠97 | 蜜桃视频韩日免费播放 | 国语自产偷拍精品视频偷 | 中文无码精品a∨在线观看不卡 | 日韩精品一区二区av在线 | 东京热无码av男人的天堂 | 成人精品视频一区二区三区尤物 | 夜夜高潮次次欢爽av女 | 国产精品久久久久无码av色戒 | 六月丁香婷婷色狠狠久久 | 日本熟妇乱子伦xxxx | 国产精品毛片一区二区 | 天天综合网天天综合色 | 少妇人妻偷人精品无码视频 | 成人精品视频一区二区三区尤物 | 婷婷五月综合缴情在线视频 | 久久精品人人做人人综合试看 | 国内丰满熟女出轨videos | 男人的天堂2018无码 | 国产亚洲人成在线播放 | 老头边吃奶边弄进去呻吟 | 日韩精品成人一区二区三区 | 免费观看黄网站 | 一本无码人妻在中文字幕免费 | 四虎永久在线精品免费网址 | 中文无码成人免费视频在线观看 | 性欧美大战久久久久久久 | 98国产精品综合一区二区三区 | 人妻天天爽夜夜爽一区二区 | 色窝窝无码一区二区三区色欲 | 久久久国产一区二区三区 | 麻豆果冻传媒2021精品传媒一区下载 | 18精品久久久无码午夜福利 | 欧美 日韩 亚洲 在线 | 精品无码一区二区三区爱欲 | 国产午夜精品一区二区三区嫩草 | 国产午夜亚洲精品不卡 | 无码国模国产在线观看 | 国内精品九九久久久精品 | 性生交片免费无码看人 | 国产两女互慰高潮视频在线观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 激情内射日本一区二区三区 | 天天摸天天透天天添 | 国产内射老熟女aaaa | 大乳丰满人妻中文字幕日本 | 午夜精品一区二区三区在线观看 | 欧美阿v高清资源不卡在线播放 | 日本精品久久久久中文字幕 | 久久精品中文字幕大胸 | 樱花草在线社区www | 天堂久久天堂av色综合 | 一二三四在线观看免费视频 | 国产午夜亚洲精品不卡 | 久久久久成人片免费观看蜜芽 | 男人扒开女人内裤强吻桶进去 | 色欲综合久久中文字幕网 | 少妇人妻av毛片在线看 | 国产精品va在线播放 | 国产精品99久久精品爆乳 | 欧美国产日韩久久mv | 日本xxxx色视频在线观看免费 | 天堂а√在线中文在线 | 日欧一片内射va在线影院 | 性生交片免费无码看人 | 天天躁日日躁狠狠躁免费麻豆 | 在线播放亚洲第一字幕 | 日韩 欧美 动漫 国产 制服 | 亚洲精品成a人在线观看 | 国产av无码专区亚洲awww | 国产农村乱对白刺激视频 | 国产成人综合在线女婷五月99播放 | 亚洲一区二区三区含羞草 | 国产三级久久久精品麻豆三级 | 人人爽人人爽人人片av亚洲 | 国精产品一品二品国精品69xx | 日本饥渴人妻欲求不满 | 伊人久久大香线蕉av一区二区 | 国产成人无码av一区二区 | 清纯唯美经典一区二区 | 天下第一社区视频www日本 | 少妇无码av无码专区在线观看 | 欧美日韩一区二区综合 | 亚洲精品一区二区三区在线 | 亚洲色大成网站www国产 | 少妇无套内谢久久久久 | 亚洲成av人综合在线观看 | 欧美freesex黑人又粗又大 | 夜先锋av资源网站 | 亚洲精品午夜无码电影网 | 好爽又高潮了毛片免费下载 | 亚洲国产精品成人久久蜜臀 | 久久精品国产大片免费观看 | 午夜嘿嘿嘿影院 | 亚洲经典千人经典日产 | 亚洲精品国偷拍自产在线观看蜜桃 | 欧美丰满少妇xxxx性 | 免费国产黄网站在线观看 | 1000部夫妻午夜免费 | 欧美 日韩 人妻 高清 中文 | 成人片黄网站色大片免费观看 | 成在人线av无码免观看麻豆 | 午夜理论片yy44880影院 | 国产xxx69麻豆国语对白 | 女人被男人爽到呻吟的视频 | 久久久久久久久888 | 精品日本一区二区三区在线观看 | 国产一区二区不卡老阿姨 | 日韩av激情在线观看 | 国产精品久久福利网站 | 日韩精品久久久肉伦网站 | 久久精品国产精品国产精品污 | 国产精品沙发午睡系列 | 国内精品一区二区三区不卡 | 东京热男人av天堂 | 久久久久久久久蜜桃 | 国产午夜无码精品免费看 | 国产无av码在线观看 | 亚洲中文字幕在线观看 | 日本一区二区三区免费播放 | 久久久久99精品国产片 | 99久久久国产精品无码免费 | 免费国产成人高清在线观看网站 | 国产麻豆精品一区二区三区v视界 | 18精品久久久无码午夜福利 | 亚洲中文字幕成人无码 | 无码国产激情在线观看 | 亚洲中文字幕在线无码一区二区 | 午夜福利一区二区三区在线观看 | 漂亮人妻洗澡被公强 日日躁 | 理论片87福利理论电影 | 蜜桃臀无码内射一区二区三区 | 精品午夜福利在线观看 | 成 人 网 站国产免费观看 | 亚洲爆乳精品无码一区二区三区 | 永久黄网站色视频免费直播 | 女人被男人躁得好爽免费视频 | 午夜时刻免费入口 | 久久精品国产99精品亚洲 | 夜夜夜高潮夜夜爽夜夜爰爰 | 又色又爽又黄的美女裸体网站 | 曰韩无码二三区中文字幕 | 国产绳艺sm调教室论坛 | 精品国产国产综合精品 | 人人妻人人澡人人爽欧美一区 | 小鲜肉自慰网站xnxx | 18禁止看的免费污网站 | 亚洲天堂2017无码中文 | 久久精品丝袜高跟鞋 | 暴力强奷在线播放无码 | 真人与拘做受免费视频一 | 老子影院午夜伦不卡 | 55夜色66夜色国产精品视频 | 丰满人妻被黑人猛烈进入 | 理论片87福利理论电影 | 少妇人妻大乳在线视频 | 欧美人与禽zoz0性伦交 | 日韩视频 中文字幕 视频一区 | 帮老师解开蕾丝奶罩吸乳网站 | 丰满人妻精品国产99aⅴ | 欧美熟妇另类久久久久久不卡 | 男人的天堂av网站 | 久久精品人妻少妇一区二区三区 | 天堂а√在线中文在线 | 人人妻人人澡人人爽欧美一区 | 色窝窝无码一区二区三区色欲 | 美女扒开屁股让男人桶 | 久久亚洲精品成人无码 | 亚洲色在线无码国产精品不卡 | 中文字幕无码av激情不卡 | 中文无码伦av中文字幕 | 色综合久久久无码网中文 | 国产av人人夜夜澡人人爽麻豆 | 一本久道高清无码视频 | 亚洲中文无码av永久不收费 | 性做久久久久久久免费看 | 亚洲国产欧美在线成人 | 国产精品久久久久无码av色戒 | 色欲人妻aaaaaaa无码 | 99久久精品国产一区二区蜜芽 | 少妇性l交大片欧洲热妇乱xxx | 国精产品一区二区三区 | 国产97色在线 | 免 | 天天爽夜夜爽夜夜爽 | 日本熟妇大屁股人妻 | 国产成人无码专区 | 国产香蕉尹人视频在线 | 国产成人av免费观看 | 国产国产精品人在线视 | 久久久精品欧美一区二区免费 | 色婷婷综合激情综在线播放 | 国产成人无码av在线影院 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产精品香蕉在线观看 | 国产精品免费大片 | 亚洲国产成人av在线观看 | 成熟妇人a片免费看网站 | 中文毛片无遮挡高清免费 | 国产绳艺sm调教室论坛 | 国产成人精品无码播放 | 黑人大群体交免费视频 | 亚洲一区二区三区含羞草 | 欧美三级a做爰在线观看 | 女人被爽到呻吟gif动态图视看 | 欧美zoozzooz性欧美 | 大肉大捧一进一出视频出来呀 | 亚洲精品成人av在线 | 欧美激情内射喷水高潮 | 亚洲精品美女久久久久久久 | 婷婷综合久久中文字幕蜜桃三电影 | 精品无人国产偷自产在线 | 永久免费观看国产裸体美女 | 成人免费视频视频在线观看 免费 | 亚洲精品一区三区三区在线观看 | 国产精品无码mv在线观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 日本精品人妻无码免费大全 | 欧美freesex黑人又粗又大 | 久久国产精品萌白酱免费 | 亚洲国产精品成人久久蜜臀 | 人人妻人人澡人人爽欧美一区九九 | 日韩精品久久久肉伦网站 | 自拍偷自拍亚洲精品被多人伦好爽 | 中文字幕av无码一区二区三区电影 | 日韩av激情在线观看 | 最近的中文字幕在线看视频 | 国产黄在线观看免费观看不卡 | 国产女主播喷水视频在线观看 | 黑人粗大猛烈进出高潮视频 | 曰本女人与公拘交酡免费视频 | 免费看男女做好爽好硬视频 | 日韩精品无码一区二区中文字幕 | 亚无码乱人伦一区二区 | 日本一卡2卡3卡四卡精品网站 | 激情内射亚州一区二区三区爱妻 | 亚洲 欧美 激情 小说 另类 | 亚洲色在线无码国产精品不卡 | 男女作爱免费网站 | 免费网站看v片在线18禁无码 | 亚洲国产精华液网站w | 美女黄网站人色视频免费国产 | 日日碰狠狠躁久久躁蜜桃 | 久久五月精品中文字幕 | 成人试看120秒体验区 | 久久久久成人精品免费播放动漫 | 国产精品久免费的黄网站 | 国产精品久久久久久无码 | 精品一区二区不卡无码av | 日本肉体xxxx裸交 | 77777熟女视频在线观看 а天堂中文在线官网 | 欧美野外疯狂做受xxxx高潮 | 欧美精品免费观看二区 | 鲁一鲁av2019在线 | 国产精品亚洲五月天高清 | 国产黑色丝袜在线播放 | 青青青手机频在线观看 | 日韩精品久久久肉伦网站 | 亚洲国精产品一二二线 | 蜜桃av抽搐高潮一区二区 | 国产一区二区三区日韩精品 | 97无码免费人妻超级碰碰夜夜 | 欧美性猛交xxxx富婆 | 青青草原综合久久大伊人精品 | 高清国产亚洲精品自在久久 | 国产亚洲精品久久久久久大师 | 欧美黑人乱大交 | 日韩精品久久久肉伦网站 | 377p欧洲日本亚洲大胆 | 亚洲熟妇色xxxxx亚洲 | 国内老熟妇对白xxxxhd | 一二三四在线观看免费视频 | 精品无码国产一区二区三区av | 美女扒开屁股让男人桶 | 国产精品久久久久久亚洲毛片 | 欧美三级a做爰在线观看 | 国内精品久久久久久中文字幕 | 国产精品久久国产精品99 | 亚洲中文字幕av在天堂 | 亚洲欧洲日本综合aⅴ在线 | 国产香蕉97碰碰久久人人 | 丰满人妻翻云覆雨呻吟视频 | 18禁止看的免费污网站 | 狂野欧美性猛xxxx乱大交 | 人人妻人人澡人人爽欧美一区 | 久久99精品久久久久婷婷 | 人人爽人人爽人人片av亚洲 | 中文字幕av日韩精品一区二区 | 性欧美大战久久久久久久 | 亚洲综合久久一区二区 | 熟女少妇在线视频播放 | 国产成人精品必看 | 纯爱无遮挡h肉动漫在线播放 | 最近免费中文字幕中文高清百度 | 少妇被粗大的猛进出69影院 | 亚洲aⅴ无码成人网站国产app | 99久久精品无码一区二区毛片 | 国产凸凹视频一区二区 | 人人澡人摸人人添 | 无码福利日韩神码福利片 | 在线看片无码永久免费视频 | 黑人巨大精品欧美一区二区 | 强开小婷嫩苞又嫩又紧视频 | 两性色午夜视频免费播放 | 免费人成在线观看网站 | 中国女人内谢69xxxx | 十八禁视频网站在线观看 | 麻豆果冻传媒2021精品传媒一区下载 | 日本大香伊一区二区三区 | 一个人免费观看的www视频 | ass日本丰满熟妇pics |