用于最大列长度的Oracle SQL函数在调用时返回NULL

np8igboo  于 2023-05-16  发布在  Oracle
关注(0)|答案(1)|浏览(113)

我构建了一个函数,该函数应该返回指定表的每列中存储的最大值(不是允许的最大值,而是实际存在的数据)。单独运行代码会将结果作为服务器输出返回,当调用时,它只显示所有表的NULL。

功能:

CREATE OR REPLACE FUNCTION COL_MAX_LENGTH(table_name VARCHAR2, column_name VARCHAR2)
RETURN INTEGER 
    IS
    v_ln INTEGER;

BEGIN

   FOR r IN (
            select table_name, column_name
            from all_tab_cols
            WHERE owner = '' --MY TABLE OWNER VALUE
            AND table_name = '' --MY TABLE NAME VALUE
            AND column_id IS NOT NULL
            )
   LOOP
      EXECUTE IMMEDIATE 'select max(length('||r.column_name||')) from '||r.table_name into v_ln;
      dbms_output.put_line('Table: '||r.table_name||', Column: '||r.column_name||', v_ln: '||v_ln);
   END LOOP;

   RETURN v_ln;

END;

查询调用功能:

SELECT COL_MAX_LENGTH(table_name,column_name)
    FROM all_tab_cols ATC

尝试指定不同的数据类型,修改循环内外的所有参数,但都不起作用

62o28rlo

62o28rlo1#

功能代码错误。在函数中循环是无用的;查询(遍历所需表中的所有列)本身会“循环”。
因此,只需选择max length并返回它。
应该是这样的:

SQL> CREATE OR REPLACE FUNCTION COL_MAX_LENGTH (p_table_name VARCHAR2, p_column_name VARCHAR2)
  2     RETURN INTEGER
  3  IS
  4     v_ln  INTEGER;
  5  BEGIN
  6     EXECUTE IMMEDIATE 'select max(length(' || p_column_name || ')) from ' || p_table_name
  7        INTO v_ln;
  8
  9     RETURN v_ln;
 10  END;
 11  /

Function created.

SQL>

测试:

SQL> SELECT table_name, column_name, COL_MAX_LENGTH (table_name, column_name) max_len
  2    FROM all_tab_cols ATC
  3   WHERE table_name = 'DEPT';

TABLE_NAME                     COLUMN_NAME                       MAX_LEN
------------------------------ ------------------------------ ----------
DEPT                           LOC                                     8
DEPT                           DNAME                                  10
DEPT                           DEPTNO                                  2

SQL>

相关问题