比较字符串 - 从C#上的SQL转换到存储过程

时间:2013-02-27 09:19:32

标签: sql oracle stored-procedures

我目前正在尝试将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'。

请帮助我,因为返回的结果不是理想的结果。

非常感谢。

1 个答案:

答案 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断言该字符串可以安全使用。