oracle查询表内所有字段长度,如何高效的取得一个用户下所有表的每个字段值的最大长度?...

--下面是我自己写的,感觉效率不高,请高手们帮忙改改

CREATE OR REPLACE PROCEDURE p_tab_length(p_user VARCHAR2) AS

CURSOR cur_tables IS

SELECT table_name

FROM   all_tables

WHERE  owner = p_user AND

table_name <> 'T_TAB_LENGTH'

GROUP  BY table_name;

v_sql        VARCHAR2(20000);

v_table_name VARCHAR2(100);

v_length     NUMBER;

BEGIN

EXECUTE IMMEDIATE 'TRUNCATE TABLE T_TAB_LENGTH';

OPEN cur_tables;

LOOP

FETCH cur_tables

INTO v_table_name;

EXIT WHEN cur_tables%NOTFOUND;

FOR i IN (SELECT table_name,

column_name,

column_id

FROM   all_tab_columns

WHERE  owner = p_user AND

table_name = v_table_name

ORDER  BY column_id)

LOOP

v_length := 0;

v_sql    := 'SELECT MAX(LENGTHB(' || i.column_name || ')) FROM ' || p_user || '.' ||

v_table_name; --此处将表改为绑定变量要报错,可能如何调整呢?

EXECUTE IMMEDIATE v_sql

INTO v_length;

INSERT INTO t_tab_length

(table_name,

cols,

column_id,

cols_len)

VALUES

(i.table_name,

i.column_name,

i.column_id,

v_length);

COMMIT;

END LOOP;

END LOOP;

CLOSE cur_tables;

COMMIT;

EXCEPTION

WHEN OTHERS THEN

dbms_output.put_line(SQLERRM);

END;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值