在 BigQuery 中儲存及管理企業查詢

適用於 ABAP 的 BigQuery AI 和 ML SDK 可讓您將 BigQuery 做為集中式查詢存放區,用於儲存、維護及擷取可透過 ABAP 應用程式執行的查詢。

集中式查詢存放區可為經過驗證且經過最佳化的查詢提供單一來源。BigQuery 是集中式查詢存放區,可供 BigQuery AI 和 ML SDK for ABAP 的不同模組使用,用於擷取及執行已儲存的查詢。

如要進一步瞭解 BigQuery 中的儲存查詢,請參閱「儲存查詢簡介」。

事前準備

在將 BigQuery 用作集中式查詢存放區之前,請確認您或管理員已完成下列必要條件:

在 BigQuery 中建立企業查詢

如要在 BigQuery 中草擬、驗證及儲存查詢,請使用 BigQuery Studio。如要瞭解如何在 BigQuery Studio 中建立查詢,請參閱「建立儲存的查詢」。系統會根據查詢名稱和位置,將查詢儲存在 Google Cloud 專案中。

您也可以將查詢分享給其他使用者。如要進一步瞭解如何與使用者分享已儲存的查詢,請參閱「共用已儲存的查詢」。

查詢範例

下列查詢範例說明如何建構查詢。

叫用 Gemini 模型的查詢

SELECT *
  FROM ML.GENERATE_TEXT(MODEL `PROJECT_ID_DATASET_GEMINI_MODEL`,
    (SELECT `UNIQUE_TABLE_FIELD` AS id,
 'PROMPT_TEXT' AS prompt
   FROM `PROJECT_ID_DATASET_TABLE`),
 STRUCT( <Temperature> AS temperature,
  <Top_P> AS top_p,
  <Top_K> AS top_k,
            <Max Output Token> AS max_output_tokens,
               <Is Flatten JSON Output> AS flatten_json_output,
            <Stop Sequences[]> AS stop_sequences,
        <Ground with Google Search> AS ground_with_google_search,
        <Safety Settings[]> AS safety_settings ) );

更改下列內容:

  • PROJECT_ID_DATASET_GEMINI_MODEL:在 Google Cloud 專案中建立的 Gemini 遠端模型,前面會加上專案 ID 和 BigQuery 資料集。
  • UNIQUE_TABLE_FIELD:您要取得 Gemini 回應的 BigQuery 資料表中不重複的資料表欄位。
  • PROMPT_TEXT:您要提供給 Gemini 的提示字串。
  • PROJECT_ID_DATASET_TABLE:BigQuery 資料表,其中包含您要使用 Gemini 搭配傳入提示進行分析的資料。

用於讓 BigQuery 向量資料庫保持更新狀態的查詢

CREATE OR REPLACE TABLE `PROJECT_ID_DATASET_BQ_VECTOR_DB_TABLE` AS (
 SELECT id, content, ml_generate_embedding_result AS embedding
 FROM ML.GENERATE_EMBEDDING(
   MODEL `PROJECT_ID_DATASET_EMBEDDING_MODEL`,
   ( SELECT `TABLE_FIELD_NAME_WHICH_HAS_THE_TEXT` AS content,
            `<Unique Table Field>` as id
     FROM `PROJECT_ID_DATASET_TABLE` ),
   STRUCT( <Is Flatten JSON Output> AS flatten_json_output,
           <Task Type> as task_type,
           <Output Dimensionality> as output_dimensionality )));

更改下列內容:

  • PROJECT_ID_DATASET_BQ_VECTOR_DB_TABLE:BigQuery 向量資料庫表格,用於儲存最新企業資料的嵌入資料。
  • PROJECT_ID_DATASET_EMBEDDING_MODEL:在 Google Cloud 專案中建立的 Gemini 遠端模型,前面會加上專案 ID 和 BigQuery 資料集。
  • TABLE_FIELD_NAME_WHICH_HAS_THE_TEXT:BigQuery 資料表欄位名稱,其中包含要產生嵌入資料的資料。
  • UNIQUE_TABLE_FIELD:您要在 BigQuery 向量資料庫資料表中儲存嵌入資料的 BigQuery 資料表中唯一資料欄。
  • PROJECT_ID_DATASET_TABLE:含有您要產生嵌入資料的 BigQuery 資料表。
