【LANSA Tips】LANSAからSQL Serverのストアドプロシージャーを呼び出す方法
質問
LANSAからSQL Serverのストアドプロシージャーを呼び出せますか?
回答
自由形式のSELECT_SQLを使用して呼び出せます。
以下は、フィールドEMPNUMBER(Key)、LASTNAME、FIRSTNAME、EMP_AGEを持つPC OtherファイルEmployeeDATAを使用した例です。
ストアドプロシージャーはFindEmployeesOverXを使用します。
SQL Serverで、次のストアドプロシージャーを作成します。
CREATE PROCEDURE FindEmployeesOverX
— Add the parameters for the stored procedure here
@Age Decimal(18) = 35,
AS
BEGIN
SET NOCOUNT ON;
SELECT EMPNUMBER, LASTNAME, FIRSTNAME, EMP_AGE
from StoredProcedureTest.dbo.EmployeeDATA
where EMP_AGE <= @Age
END
LANSAからストアドプロシージャーにアクセスする方法は次の通りです。
以下の例は、@Ageの省略値の 35 で、EmployeeDATAを検索します。
DEF_LIST NAME(#EMPLOYEES) FIELDS(#EMPNUMBER #LASTNAME #FIRSTNAME #EMP_AGE) TYPE(*WORKING)
CLR_LIST NAMED(#EMPLOYEES)
SELECT_SQL FIELDS(#EMPNUMBER #LASTNAME #FIRSTNAME #EMPAGE ) FROM_FILES((EMPLOYEEDATA)) USING(DBO.FINDEMPLOYEESOVERX)
ADD_ENTRY TO_LIST(#EMPLOYEES)
ENDSELECT
ストアドプロシージャーに、検索値をパラメータで渡したい場合は、USING パラメータに文字列を指定します。
DEF_LIST NAME(#EMPLOYEES) FIELDS(#EMPNUMBER #LASTNAME #FIRSTNAME #EMP_AGE) TYPE(*WORKING)
CLR_LIST NAMED(#EMPLOYEES)
DEFINE FIELD(#AGE) TYPE(*SIGNED) LENGTH(3) DECIMALS(0) DEFAULT(25)
DEFINE FIELD(#SQLQUERY) TYPE(*CHAR) LENGTH(100)
#SQLQUERY:= “DBO. FINDEMPLOYEESOVERX@AGE = '" + #AGE + “'"
SELECT_SQL FIELDS(#EMPNUMBER #LASTNAME #FIRSTNAME #EMP_AGE) FROM_FILES((EMPLOYEEDATA)) USING(#SQLQUERY)
ADD_ENTRY TO_LIST(#EMPLOYEES)
ENDSELECT
注意点は、ストアドプロシージャーのカラムセットと、LANSAが交換するカラムセットが一致している必要があることです。
以下の例では、ストアドプロシージャーのカラムは、EmpNumberのみです。
SELECT EmpNumber
from StoredProcedureDB.dbo.EmployeeDATA
そのため、以下のSelect_SQLステートメントは失敗します。
SELECT_SQL FIELDS(#EMPNUMBER #LASTNAME #FIRSTNAME #EMPAGE ) FROM_FILES((EMPLOYEEDATA)) USING(DBO.RETURNEMPLOYEENUMBERSONLY)
正しく実行するには、次のように記述しなければなりません。
SELECT_SQL FIELDS(#EMPNUMBER) FROM_FILES((EMPLOYEEDATA)) USING(DBO.RETURNEMPLOYEENUMBERSONLY)
また、カラムの順番も一致していなければなりません。
SELECT EMPNUMBER, FirstName, LastName from StoredProcedureTest.dbo.EmployeeDATA where FirstName = @GivenName
以下の例では、LASTNAME、FIRSTNAMEに逆の値が返ります。
SELECT_SQL FIELDS(#EMPNUMBER #LASTNAME #FIRSTNAME ) FROM_FILES((EMPLOYEEDATA)) USING(DBO.FINDEMPLOYEESNAMED)
そのため、次のように記述しなければなりません。
SELECT_SQL FIELDS(#EMPNUMBER #FIRSTNAME #LASTNAME ) FROM_FILES((EMPLOYEEDATA)) USING(DBO.FINDEMPLOYEESNAMED)
使用方法の詳細は、以下のマニュアルを参考ください。
https://docs.lansa.com/15/ja/lansa015/index.htm#lansa/select_sql_free_e.htm#SELECT_SQL_FREE_E_eg5
有償の「LANSAテクニカル・ホットライン・サービス」をご契約いただければ、過去データベースの検索から今回ご紹介した以外の技術情報を探すことも出来ます。 「LANSAテクニカル・ホットライン・サービス」のご契約についてはお問い合わせフォーム(https://www.lansa.jp/inquiryform/)よりお問い合わせください。