2017-04-04 2 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)); 

모두 5 개 개의 테이블이 동일한 하나의 열이 이름은 'ABC'입니다.

table1에 ('JOHN.TEDA','avdv'),('MARK.LEE','fesf'),('JOHN.DEA','fwfd')과 같은 3 개의 행이 있고 다른 테이블에도 이와 같은 데이터가 있다고 가정합니다.

이제 열 이름을 입력 ('ABC')로 사용하면 이라는 출력이 표시됩니다.

user_tab_columns에서 열 정보를 얻을 수 있습니다.

최대 길이는 열에서 기존 데이터의 최대 길이 : 내가 모두 enter image description here 테이블는 참조되지 않습니다 가입에 문제가 무엇입니까

select max(length(ABC)) from table1 

을 의미한다.

+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

줄 단위 행 삽입물에는 요금이 부과됩니다. 느린 방법으로 일명 느리게 행을 피하십시오. –

관련 문제