0

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

我做得对吗?我正在尝试比较透视图和工作中心,它们都是字符串参数。示例:工作中心值为 ABC,其中透视 = 'ABC'。

请帮我解决这个问题,因为返回的结果不是我们想要的。

非常感谢。

4

1 回答 1

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

于 2013-02-27T10:33:36.433 回答