我正在尝试编写一个使用元数据和表内部数据的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
答案 0 :(得分: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 :(得分: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));
答案 2 :(得分:0)
您无法直接使用SQL实现此目的。你需要PL / SQL + Execute Immediate来完成这项工作。
for each
循环计算每列的最大长度。