我正在研究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
答案 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;