Sql 使用内部数据检索Oracle元数据
我正在尝试编写一个PL/SL过程,该过程同时使用元数据和表的内部数据,如下所示: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
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来完成这项工作
- 创建一个包含所需列的表
- 然后对每个循环使用
,计算每列的最大长度
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));