2017-04-04 10 views
1

とOracleのメタデータを取得のようなものです:すべての5つのテーブルは同じで一つの列を持っているは、私はメタデータとtable.Itの内部データの両方を使用してPL/SLの手順を記述しようとしています内部データ

table1 (ABC varchar2(50),wsx varchar2(50)); 
table2 (ABC number(50),dv varchar2(50)); 
table3 (ABC varchar2(10),wsds varchar2(50)); 
table4 (ABC varchar2(20),wfsdg varchar2(50)); 
table5 (ABC number(50),wsxsfd varchar2(50)); 

名前'ABC'

table1に ('JOHN.TEDA','avdv'),('MARK.LEE','fesf'),('JOHN.DEA','fwfd')のような3行があり、他のテーブルにもこのようなデータがあるとします。

今私が添付 として出力を取得する必要があります入力(「ABC」)とカラム名を使用して。

我々はuser_tab_columnsから列情報を取得することができます。

最大長はカラム内の既存のデータの最大長さを意味::

select max(length(ABC)) from table1 

私は両方enter image description here のテーブルを結合して、問題を取得しています参照ではありません。

+0

あなたの質問は、どのようなものです:あなたはそれらのデータ、またはそのメタデータを取得したいですか? –

+0

組み合わせを取得しようとしています。添付されたテーブルの最初の5列はメタデータであり、最大長はデータから取得されます – Beginner

答えて

0

あなたはSQLで直接これを達成することはできません。ジョブを実行するには、PL/SQL + Execute Immediateが必要です。

  • 各列の最大長をカウントするfor eachループを使用して、あなたの期待列
  • を持つテーブルを作成します。
+0

ええ、それは私が最後にしたものです。また、結果を保存するテーブルを作成しました。 – Beginner

1

私はOracleでPIPELINED関数を使用して説明したシナリオを複製しようとしました。お役に立てれば。

CREATE OR REPLACE TYPE fun_obj 
IS 
    OBJECT 
    (
    tab_name VARCHAR2(100), 
    colname VARCHAR2(100), 
    datatyp VARCHAR2(100), 
    datlen NUMBER, 
    nullable VARCHAR2(1), 
    LEN  NUMBER); 
/

CREATE OR REPLACE 
    FUNCTION test_max_count(
     colname IN VARCHAR2) 
    RETURN fun_tab PIPELINED 
    AS 
    tab fun_obj:=fun_obj(NULL,NULL,NULL,NULL,NULL,NULL); 
    lvlen NUMBER; 
    BEGIN 
    FOR I IN 
    (SELECT DISTINCT table_name, 
     OWNER, 
     COLUMN_NAME, 
     DATA_TYPE, 
     DATA_LENGTH, 
     NULLABLE, 
     NULL AS MAX_LEN 
    FROM all_tab_columns 
    WHERE column_name = colname 
    ) 
    LOOP 
     tab.tab_name:=i.table_name; 
     tab.colname :=i.COLUMN_NAME; 
     tab.datatyp :=i.DATA_TYPE; 
     tab.datlen :=i.DATA_LENGTH; 
     tab.nullable:=i.NULLABLE; 
     EXECUTE IMMEDIATE 'SELECT MAX(LENGTH('||i.column_name||')) FROM '||I.OWNER||'.'||I.TABLE_NAME INTO lvlen; 
     tab.len:=lvlen; 
     PIPE ROW(tab); 
    END LOOP; 
    END; 
/

------------------------------------To Execute---------------------------------- 

SELECT * FROM TABLE(test_max_count('abc')); 
1
CREATE OR REPLACE PROCEDURE test2 (p_column_name IN varchar ) 
    IS 

    CURSOR GET_DATA (COL VARCHAR)IS 

    SELECT TABLE_NAME ,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,NULLABLE 
    FROM 
    user_tab_columns where COLUMN_NAME = COL; 

    a_table varchar2(50); 
    B_COL varchar2(50); 
    a_max varchar2(50); 

    BEGIN 

    FOR C IN GET_DATA(p_column_name) LOOP 

    a_table := c.table_name; 
    B_COL := C.COLUMN_NAME;   

    EXECUTE IMMEDIATE 'SELECT MAX(LENGTH('||B_COL||')) FROM '||a_table into a_max ;    

    insert into received_Data values (c.table_name,C.COLUMN_NAME,C.DATA_TYPE,C.DATA_LENGTH,C.NULLABLE,a_max); 

    END LOOP; 


    EXCEPTION 
      WHEN OTHERS THEN 
       RAISE_APPLICATION_ERROR (-20001, 
              p_column_name || ':$:' || SQLERRM, TRUE) ; 
    END test2; 

    /

    CREATE TABLE RECEIVED_DATA 
    (TABLE_NAME VARCHAR2(50 BYTE), 
     COLUMN_NAME VARCHAR2(50 BYTE),  
     DATA_TYPE VARCHAR2(50 BYTE), 
     DATA_LENGTH VARCHAR2(50 BYTE), 
     IS_NULL  VARCHAR2(50 BYTE), 
     MAX_LENGTH VARCHAR2(50 BYTE)); 
+0

行単位で挿入するには間違いなく通行料が必要です。常に遅いアプローチでゆっくりと行を避けてください。 –

関連する問題