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開発者からのログ出力です

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

コマンドはDESCSQLでも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 または、describe から返されるものに近づける:

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

特定の問題に対処するには、次のようにすべきではありません。

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

説明とテーブル名と ; の間にスペースがありません。実行するSQLの一部ですよね?

于 2012-05-15T06:29:26.383 に答える
0

スキーマをリバース エンジニアリングしようとしている場合は、制約、特権、ユーザーなども抽出できるため、DBMS_Metadata パッケージを使用して実行します。

于 2012-05-15T07:38:41.750 に答える