DECLARE search_query STRING DEFAULT SEARCH_STRING;
SELECT *
  FROM VECTOR_SEARCH(
  TABLE `PROJECT_ID_DATASET_BQ_VECTOR_DB_TABLE`, 'embedding',
  (
    SELECT ml_generate_embedding_result, content AS query
    FROM ML.GENERATE_EMBEDDING(
      MODEL `PROJECT_ID_DATASET_EMBEDDING_MODEL`,
      (SELECT search_query AS content))
    ), top_k => <number of nearest neighbors to return> );

更改下列內容:

  • SEARCH_STRING:自然語言搜尋字串,可用於在 BigQuery 向量資料庫中尋找類似項目。您也可以為此設定命名參數,並使用 SDK 將搜尋字串做為 ABAP 應用程式邏輯的查詢參數傳遞。
  • PROJECT_ID_DATASET_BQ_VECTOR_DB_TABLE:含有嵌入項目的 BigQuery 向量資料庫資料表名稱,前面會加上專案 ID 和 BigQuery 資料集。
  • PROJECT_ID_DATASET_EMBEDDING_MODEL:在 Google Cloud 專案中建立的 Gemini 遠端模型,前面會加上專案 ID 和 BigQuery 資料集。

從 BigQuery 擷取企業查詢

如要擷取儲存在 BigQuery 中的查詢,請使用 ABAP 類別 /GOOG/CL_BQ_QUERY。這個類別會在內部使用 Dataform API 擷取已儲存的查詢,然後由 SDK 的其他模組使用。

將類別例項化

使用用戶端鍵名稱和查詢位置,將類別例項化。

TRY.
    DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key         = 'CLIENT_KEY'
                                               iv_location_id = 'QUERY_LOCATION_ID'
       iv_query_name  = 'SAVED_QUERY_NAME' ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

更改下列內容:

  • CLIENT_KEY:您在驗證設定期間為驗證設定的用戶端金鑰。 Google Cloud
  • QUERY_LOCATION_ID:查詢儲存的 Google Cloud 位置。
  • SAVED_QUERY_NAME:在 BigQuery 中儲存查詢時使用的查詢名稱。

類別的參照在例項化後會保留已儲存的查詢文字,並由 ABAP 的 BigQuery AI 和 ML SDK 的其他模組用來參照已儲存的查詢。

您也可以在參數 IV_QUERY_TEXT 下,將查詢做為查詢文字從程式邏輯傳遞。

TRY.
    DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key         = 'CLIENT_KEY'
                                               iv_location_id = 'QUERY_LOCATION_ID'
       iv_query_text  = 'QUERY_TEXT' ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

覆寫已設定的查詢

如要使用其他查詢覆寫 /GOOG/CL_BQ_QUERY 類別參照中的 set 查詢,請使用 /GOOG/CL_BQ_QUERY 類別的 SET_QUERY 方法。這會在類別例項化時取代查詢集。

您可以透過在 BigQuery 中傳遞已儲存的查詢名稱,或從程式邏輯傳遞的查詢文字,來覆寫查詢。

使用已儲存的查詢名稱覆寫

lo_bq_query->set_query( iv_query_name = 'QUERY_NAME' ).

使用查詢文字覆寫

lo_bq_query->set_query( iv_query_text = 'QUERY_TEXT' ).

設定查詢參數

如要為儲存在 BigQuery 中的參數化查詢傳遞命名參數,請使用 /GOOG/CL_BQ_QUERY 類別的 SET_QUERY_PARAMETERS 方法。這些參數的參數名稱與儲存的查詢中定義的名稱相同。您可以使用這個方法,在執行階段從應用程式邏輯傳遞參數名稱的參數值。


