2013-02-27 2 views
0

현재 SQL 쿼리를 저장 프로 시저로 변환하려고하고 있지만 문자열 비교시 변환이 어렵습니다.문자열 비교 - C#에서 SQL에서 저장 프로 시저로 변환

begin 
    stmt := ' 
    select label 
    , marking 
      from 
    ( 
    select count(equipment) as num_equipments   
    from CS_PM_EQUI_INFO   
    where '|| perspective ||' = '||' Workcenter '||' 
    ) 

내가 제대로하고있는 건가요 : 아래

String Query = @"select label 
, marking 
from 
(
select count(equipment) as num_equipments 
from CS_PM_EQUI_INFO 
where " + Perspective + " = '" + Workcenter + @"' 
) 

내가 저장 프로 시저로 변환하려고 무엇인가

아래 내 C# 응용 프로그램에서 SQL 코드는? Perspective와 작업 센터를 비교하려고 시도하고 있는데 둘 다 문자열 매개 변수입니다. 예 : 작업 센터 값은 ABC이며, 여기서 perspective = 'ABC'입니다.

반환 된 결과가 원하는 것이 아니므로 친절하게 도와주세요.

감사합니다.

+2

db 서버 (sql-server/mysql/oracle)는 무엇입니까? 하위 쿼리는 기본 쿼리에서 가져 오려고하는 열을 반환하지 않습니다. db 서버 자체에 저장 프로 시저를 만들고 코드에서 매개 변수를 전달하는 이유는 무엇입니까? – Kaf

+0

"num_equipments"열만있는 경우 "marking"및 "label"열의 SELECT가 실제로 작동하는지 잘 모르겠습니다. – Sebastian

+0

안녕하세요 카프, 지금 당장 오라클을 사용하고 있습니다. – Wil50n

답변

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을 사용해야합니다.

관련 문제