2017-07-16 51 views
1

這個任務有想到的兩個選項:獲取庫行的所有文件的數量與SQL

選項1:簡單明瞭的方式

  1. 執行select table_name from qsys2.systables where table_schema = 'LIBRARY'
  2. 對於輸出的每個條目執行select count(*) from LIBRARY.TABLENAME
  3. 保存結果並重復步驟2

選項2:動態SQL語句

  1. 嘗試包script結果爲begin和隨後execute immediate sql; end;聲明。

不幸的是,在這段代碼with條款不能與begin使用,我不知道如何改寫整個腳本正常離不開它。

有人能拿出解決方案,性能比選項1中所述的更好嗎?

所需的輸出格式:

╔════════════╦═══════╗ 
║ TABLE_NAME ║ COUNT ║ 
╠════════════╬═══════╣ 
║ a1   ║ 432 ║ 
║ a2   ║  9 ║ 
║ a3   ║  0 ║ 
╚════════════╩═══════╝ 

UPD

基於答案我已經來到這個程序腳本,它不能正常工作,但是:

CREATE PROCEDURE LIB/CNT           
    LANGUAGE SQL              
BEGIN                
    CREATE TYPE CHARARRAY AS VARCHAR(10) ARRAY[500];    
    DECLARE NAMES CHARARRAY;          
    DECLARE i INTEGER;            
    SET i = 1;              
    SET names = ARRAY[SELECT table_name FROM qsys2.systables WHERE 
table_schema = 'LIBRARY'];           
    SET numNames = CARDINALITY(names);        
    WHILE i <= numNames           
     SET stmt = 'SELECT ' || names[i] || ' AS TABLE_NAME,  
COUNT(*) FROM ' || names[i];          
     PREPARE s1 FROM stmt;          
     EXECUTE s1;            
    END WHILE;              
END; 

CREATE TYPE reference.

錯誤消息:Token NAMES was not valid. Valid tokens: GLOBAL.

添加global名字給人Token NAMES was not valid. Valid tokens: TEMPORARY.

回答

3

你不需要做任何事情,該信息已經被系統收集...

SELECT SYSTEM_TABLE_SCHEMA, SYSTEM_TABLE_NAME 
     , NUMBER_ROWS, TABLE_SCHEMA, TABLE_NAME 
FROM systablestat 
WHERE SYSTEM_TABLE_SCHEMA = 'MYLIB'; 

以供將來參考,標準目錄已經存在了一段時間。
DB2 for i catalog views

也爲我的團隊的DB2繼續通過SQL
DB2 for i - Services

+0

謝謝,夥計,就是這樣。我已經更新了你的答案,以便更準確(添加'qsys2',刪除redudant列) –

+0

@im_infamous他們可能對你而言是多餘的,但不是下一個人。我將它們包括在內,以便您能夠看到並搜索事物的長SQL名稱。 – Charles

0

您可以嘗試使用下面的腳本之前:

BEGIN 
    CREATE TYPE namesArray AS VARCHAR(100) ARRAY[100]; 
    DECLARE names namesArray; 
    DECLARE i INTEGER; 
    SET i = 1; 
    SET names = ARRAY[SELECT table_name FROM qsys2.systables WHERE table_schema = 'LIBRARY']; 
    SET numNames = CARDINALITY(names); 
    WHILE i <= numNames 
     SET stmt = 'SELECT ' || names[i] || ' AS TABLE_NAME, COUNT(*) FROM ' || names[i]; 
     PREPARE s1 FROM stmt; 
     EXECUTE s1; 
    END WHILE; 
END 

這裏的策略是填充names陣列從表名你的第一個查詢。然後,遍歷該數組並在每個表上動態執行計數查詢。

+0

不幸的是,錯誤線4在'ARRAY'增加「服務」,以使提供的信息:'操作只允許數組變量。 ' –

+0

@im_infamous這應該是工作的,至少在存儲過程中,從我所能看到的。 [看看這裏](https://www.toadworld.com/platforms/ibmdb2/w/wiki/7790.sql-pl-array-functions-array-array-agg)其中'ARRAY'被用作I在我的答案中使用了它。 –

+0

'names'需要被聲明,但是。我試過'CHARARRAY'沒有成功。鏈接:https://www.ibm.com/support/knowledgecenter/en/SSEPEK_12.0.0/apsg/src/tpc/db2z_arrays.html –

1

瞭解主題指定 「使用SQL」,還是要建議,如果你不介意執行本地AS/400命令

DSPFD FILE(LIBRARY/* ALL)TYPE(* MBRLIST )將創建或替換包含字段「MLNRCD」的表格「TABLLIST」=每個表/成員的當前記錄數(行)可以更容易地使用SQL進行處理:

「SELECT MLFILE,MLNRCD FROM LIBRARY/TABLLIST」應該產生表和行。

相關問題