この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

動的 SOQL

動的 SOQL は、Apex コードを使用して、実行時に SOQL 文字列の作成を参照します。動的 SOQL によって、さらに柔軟なアプリケーションの作成が可能になります。たとえば、エンドユーザの入力に基づいた検索を作成したり、さまざまな項目名のレコードを更新したりできます。

実行時に動的 SOQL クエリを作成するには、次のいずれかの方法で database query メソッドを使用します。

  • クエリが 1 つのレコードを返すときに、1 つの sObject を返します。
    1sObject s = Database.query(string_limit_1);
  • クエリが複数のレコードを返すときに、sObject のリストを返します。
    1List<sObject> sobjList = Database.query(string);

通常の割り当てステートメントや for ループなど、インライン SOQL クエリが使用可能な場合はいつでも、database query メソッドを使用できます。結果は、静的 SOQL クエリの処理とほぼ同様の方法で処理されます。

動的 SOQL 結果は、Account や MyCustomObject__c、または汎用 sObject データ型などのように、具体的な sObject として指定できます。実行時に、システムは、クエリのタイプが宣言された変数の型と一致しているかどうか検証します。クエリが正しい sObject データ型を返さない場合、ランタイムエラーが発生します。これは、汎用 sObject から具体的な sObject を割り当てる必要がないことを意味します。

動的 SOQL クエリには、静的クエリと同じガバナ制限があります。ガバナ制限についての詳細は、「実行ガバナと制限」を参照してください。

SOQL クエリの構文の詳細は、『SOQL および SOSL リファレンス』の「Salesforce Object Query Language (SOQL)」を参照してください。

動的 SOQL に関する考慮事項

動的 SOQL クエリ文字列で単純なバインド変数を使用できます。次の例は許可されます。
1String myTestString = 'TestName';
2List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE Name = :myTestString');
ただし、インライン SOQL とは異なり、動的 SOQL は、バインド変数項目をクエリ文字列で使用できません。次の例はサポートされず、「Variable does not exist」というエラーになります。
1MyCustomObject__c myVariable = new MyCustomObject__c(field1__c ='TestField');
2List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE field1__c = :myVariable.field1__c');
代わりに、次のように変数項目を文字列に解決し、その文字列を動的 SOQL クエリで使用できます。
1String resolvedField1 = myVariable.field1__c;
2List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE field1__c =  :resolvedField1');

SOQL インジェクション

SOQL インジェクションとは、ユーザが SOQL ステートメントをあなたのコードに渡すことで、あなたのアプリケーションで意図していなかったデータベースメソッドを実行する手法です。動的 SOQL ステートメントを構築するためにアプリケーションがエンドユーザ入力に依存し、入力が適切に処理されなかった場合、常に Apex コードで発生する可能性があります。

SOQL インジェクションを防ぐには、escapeSingleQuotes メソッドを使用します。このメソッドは、ユーザから渡される文字列のすべての単一引用符にエスケープ文字 (\) を追加します。このメソッドにより、すべての単一引用符を、データベースコマンドではなく、囲まれた文字列として処理します。