2017-04-04 30 views
1

我试图写它采用两元数据和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有3行像 ('JOHN.TEDA','avdv'),('MARK.LEE','fesf'),('JOHN.DEA','fwfd')和其他表也有这样的任何数据。

现在使用列名作为输入('ABC')我应该得到输出为 附加。

我们可以从user_tab_columns获得专栏信息。

最大长度是指在现有的列数据的最大长度::

select max(length(ABC)) from table1 

我加盟两种enter image description here 表不指涉越来越问题。

+0

什么是你的问题,然后:你想找回自己的数据,或者它们的元数据? –

+0

试图获得组合。附表中的前五列是元数据,最大长度从数据中检索 – Beginner

回答

0

你不能直接用SQL来实现这一点。你需要PL/SQL + Execute立即执行这项工作。

  • 创建表与所需的列
  • 然后使用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

逐行插入肯定会有收费。通过缓慢的方法总是避免逐行缓慢。 –