Oracle PLS 00302:必须在函数中声明组件数据类型
我必须遵循oracle函数build_select,它创建一个select请求。返回值的格式如下:Oracle PLS 00302:必须在函数中声明组件数据类型,oracle,plsql,Oracle,Plsql,我必须遵循oracle函数build_select,它创建一个select请求。返回值的格式如下: select col1 ||'|'||col2 ||'|'||col3 from table; 以下是build_select功能: create or replace FUNCTION build_select ( p_table_name IN VARCHAR2 ) RETURN VARCHAR2 AS l_ret VARCHAR2 (32767); BEGIN
select col1 ||'|'||col2 ||'|'||col3 from table;
以下是build_select功能:
create or replace FUNCTION build_select (
p_table_name IN VARCHAR2
)
RETURN VARCHAR2
AS
l_ret VARCHAR2 (32767);
BEGIN
FOR eachcol IN ( SELECT column_name, data_type
, LEAD (column_name), LEAD (data_type)
OVER (
PARTITION BY table_name ORDER BY column_id
)
next_column
FROM all_tab_cols
WHERE table_name = p_table_name
ORDER BY column_id)
LOOP
IF eachcol.data_type = 'CLOB' THEN
l_ret := l_ret || dbms_lob.substr( eachcol.column_name, 3000, 1 ) || CASE WHEN eachcol.next_column IS NULL THEN NULL ELSE ' ||''|''||' END;
ELSE
l_ret := l_ret || eachcol.column_name || CASE WHEN eachcol.next_column IS NULL THEN NULL ELSE ' ||''|''||' END;
END IF;
END LOOP;
IF l_ret IS NULL
THEN
raise_application_error (-20001, 'table ' || p_table_name || ' not found');
END IF;
l_ret := 'select ' || l_ret || ' from ' || p_table_name || ';';
RETURN l_ret;
END build_select;
我想做的是测试列的数据类型是否为CLOB,如果是,则将其作为
dbms_lob.substr( eachcol.column_name, 3000, 1 )
我在循环部分添加了if-else条件。但我得到了一个错误:
PLS 00302 : component DATA_TYPE must de declared.
有什么帮助吗
我需要这样做,因为当我对返回的select执行假脱机时,它不会返回所有列,这是CLOB数据类型的原因。我认为您的函数应该是:
create or replace FUNCTION build_select (
p_table_name IN VARCHAR2
)
RETURN VARCHAR2
AS
l_ret VARCHAR2 (32767);
BEGIN
FOR eachcol IN ( SELECT column_name, data_type
FROM all_tab_cols
WHERE table_name = p_table_name
ORDER BY column_id)
LOOP
IF eachcol.data_type = 'CLOB' THEN
l_ret := l_ret || 'dbms_lob.substr( '||eachcol.column_name||', 3000, 1 ),';
ELSE
l_ret := l_ret || eachcol.column_name||',';
END IF;
END LOOP;
IF l_ret IS NULL
THEN
raise_application_error (-20001, 'table ' || p_table_name || ' not found');
END IF;
l_ret := 'select ' || regexp_replace(l_ret, ',$', NULL) || ' from ' || p_table_name || ';';
RETURN l_ret;
END build_select;
注意,
ALL_TAB_COLS
还会选择系统生成的隐藏列和不可见列,这可能是一个问题。查询所有选项卡\u列
是否要对其进行筛选。您发布的代码有一个错误:LEAD(列名称)
缺少窗口规范。这与您的错误描述不匹配。修正张贴。