DATA lt_query_parameters    TYPE /goog/cl_bq_query=>ty_t_query_parameters.
<Prepare lt_query_parameters>
TRY.
    DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key         = 'CLIENT_KEY'
                                               iv_location_id = 'QUERY_LOCATION_ID'
       iv_query_name  = 'SAVED_QUERY_NAME' ).
    lo_bq_query->set_query_parameters( it_query_parameters = lt_query_patameters ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

傳遞值參數

如要傳遞值參數以及參數名稱和類型,請使用 /GOOG/CL_BQ_QUERY 類別的 SET_QUERY_PARAMETERS 方法。

DATA lt_query_parameters    TYPE /goog/cl_bq_query=>ty_t_query_parameters,
DATA ls_query_parameter     TYPE /goog/cl_bq_query=>ty_query_parameter.

ls_query_parameter-parameter_name  = 'PARAMETER_NAME'.
ls_query_parameter-parameter_type  = 'PARAMETER_TYPE'.
ls_query_parameter-parameter_value = 'PARAMETER_VALUE'.

APPEND ls_query_parameter TO lt_query_parameters.
CLEAR ls_query_parameter.

TRY.
    DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key         = 'CLIENT_KEY'
                                               iv_location_id = 'QUERY_LOCATION_ID'
       iv_query_name  = 'SAVED_QUERY_NAME' ).
    lo_bq_query->set_query_parameters( it_query_parameters = lt_query_patameters ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

更改下列內容:

  • PARAMETER_NAME:在已儲存查詢中定義為命名參數的參數名稱。
  • PARAMETER_TYPE:參數的有效資料類型。
  • PARAMETER_VALUE:值的字串格式。
  • CLIENT_KEY:您在驗證設定期間為驗證設定的用戶端金鑰。 Google Cloud
  • QUERY_LOCATION_ID:查詢儲存的 Google Cloud 位置。
  • SAVED_QUERY_NAME:在 BigQuery 中儲存查詢時使用的查詢名稱。

傳遞以陣列為基礎的參數

如要傳遞陣列式參數以及參數名稱和陣列值,請使用 /GOOG/CL_BQ_QUERY 類別的 SET_QUERY_PARAMETERS 方法。

DATA lt_query_parameters    TYPE /goog/cl_bq_query=>ty_t_query_parameters,
DATA ls_query_parameter     TYPE /goog/cl_bq_query=>ty_query_parameter.

ls_query_parameter-parameter_name  = 'PARAMETER_NAME'.
ls_query_parameter-parameter_type = 'ARRAY'.
ls_query_parameter-array_type = 'ARRAY_TYPE'.

APPEND 'ARRAY_VALUE' TO ls_query_parameter-array_values.
APPEND 'ARRAY_VALUE' TO ls_query_parameter-array_values.
APPEND....

APPEND ls_query_parameter TO lt_query_parameters.
CLEAR ls_query_parameter.

TRY.
    DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key         = 'CLIENT_KEY'
                                               iv_location_id = 'QUERY_LOCATION_ID'
       iv_query_name  = 'SAVED_QUERY_NAME' ).
    lo_bq_query->set_query_parameters( it_query_parameters = lt_query_patameters ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

更改下列內容:

  • PARAMETER_NAME:在已儲存查詢中定義為命名參數的參數名稱。
  • ARRAY_TYPE:有效的陣列資料類型。
  • ARRAY_VALUE:陣列的值以字串形式表示。
  • CLIENT_KEY:您在驗證設定期間為驗證設定的用戶端金鑰。 Google Cloud
  • QUERY_LOCATION_ID:查詢儲存的 Google Cloud 位置。
  • SAVED_QUERY_NAME:在 BigQuery 中儲存查詢時使用的查詢名稱。

傳遞以結構為基礎的參數

如要將結構體做為參數傳遞,並附上結構體欄位名稱、結構體欄位類型和結構體欄位值,請使用 /GOOG/CL_BQ_QUERY 類別的 SET_QUERY_PARAMETERS 方法。


DATA lt_query_parameters    TYPE /goog/cl_bq_query=>ty_t_query_parameters,
DATA ls_query_parameter     TYPE /goog/cl_bq_query=>ty_query_parameter,
DATA ls_struct_values       TYPE /goog/cl_bq_query=>ty_struct_values.

ls_query_parameter-parameter_name  = 'PARAMETER_NAME'.
ls_query_parameter-parameter_type = 'STRUCT'.

ls_struct_values-field_name = 'STRUCT_FIELD_NAME'.
ls_struct_values-field_type = 'STRUCT_FIELD_TYPE'.
ls_struct_values-field_value = 'STRUCT_FIELD_VALUE'.

APPEND ls_struct_values TO ls_query_parameter-struct_values.
CLEAR ls_struct_values.
....

APPEND ls_query_parameter TO lt_query_parameters.
CLEAR ls_query_parameter.

TRY.
    DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key         = 'CLIENT_KEY'
                                               iv_location_id = 'QUERY_LOCATION_ID'
       iv_query_name  = 'SAVED_QUERY_NAME' ).
    lo_bq_query->set_query_parameters( it_query_parameters = lt_query_patameters ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

更改下列內容:

  • PARAMETER_NAME:在已儲存查詢中定義為命名參數的參數名稱。
  • STRUCT_FIELD_NAME:結構體的欄位名稱。
  • STRUCT_FIELD_TYPE:有效的結構體資料類型。
  • STRUCT_FIELD_VALUE:結構體欄位的值,以字串形式表示。
  • CLIENT_KEY:您在驗證設定期間為驗證設定的用戶端金鑰。 Google Cloud
  • QUERY_LOCATION_ID:查詢儲存的 Google Cloud 位置。
  • SAVED_QUERY_NAME:在 BigQuery 中儲存查詢時使用的查詢名稱。

取得查詢文字

如要擷取在 BigQuery 中儲存的查詢的查詢文字,請使用 /GOOG/CL_BQ_QUERY 類別的 GET_QUERY_TEXT 方法。

TRY.
    DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key         = 'CLIENT_KEY'
                                               iv_location_id = 'QUERY_LOCATION_ID'
       iv_query_name  = 'SAVED_QUERY_NAME' ).
    DATA(lv_query_text) = lo_bq_query->get_query_text( ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

更改下列內容:

  • CLIENT_KEY:您在驗證設定期間為驗證設定的用戶端金鑰。 Google Cloud
  • QUERY_LOCATION_ID:查詢儲存的 Google Cloud 位置。
  • SAVED_QUERY_NAME:在 BigQuery 中儲存查詢時使用的查詢名稱。

LV_QUERY_TEXT 會保留針對 SAVED_QUERY_NAME 維護的查詢。

取得查詢參數

如要擷取透過 SDK 方法 SET_QUERY_PARAMETERS 設定的查詢參數,請使用 /GOOG/CL_BQ_QUERY 類別的 GET_QUERY_PARAMETERS 方法。

DATA lt_query_parameters    TYPE /goog/cl_bq_query=>ty_t_query_parameters,
DATA ls_query_parameter     TYPE /goog/cl_bq_query=>ty_query_parameter.

ls_query_parameter-parameter_name  = 'PARAMETER_NAME'.
ls_query_parameter-parameter_type  = 'PARAMETER_TYPE'.
ls_query_parameter-parameter_value = 'PARAMETER_VALUE'.

APPEND ls_query_parameter TO lt_query_parameters.
CLEAR ls_query_parameter.

TRY.
    DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key         = 'CLIENT_KEY'
                                               iv_location_id = 'QUERY_LOCATION_ID'
       iv_query_name  = 'SAVED_QUERY_NAME' ).
    lo_bq_query->set_query_parameters( it_query_parameters = lt_query_patameters ).
    DATA(lt_parameters) = lo_bq_query->get_query_parameters( ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

更改下列內容:

  • PARAMETER_NAME:在已儲存查詢中定義為命名參數的參數名稱。
  • PARAMETER_TYPE:參數的有效資料類型。
  • PARAMETER_VALUE:值的字串格式。
  • CLIENT_KEY:您在驗證設定期間為驗證設定的用戶端金鑰。 Google Cloud
  • QUERY_LOCATION_ID:查詢儲存的 Google Cloud 位置。
  • SAVED_QUERY_NAME:儲存於 BigQuery 的查詢名稱。

LT_PARAMETERS 會保存針對 SAVED_QUERY_NAME 設定的查詢參數。