Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用内部数据检索Oracle元数据_Sql_Plsql_Oracle11g_Database Metadata - Fatal编程技术网

Sql 使用内部数据检索Oracle元数据

Sql 使用内部数据检索Oracle元数据,sql,plsql,oracle11g,database-metadata,Sql,Plsql,Oracle11g,Database Metadata,我正在尝试编写一个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 var

我正在尝试编写一个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'

假设表1有3行,如下所示
('JOHN.TEDA'、'avdv')、('MARK.LEE'、'fesf')、('JOHN.DEA'、'fwfd')
和其他表格也有类似的数据

现在使用列名作为输入('ABC'),我应该将输出作为 附件

我们可以从
user\u tab\u columns
获取列信息

“最大长度”表示列中现有数据的最大长度:

select max(length(ABC)) from table1
我很难同时加入这两个组织
表不是引用的。

不能直接用SQL实现这一点。您需要PL/SQL+executeimmediate来完成这项工作

  • 创建一个包含所需列的表
  • 然后对每个循环使用
    ,计算每列的最大长度

我已尝试使用Oracle中的流水线函数复制您提到的场景。希望这有帮助

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'));

那么,您的问题是:您想检索他们的数据或元数据吗?尝试获取一个组合。附表的前五列是元数据,从dataYeah中检索最大长度。。这就是我最后做的。另外,我创建了一个表来存储结果。逐行插入肯定会有代价。始终避免一行一行的缓慢接近。
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));