我目前正在尝试将sql查询转换为存储过程,但在比较字符串时我很难转换。
下面是我的C#应用程序上的SQL代码:
String Query = @"select label
, marking
from
(
select count(equipment) as num_equipments
from CS_PM_EQUI_INFO
where " + Perspective + " = '" + Workcenter + @"'
)
以下是我尝试转换为存储过程的内容:
begin
stmt := '
select label
, marking
from
(
select count(equipment) as num_equipments
from CS_PM_EQUI_INFO
where '|| perspective ||' = '||' Workcenter '||'
)
我做得对吗?我试图比较perspective和workcenter,两者都是字符串参数。示例:Workcenter值为ABC,其中perspective ='ABC'。
请帮助我,因为返回的结果不是理想的结果。
非常感谢。
答案 0 :(得分:1)
首先,您的现有代码中存在SQL注入漏洞:变量Workcenter
的值嵌入在SQL语句中,而您应该使用绑定变量。另外Perspective
包含列的名称,您应该确保它不包含SQL注入尝试(dbms_assert
包对此有用)。
其次,当您选择子查询中不存在的外部查询中的列时,我不确定您的现有查询是如何工作的。
对于实际的解决方案,在Oracle存储过程中,您可以执行以下操作:
function my_func(my_column in varchar2, my_value in varchar2) return varchar2 is
q varchar2(1000);
return_value varchar2(1000);
begin
q := 'select other_column from my_table where ' || my_column || ' = :my_value';
execute immediate q into return_value using my_value;
return return_value;
end my_func;
如果最终用户可以指定my_column
(即,不是代码中的常量),那么您应该使用dbms_assert.simple_sql_name
断言该字符串可以安全使用。