【LANSA Tips】LANSAからSQL Serverのストアドプロシージャーを呼び出す方法

World WideのLANSA技術フォーラムに投稿されたトピックと、日本のお客様からのお問い合わせへの回答の中から、皆様にお役に立つLANSAの開発テクニックやトラブルシュートに関する情報をご紹介します。

質問

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/)よりお問い合わせください。

LANSAコミュニティに登録する

IBMi(AS/400)をご利用の企業様必読!
LANSAを利用したIBM iの活用方法・成功事例をお届け致します。