轉sql
最近在看db2,邊讀邊寫了一些,記下來,雖然寫的亂七八糟。以備後用。
這些都寫的很簡單。我以爲也算是一些簡單的操做吧,有些也是摘自別人的blog具體是引用哪的就不太記得了。
1、DB2兩種註釋寫法
-----註釋
/*註釋*/
注:看起來db2的數據庫架構和oracle有些相像,有用戶和數據庫的概念。好比我剛剛在J_TEST這個數據庫中建了個表形式以下,create table table_name(字段列表);而後我在對想視圖中看到table_name的模式是abc(便是我登陸該操做系統的ID),而我若是查詢select * from obpm_rt.table_name是查不出來的,便是表示table_name是屬於abc這個賬戶其它用戶不可見,雖然是處於同一個數據庫中。
2、db2的基本數據類型
數值型
*小整型,SMALLINT: 整型是兩個字節的整數,精度爲 5 位。
*大整型,INTEGER: 或 INT 大整型是四個字節的整數,精度爲 10 位。
*巨整型,BIGINT:巨整型是八個字節的整數,精度爲 19 位。
*小數型,DECIMAL(p,s)、DEC(p,s)、NUMERIC(p,s) 或 NUM(p,s):
*單精度浮點數 REAL
*雙精度浮點數 DOUBLE,DOUBLE PRECISION 或 FLOAT
字符串型
*定長字符串:CHARACTER(n) 或 CHAR(n):定長字符串的長度介於1 到254字節之間。默認1個字節。
*變長字符串,VARCHAR(n)、CHARACTER VARYING(n) 或 CHAR VARYING(n):VARCHAR(n) 類型的字符串是變長字符串,最長可達 32,672 字節。
*LONG VARCHAR:LONG VARCHAR 類型的字符串是變長字符串,最長可達 32,700 字節。
*字符大對象字符串 CLOB(n):CLOB 是變長字符串,最長能夠達到 2,147,483,647 字節。若是隻指定了 n,那麼 n 的值就是最大長度。
*二進制大對象,BLOB(n[K|M|G]):二進制大對象是變長字符串,最長可達 2,147,483,647 字節。若是隻指定了 n,那麼 n 就是最大長度。
日期時間型數據類型
*DATE:DATE 是一個由三部分組成的值(年、月和日)。
*TIME:TIME 是一個由三部分組成的值(小時、分鐘和秒)。
*TIMESTAMP:TIMESTAMP 是一個由七部分組成的值(年、月、日、小時、分鐘、秒和微秒)。
*日期值的字符串表示是一個以數字開始,長度很多於 8 個字符的字符串。日期值的月份和日部分中前面的零能夠省略。
*時間值的字符串表示是以數字開頭,長度很多於 4 個字符的字符串。時間值的小時部分前面的零能夠省略,秒部分能夠徹底省略。若是秒的值沒有指定,那麼就認爲是 0。
*時間戳記值的字符串表示是以數字開頭,長度很多於 16 個字符的字符串。完整的時間戳記字符串表示形式爲 yyyy-mm-dd-hh.mm.ss.nnnnnn。
時間戳記值的月、日或小時等幾部分前面的零能夠省略,微秒能夠截斷或徹底省略。若是任什麼時候間戳記值的微秒部分尾零被省略掉了,那麼將假定空缺的數位上是零。
example:
create table db2admin.t_test1(id smallint,name character(10),addr clob(1000),indate date);
insert into db2admin.t_test1(id,name,addr,indate) values(001,'jenny','ccccccccc','2009-10-01');
3、db2 sql 一些語法
declare :定義變量 和 定義出錯處理 (declare必須要 begin後面才用,並且db2沒有匿名塊的概念)
格式:declare sql-var-name data-type default default-values
SET : SET 語句來爲變量和數組元素賦值
格式:SET variable_name = value/expression/NULL;
例子:SET total = (select sum(c1) from table);
VALUE INTO: 爲變量賦值
格式:VALUES 值 INTO 變量名;
例子:VALUES 'TEST' INTO v1;
SELECT INTO : 爲變量賦值
格式:SELECT 字段/函數 INTO 變量名 FROM TABLE;
例子:SELECT COUNT(*) INTO var1 FROM T1;
返回當前日期和時間(專用寄存器實現),相似於oracle的sysdate之類的系統函數,能夠在SQL 語句或 SQL PL 語句中訪問和引用:
CURRENT DATE 也可寫成 CURRENT_DATE
CURRENT TIME 也可寫成 CURRENT_TIME
CURRENT TIMESTAMP 也可寫成 CURRENT_TIMESTAMP
CURRENT USER 也可寫成 CURRENT_USER
CURRENT PATH 也可寫成 CURRENT_PATH
四,db2的行號寫法
ROW_NUMBER() OVER () AS NUMBER
五,如何在命令符下提交存儲過程
cmd -->db2cmd
在存儲過程的最後加上@符號,而後在命令符下打入:db2 -td@ -vf procfile.sql 就能夠生成過程。
非存儲過程的SQL文件,在命令符下打入:db2 –tvf sqlfile.sql
六,db2遊標
格式:DECLARE cursor_name CURSOR FOR Select-statement [WITHOUT HOLD]/[WITH HOLD] [WITHOUT RETURN]/[WITH RETURN] [TO CALLER]/[TO CLIENT]
關鍵字解釋:
Select-statement: 是一條有效的 SQL SELECT 語句
WITHOUT HOLD/WITH HOLD: 選項定義 COMMIT 操做以後的遊標狀態(open/close)。默認狀況下爲 WITHOUT HOLD。
若是使用了 WITH HOLD 選項定義一個遊標,那麼在 COMMIT 操做以後,該遊標保持 OPEN 狀態。
在 ROLLBACK 操做以後,全部遊標都將被關閉。
WITHOUT RETURN/WITH return 選項指定遊標的結果表是否用於做爲從一個過程當中返回的結果集。
WITH RETURN TO CALLER 選項指定未來自遊標的結果集返回給調用者,後者能夠是另外一個過程或一個客戶機應用程序。這是默認選項。\
WITH RETURN TO CLIENT 選項指定未來自遊標的結果集返回給客戶機應用程序,繞過任何中間的嵌套過程。
若要從一個過程當中返回結果集,須要:
建立一個過程,建立時指定 DYNAMIC RESULT SETS 子句。
聲明遊標,聲明時指定 WITH RETURN 子句。
打開該遊標,並使之保持 open 狀態。
若是關閉該遊標,則結果集將不能返回給調用者應用程序。
遊標處理
爲了在一個過程當中處理一個遊標的結果,須要作如下事情:
在存儲過程塊的開頭部分 DECLARE 遊標。
打開該遊標。
將遊標的結果取出到以前已聲明的本地變量中。
關閉該遊標。(注意:若是如今不關閉遊標,當過程終止時將隱式地關閉遊標)。
七.選擇、分支、循環語法
1)if then else (和oracle寫法同樣)
IF 條件 THEN
語句
ELSEIF 條件 THEN
語句
ELSE
語句
END IF;
2)case (和oracle寫法同樣)
case
when 條件 then 語句
.
.
.
else 語句 end case;
3)loop 循環 (有四種LOOP,WHILE ,REPEAT ,FOR,這裏只介紹loop和for )
loop_name: LOOP
SQL statements;
LEAVE loop_name;
END LOOP loop_name
典型的cursor loop格式:
OPEN cursor_name;
loop_name: LOOP
FETCH cursor_name INTO 變量名(能夠多個之間用逗號分隔);
IF end_ <> 0 THEN -- 到達最後一行時退出循環
LEAVE loop_name;
END IF;
循環執行語句
END LOOP loop_name;
4)for 結果集上的隱式循環(db2admin.p_for_example)
FOR loop_name AS SELECT … FROM
DO
SQL statements;
END FOR;
8、存儲過程
格式:CREATE PROCEDURE procedure_name([IN/OUT/INOUT paraname TYPE ])
SPECIFIC specific_name
DYNAMIC RESULT SETS integer
MODIFIES SQL DATA/CONTAINS SQL/READS SQL DATA
NOT DETERMINISTIC/DETERMINISTIC
CALLED ON NULL INPUT
LANGUAGE SQL
PARAMETER CCSID/ ASCII/UNICODE
BEGIN [NOT] ATOMIC
SQL-procedure-body:
END
關鍵字解釋:
procedure-name: 存儲過程的名字,在同一個數據庫的同一模式下,不能存在存儲過程名相同參數數目相同的存儲過程,即便參數的類型不一樣也不行。
(IN | OUT | INOUT parameter-name data-type,...) :傳入參數
IN:輸入參數
OUT:輸出參數
INOUT:做爲輸入輸出參數
parameter-name:參數名字,在此存儲過程當中惟一的標識符。
data-type:參數類型,能夠接收SQL類型和建立的表。不支持LONG VARCHAR, LONG VARGRAPHIC, DATALINK, REFERENCE和用戶自定義類型。
SPECIFIC specific-name:惟一的特定名稱(別名),能夠用存儲過程名代替,這個特定名稱用於dorp存儲過程,或者給存儲過程添加註視用,但不能調用存儲過程。若是不指定,則數據庫會自動生成一個yymmddhhmmsshhn時間戳的名字。推薦給出別名。
DYNAMIC RESULT SETS integer:指定存儲過程返回結果的最大數量。存儲過程當中雖然沒有return語句,可是卻能返回結果集。
CONTAINS SQL, READS SQL DATA, MODIFIES SQL DATA: 指定存儲過程當中的SQL訪問級別
CONTAINS SQL: 表示存儲過程能夠執行中,既不可讀取 SQL 數據,也不可修改 SQL 數據。
READS SQL DATA: 表示存儲過程能夠執行中,可讀取SQL,但不可修改 SQL 數據。
MODIFIES SQL DATA: 表示存儲過程能夠執行任何 SQL 語句。能夠對數據庫中的數據進行增長、刪除和修改。
DETERMINISTIC or NOT DETERMINISTIC:表示存儲過程是動態或者非動態的。動態的返回的值是不肯定的。非動態的存儲過程每次執行返回的值是相同的。
CALLED ON NULL INPUT:表示能夠調用存儲過程而無論任何的輸入參數是否爲NULL,而且,任何的OUT或者INOUT參數能夠返回一個NULL或者非空值。檢驗參數是否爲NULL是在過程當中進行的。
LANGUAGE SQL:指定程序的主體用的是SQL語言。
EXTERNAL ACTION or NO EXTERNAL ACTION:表示存儲過程是否執行一些改變理數據庫狀態的活動,而不經過數據庫管理器管。默認是
EXTERNAL ACTION。若是指定爲NO EXTERNAL ACTION ,則數據庫會肯定最最佳優化方案。
PARAMETER CCSID:指定全部輸出字符串數據的編碼,默認爲UNICODE編碼數據庫爲PARAMETER CCSID UNICODE,其餘的數據庫默認爲PARAMETER CCSID 3 ASCII。
9、get db cfg for databasename 獲取數據庫的配置信息
update db cfg for testdatabase using logfilsiz 6000 修改日誌文件大小
db2 ? sql964 根據錯誤碼查看錯誤解釋
10、SQL 函數(據實驗不能用case語句)
CREATE FUNCTION [FunctionName] ( <<[ParameterName]> [InputDataType] ,...> )
RETURNS [[OutputDataType] |
TABLE ( [ColumnName] [ColumnDataType] ,... ) |
ROW ( [ColumnName] [ColumnDataType] ,... )]
<SPECIFIC [SpecificName]>
<LANGUAGE SQL>
<DETERMINISTIC | NOT DETERMINISTIC>
<EXTERNAL ACTION | NO EXTERNAL ACTION>
<CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA>
<STATIC DISPATCH>
<CALLED ON NULL INPUT>
[SQLStatements] | RETURN [ReturnStatement]
FunctionName 指定要建立的 SQL 函數的名稱。
ParameterName 指定一個或多個函數參數的名稱。
InputDataType 指定 ParameterName 所識別的參數所需的數據類型。
OutputDataType 指定函數返回的數據的類型,這種狀況是返回單值
TABLE 指表函數,返回一個表,調用方法 select * from TABLE(function_name(parameter)) alias
ROW 行函數, 返回一行,調用方法暫時不詳
ColumnName 指定函數返回的一列或多列的名稱(若是此函數返回表或行的話)。
ColumnDataType 指定 ColumnName 所識別的列返回的數據類型。
SpecificName 指定分配給這個 UDF 的特定名稱。這個名稱能夠用來引用或刪除函數;可是,不能用來調用函數。
SQLStatements 指定在調用函數時執行的一個或多個 SQL 語句。這些語句組合成一個動態複合 SQL 語句。
ReturnStatement 指定用於返回調用函數的應用程序的 RETURN SQL 語句。(若是 SQL 函數體由動態複合語句組成, 那麼它必須包含至少一個 RETURN 語句;在調用函數時,必須執行一個 RETURN 語句。若是函數是表函數或行函數, 那麼只能包含一個 RETURN 語句,並且此語句必須是使用的最後一個語句)。
11、字符串相加和oracle一相用||
12、動態sql執行
相對於靜態SQL 語句,動態SQL 在運行時是沒法得知其所有的SQL 語句的。例如若是col1 和tabname 是語句中的兩個變量,那麼咱們正在處理動態SQL:
'SELECT ' || col1 || ' FROM ' || tabname;
在 DDL 中建議使用動態SQL,以免從屬問題和包無效問題。執行遞歸操做時也須要動態SQL.
能夠經過如下兩種方法執行動態SQL:
• 使用 EXECUTE IMMEDATE 語句– 對於單獨執行的SQL 這是理想的方法(和oracle同樣,只不過oracel好像只有這一種執行方法)
• 在 EXECUTE 語句以前用PREPARE 語句 – 對於多重執行的SQL 語句此方法比較理想。
CREATE PROCEDURE dyn1 (IN value1 INT, IN value2 INT)
SPECIFIC dyn1
BEGIN
DECLARE stmt varchar(255);
DECLARE st STATEMENT;
SET stmt = 'INSERT INTO T2 VALUES (?, ?)';
PREPARE st FROM stmt;
EXECUTE st USING value1, value1;
EXECUTE st USING value2, value2;
SET stmt = INSERT INTO T2 VALUES (9,9)';
EXECUTE IMMEDIATE stmt;
END
十3、db2用單引號中的數據做爲字符串,若是要輸入單引號則需輸入兩個,第一個做爲了轉義字符(和oracle同樣)
十4、db2的用戶和oracle用戶的比較
一個數據庫只對應一個實例,可是一個實例能夠有多個數據庫(和oracle同樣),差異比較大的應該是用戶的定義不太同樣
db2:必定得是系統用戶
oracle:能夠用具備dba權限的用戶新建用戶,不必定非得操做系統用戶
db2:每一個用戶新建的表都是從屬於該用戶,可是A用戶能夠新建查詢更新B用戶的數據。只須要前面增長B用戶標識感受db2是全部數據都是放在同一個數據庫,只是建表的時候把當前用戶id看成了表名的一部分
oracle:每一個用戶新建的表都是從屬於該用戶,別的用戶不能對其它用戶的數據進行增刪改查,除非賦予了該用戶能夠對其它用戶數據進行操做。oracle是徹底意義上的一個用戶即一個獨立數據庫。
看存儲過程文本
select text from syscat.procedures where procname='PROC1';
--看錶結構
--describe table syscat.procedures describe select * from syscat.procedures
十5、實例操做
win cmd下輸入: db2cmd -->db2icrt <實例名稱> 即新建一個實例
db2ilist 顯示該數據庫有多少個實例
db2 get instance 顯示當前運行的實例
set db2instance=實例名稱 設置當前實例(也能夠在win 環境變量中設置DB2INSTANCE變量)
db2start 啓動當前實例
db2stop 中止當前實例
db2stop force 強制中止
db2idrop 刪除一個實例
注:如須要顯示實例或者數據庫(用命令新加的)在控制中心中,須要在控制中心中手工添加(右鍵->添加->發現)
db2 create database 數據庫名稱 在當前實例下新建一個數據庫
db2 list db directory 顯示當實例的全部數據庫
db2 drop database 數據庫名稱 刪除一個數據庫
db2 connect to <database_name> 鏈接數據庫
隨着數據庫的建立,有幾個默認的對象也同時被建立:表空間,表,緩衝池,日誌文件。
默認幾個表空間以下(基本和oracle差很少,不一樣的只是名字而已)
SYSCATSPACE(oracle:system) 表空間包含目錄表(Catalog),它包含不可更改和不可刪除的系統信息,不然數據庫沒法正常工做
TEMPSPACE1(oracle:temp) 當DB2實現一些相似排序等須要額外空間的操做時會用到
USERSPACE1(oracle:users) 若是建立一個表的時候沒有指定空間,系統一般會使用USERSPACE1 來存儲您的數據庫表。
SYSTOOLSPACE(oracle:SYSAUX) 系統工具類存放空間,
十6、db2配置
使用配置嚮導工具(configur)tion Advisor Tool)能夠設置db2參數。在控制中心右鍵單擊數據庫並選擇"Configuration Advisor",
根據您對系統資源和工做載荷的描述,配置嚮導會提供一個db2推薦參數列表,您能夠閱讀它們來得到更多關於db2配置的細節信息,也可直接使用配置嚮導提供的數值。
一個db2服務器能夠在四個不一樣層面上加以配置:
環境變量
數據庫管理器配置文件(db cfg)
數據庫配置文件(db cfg)
db2概要文件註冊表
環境變量是在服務器的操做系統層設置的。數據庫管理器配置文件變量是在實例層設置的。
數據庫配置變量是在數據庫層設置的。db2的概要文件註冊則能夠在操做系統層或實例層設置
1)環境變量
環境變量是在操做系統層設置的變量。db2instance是其中一個主要的環境變量。這個變量顯示了當前活動的實例--即您的db2命令執行操做的實例。
例如,在命令窗口中設置一個活動的實例'myinst',您能夠運行以下操做系統命令:set db2instance=myinst.
2)數據庫管理器配置文件
數據庫管理器配置文件(dbm cfg)包含一些參數,這些參數影響對應的實例和及其數據庫。您能夠經過命令行或者DB2 控制中心查看和修改數據庫管理器配置文件。
想要從控制中心啓動DBM CFG,能夠在控制中心實例(instance)文件夾內選擇實例對象,而後右鍵單擊,在彈出菜單上選擇配置參數(Configure Parameters)。
在選擇配置參數(Configure Parameters)以後,屏幕會顯示dbm cfg 參數列表,
不少參數都是動態的,當即生效;可是,有一些參數的修改須要重啓實例。能夠在命令行使用db2stop 和db2start 命令來實現。
在中止一個實例以前,必須斷開全部應用與實例的鏈接。若是您但願強制中止實例,可使用db2stop force 命令。
還能夠經過控制中心來中止和啓動實例——單擊實例對象選擇Stop 或Start 便可。
db2 get dbm cfg 從新獲得dbm cfg 的信息
db2 update dbm cfg using <parameter_name> <value> 更新dbm cfg 的參數信息
3)數據庫配置文件(db cfg)
數據庫配置文件(db cfg)包含影響對應數據庫的參數。數據庫配置文件也能夠經過命令行或者控制中心來查看或者修改。
從控制中心啓動DB CFG,能夠在數據庫(database)文件夾中選擇數據庫對象,並右鍵單擊彈出菜單,在菜單中選擇配置參數(Configure Parameters)。
選擇配置參數後(Configure Parameters),屏幕會顯示一個db cfg 參數的清單
get db cfg for <database_name> 從新獲得指定數據庫的db cfg 信息
update db cfg for <database_name> using <parameter_name> <value> 更新db cfg 參數的值
4)DB2 概要文件註冊表
DB2 概要文件註冊表包含了與平臺相關的全局(影響全部實例)或者實力層次(隻影響某個實例)的參數。
十7、其它一些語句
db2 list applications show detail 查詢當前正在鏈接數據庫的鏈接詳細信息
db2 list applications 查詢當前正在鏈接數據庫的鏈接
db2 force application all 切斷全部鏈接數據庫的鏈接
db2 force application () (<application> 填入程序「db2bp.exe」的句柄,該值由db2 list applications命令得到)
LOGSECOND —— 主日誌文件佔用滿時,能夠分配的二級日誌文件的個數
十8、create table時能夠指定列的默認值,格式以下 WITH DEFAULT 默認值
建立db2自動賦值的標識 subscriberID INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 100 INCREMENT BY 100),
建立系列及引用(和oracle同樣第一次調用須要初始化,即第一次調用只能用nextval): 建立格式:CREATE SEQUENCE seq_name START WITH 10 INCREMENT BY 1 NO CYCLE
引用格式:nextval for seq_name(下一個值)/prevval for seq_name(當前值)
SYSIBM.SYSDUMMY1。這是一個包含一行一列的系統目錄表。若是一個查詢要求只獲得一個輸出,可使用該表。(如oracle的dual表)
• SYSCAT.TABLES
• SYSCAT.INDEXES
• SYSCAT.COLUMNS
• SYSCAT.FUNCTIONS
• SYSCAT.PROCEDURES數據庫