2012-05-15 47 views
0

我對如何使用循環PL/SQL來獲取所有列表結構表的問題,所有的結構表,PL/SQL得到神諭

我有語法循環像波紋管:

BEGIN 
      FOR x IN (SELECT table_name FROM user_tables) 
       LOOP 
         EXECUTE IMMEDIATE 'DESC' || x.table_name; 
       END LOOP; 
      COMMIT; 
END; 

這從SQL Developer的日誌輸出

Error starting at line 14 in command: 
BEGIN 
      FOR x IN (SELECT table_name FROM user_tables) 
       LOOP 
         EXECUTE IMMEDIATE 'DESC' || x.table_name; 
       END LOOP; 
      COMMIT; 
END; 
Error report: 
ORA-00900: invalid SQL statement 
ORA-06512: at line 4 
00900. 00000 - "invalid SQL statement" 
*Cause:  
*Action: 

幫我解決這個

感謝

+0

如何獲取psql中所有表的列表:http://dba.stackexchange .com/questions/1285/how-do-i-list-all-databases-and-tables-with-psql-command-line-tool/ –

回答

0

考慮這個:

Select * from All_tab_Cols 或接近取之於返回描述:

Select Owner, Table_name, ColumN_Name, Data_Type, Data_Length, Nullable 
from all_tab_Cols; 

爲了解決您的具體問題,它不應該是:

EXECUTE IMMEDIATE 'DESC ' || x.table_name|| ';'; 

表名和表名之間缺失空格&;是運行SQL的一部分是不是?

+1

使用'execute immediate'時,包含PL/SQL的分號並將其排除在SQL之外。但是,由於'DESC'既不是那麼有點不相關。 – Allan

2

DESC命令既不是SQL,也不是plsql,而是一個sqlplus命令,所以你不能在一個plsql代碼中使用它。
不僅如此,爲什麼?你可以讓你從USER_TAB_COLUMNS需要的所有值...
使用DBMS_OUTPUT.put_line()代替:

BEGIN 
      FOR x IN (SELECT COLUMN_NAME, DATA_TYPE, NULLABLE FROM USER_TAB_COLUMNS) 
       LOOP 
         DBMS_OUTPUT.put_line(COLUMN_NAME || ' ' || DATA_TYPE || ' ' || NULLABLE); 
       END LOOP; 
      COMMIT; 
END; 

當然,這可以被格式化更好,有您可以選擇更多的列...

0

如果您嘗試對模式進行反向工程,然後使用DBMS_Metadata包來執行此操作,因爲它也可以提取約束,特權和用戶等。