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 null5.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 {
, … }<joined_table> ::=
[<join_type>] JOIN<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就是這樣。
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函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker 定时重启脚本_使用 Go
- 下一篇: MATLAB之输出