我创建了一个返回表的函数。这个函数有 varchar2 参数,真正令人惊讶的是这个参数返回 NULL 值,我无法理解这里发生了什么。
该函数的目的是执行动态SQL查询并返回一个表。
为了简单起见,我删除了所有复杂的代码行。下面的代码仅返回参数值。我需要在IF BLOCK中使用这个参数。但是,我的 if 块总是返回 false,这是因为参数获取 NULL 值。
create or replace function traudit04011 (
XPARAM IN VARCHAR2)
return clob sql_macro as
sql_statement varchar2(5000);
vc_condition varchar(1000);
p_search_by1 varchar(100) := '';
begin
IF XPARAM is not NULL THEN
DBMS_OUTPUT.PUT_LINE('TRUE');
ELSE
DBMS_OUTPUT.PUT_LINE('FALSE');
END IF;
sql_statement := 'select ''' || XPARAM || ''' d1 from dual'; -- In real world, instead of XPARAM there will be a variable storing dynamic query
return sql_statement;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.put_line('error');
end;
现在执行上面的函数:
select * from traudit04011('This is a parameter that always returns null')
这里出了什么问题。我已经花了 6 个小时来解决这个问题。奇怪的是,如果我将参数的数据类型更改为 INT,该函数就会开始工作。 :)
任何帮助将不胜感激..
您已在查询中使用了具有正常字符串连接的输入参数。
需要在动态查询中直接使用
function_name.input_variable_name
,如下:
sql_statement := 'select traudit04011.XPARAM d1 from dual';