变量作为Oracle PL / SQL中where子句中的列名

时间:2015-01-21 15:13:40

标签: sql database oracle plsql

我正在研究PL / SQL代码,我需要在where子句中使用变量作为列名来执行select查询。列名作为varchar存储在表中,我使用循环将这些列名传递给我的select语句。

请查找我尝试运行的示例代码段:

set serveroutput on;

declare
var varchar2(100);
counter number;
begin

var:='description';
select count(*) 
into counter
            from nodetable
           where  var like '%Ship%';

dbms_output.put_line(counter);
end;

输出:

anonymous block completed
0

然而结果应该是86。 Oracle将最后一个条件比较为两个字符串而不是column = string。

请告诉我这是否在oracle中是否可行,或者是否有解决方法。

此致 ANKIT

3 个答案:

答案 0 :(得分:4)

您必须使用动态SQL,最好使用绑定变量:

EXECUTE IMMEDIATE 
   'select count(*) from nodetable where '||var||' like :p1' 
   INTO counter 
   USING '%Ship%'; 

答案 1 :(得分:1)

试试这个

declare
var varchar2(100);
counter number;
begin

var:='description';
EXECUTE IMMEDIATE
'select count(*) 
into counter
            from nodetable
           where  '||var||' like ''%Ship%'' ';

dbms_output.put_line(counter);
end;

你需要小心结肠(')。

答案 2 :(得分:0)

我同意之前的实施答案,但我严格建议您更改技术要求,因为您不能使用绑定变量,这是注入的潜在地方。例如,如果有人将在您的表中编辑存储列名称的值,则为:“description = inject_function或description”。然后你的动态sql块将执行这个语句:

select count(*) from nodetable where description = inject_function or description like '%Ship%

和函数的示例实现

create function inject_function
return varchar2
is pragma autonomous_transaction;
begin
    delete * from most_important_table;
    commit;
    return to_char(null);
exception when others then
    rollback;
    return to_char(null);
end;