3

「DESCRIBE table/view;」を使わずに TABLES や VIEWS を記述する方法を研究してきました。句。次のようなものを使用して解決できることがわかりました。

SELECT column_name, data_type, data_length, data_precision, data_scale, nullable
FROM all_tab_columns
WHERE table_name = 'TABLE'

これは、PHP のようなコンピューター言語で完全にプログラム可能ですが、'DESCRIBE package_name' 句の回避策が見つかりませんでした。

私は次の考えを持っています(まだSQL * PLUSでスプールを使用しています):

DECLARE
  x VARCHAR2(50);
  CURSOR cursorPaquetes IS
    SELECT DISTINCT OBJECT_NAME
    FROM ALL_OBJECTS
    WHERE OBJECT_TYPE = 'PACKAGE' AND OWNER = 'SATURN';
BEGIN
  FOR item IN cursorPaquetes LOOP
    x := 'DESCRIBE '||item.OBJECT_NAME||';';
    EXECUTE IMMEDIATE x;
  END LOOP;
END;

しかし、うまくいきませんでした:(。次のエラーがスローされます。

ORA-00900: センテンシア SQL が有効ではありません ORA-06512: 12 行目です

そして、「x」変数を次のように変更すると:

x := 'BEGIN DESCRIBE '||item.OBJECT_NAME||'; END;';

次のエラーが表示されます。

行 1 のエラー: ORA-06550: 行 1、列 16: PLS-00103: 次のいずれかを予期しているときに、シンボル "BVGKFDCS" が検出されました: := 。( @ % ; 続行するには、記号 ":=" が "BVGKFDCS" の代わりに使用されました。ORA-06512: en linea 12

ここで、「BVGKFDCS」はスキーマのパッケージの 1 つの名前です。

前もって感謝します。

PD私はそのようなものを手に入れたいです(ただし、パッケージごとに):

DESCRIBE BVGKFDCS;

PROCEDURE P_GETPROFESSORS
 Nombre de Argumento            Tipo                    E/S   ¿Por Defecto?
 ------------------------------ ----------------------- ------ --------
 P_CAMP_IN                      VARCHAR2                IN
 P_COLL_IN                      VARCHAR2                IN
 P_DEPT_IN                      VARCHAR2                IN
 P_TERM_IN                      VARCHAR2                IN
PROCEDURE P_GETTERMSBYPROF
 Nombre de Argumento            Tipo                    E/S   ¿Por Defecto?
 ------------------------------ ----------------------- ------ --------
 NAME_ARRAY                     TABLE OF VARCHAR2(32000) IN
 VALUE_ARRAY                    TABLE OF VARCHAR2(32000) IN
PROCEDURE P_INIT
 Nombre de Argumento            Tipo                    E/S   ¿Por Defecto?
 ------------------------------ ----------------------- ------ --------
 PIDM                           VARCHAR2                IN
PROCEDURE P_OBTENER_VALOR
 Nombre de Argumento            Tipo                    E/S   ¿Por Defecto?
 ------------------------------ ----------------------- ------ --------

この出力は次のものとは異なることに注意してください。

select * from user_source
4

4 に答える 4

2

User_Source、DBA_SOURCE、または All_Source を使用する必要があります。すべてのコードはそこに保存されます。

select text 
from user_source
where name = 'procedure_name' 
order by line;

オブジェクトのタイプ: FUNCTION、JAVA SOURCE、PACKAGEPACKAGE BODY、PROCEDURE、TRIGGER、TYPE、TYPE BODY

于 2015-05-06T20:16:35.920 に答える
0

describeexecute immediateSQLまたはPL/SQLコマンドの一部ではなく、SQL*Plusコマンドであるため、内部では機能しません。サーバーではなく、クライアントによって解釈されます。

データベース オブジェクト (パッケージとパッケージ本体を含む) のソースを取得する最良の方法は、@TS で提案されているようにDBA_SOURCEまたはです。USER_SOURCE

データベース内のあらゆる種類のオブジェクトのデータ ディクショナリ ビューがあります。他のオブジェクト タイプの同様の種類のデータを取得しようとする場合は、dictionaryビューを参照する必要があります。これにより、データ ディクショナリが便利にカタログ化されます。例として、dictionaryエントリuser_sourceは次のとおりです。

TABLE_NAME  | COMMENTS
------------+------------------------------------------------
USER_SOURCE | Source of stored objects accessible to the user

プロシージャ名はパッケージ仕様の一部です。all_sourceパッケージ名を使用してクエリをtype='package'実行すると、すべてのパブリック プロシージャとそのパラメーターを含む仕様が返されます。

于 2015-05-06T21:03:51.553 に答える
-1

これはあなたのために働きますか?

SQL> SELECT DBMS_METADATA.GET_DDL('PACKAGE','EMP_PKG','SCOTT') FROM DUAL;

SQL> SELECT DBMS_METADATA.GET_DDL('PACKAGE_BODY','EMP_PKG','SCOTT') FROM DUAL;

SQL> show user
USER is "SYSTEM"
SQL>
SQL> l
  1* SELECT DBMS_METADATA.GET_DDL('PROCEDURE','P1','HR') FROM DUAL
SQL> /

DBMS_METADATA.GET_DDL('PROCEDURE','P1','HR')
-----------------------------------------------------------------------------

  CREATE OR REPLACE PROCEDURE "HR"."P1" ( p_id int) as
begin
   dbms_output.put

SQL>
于 2015-05-06T20:50:49.453 に答える