MSSQL - sp_executesql / Oracle
sp_executesql은 SQL Server에서 동적 SQL 문을 실행하는 데 사용되는 시스템 저장 프로시저입니다.
동적 SQL은 실행 중에 문자열로 구성된 SQL 문을 생성하고 실행하는 것을 의미합니다. 예를 들어, 조건에 따라 다른 WHERE 절을 사용하는 쿼리를 작성하고자 할 때, 동적 SQL을 사용할 수 있습니다.
sp_executesql을 사용하면 동적 SQL을 실행하기 전에 입력 매개 변수의 데이터 형식을 정의할 수 있습니다. 이렇게 하면 SQL Server가 매개 변수를 문자열로 변환하기 전에 데이터 형식을 검사할 수 있습니다. 이렇게 하면 SQL Server에서는 데이터 형식 변환 오류를 방지할 수 있습니다.
DECLARE @SQLString nvarchar(500); DECLARE @ParmDefinition nvarchar(500); DECLARE @City nvarchar(75); SET @City = N'London'; SET @SQLString = N'SELECT * FROM Person.Address WHERE City = @CityParm'; SET @ParmDefinition = N'@CityParm nvarchar(75)'; EXECUTE sp_executesql @SQLString, @ParmDefinition, @CityParm = @City; |
이 쿼리는 @City 매개 변수를 사용하여 City 열에 대한 조건을 동적으로 생성하고 실행합니다. sp_executesql을 사용하여 @City 매개 변수의 데이터 형식을 nvarchar(75)로 정의하였기 때문에 SQL Server에서는 데이터 형식 변환 오류를 방지할 수 있습니다.
오라클로 변환하려면 어떻게 해야할까?
오라클에서는 EXECUTE IMMEDIATE문이 문자열을 실행하는 데 사용되며, 실행될 쿼리문에 바인드 변수를 포함할 수 있습니다. EXECUTE IMMEDIATE는 문자열을 파싱할 때 자료형을 인식하기 때문에, 자동으로 형변환을 수행합니다. 따라서 오라클에서는 sp_executesql과 같은 함수가 필요하지 않습니다.
INTO 구문은 결과를 저장할 변수를 지정합니다. USING 구문은 바인드 변수에 값을 바인딩합니다
DECLARE SQLString VARCHAR2(500); City VARCHAR2(75) := 'London'; Result SYS_REFCURSOR; BEGIN SQLString := 'SELECT * FROM Person.Address WHERE City = :CityParm'; OPEN Result FOR SQLString USING City; -- 여기서 Result 변수를 사용하여 결과 처리 END; |
저장할 변수가 여러개 인경우.. DECLARE SQLString VARCHAR2(500); City VARCHAR2(75) := 'London'; Street VARCHAR2(100); ZipCode VARCHAR2(10); BEGIN SQLString := 'SELECT Street, ZipCode FROM Person.Address WHERE City = :CityParm'; EXECUTE IMMEDIATE SQLString INTO Street, ZipCode USING City; -- 여기서 Street, ZipCode 변수를 사용하여 결과 처리 END; |