0

我对如何使用循环 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:

帮我解决这个问题

谢谢

4

3 回答 3

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;

当然,这可以更好地格式化,并且您可以选择更多列...

于 2012-05-15T06:48:25.890 回答
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|| ';'; 

desc & 表名和 ; 之间缺少空格 是要运行的 SQL 的一部分,不是吗?

于 2012-05-15T06:29:26.383 回答
0

如果您尝试对架构进行逆向工程,请使用 DBMS_Metadata 包来执行此操作,因为它还可以提取约束、权限、用户等。

于 2012-05-15T07:38:41.750 回答