Oracle® Fusion Middleware Oracle Business Intelligence Publisherデータ・モデリング・ガイド 12c (12.2.1.1.0) E77222-02 |
|
![]() 前へ |
![]() 次へ |
このトピックでは、SQL問合せを使用してデータ・セットを作成する方法について説明します。
この手順を使用して、SQL問合せを入力します。
SQL問合せおよび「実行計画の生成」オプションの最適化の詳細は、SQLデータ・セットのベスト・プラクティスを参照してください。
SQL問合せを入力するには:
基本SQLコマンドを使用したデータ・セットの作成に加えて、より複雑なコマンドを使用してデータ・セットを作成できます。
プロシージャ・コール
この問合せタイプは、データベース・プロシージャをコールする場合に使用します。たとえば、PL/SQL for Oracleの場合、文がBEGINで始まります。このSQLデータ型を使用すると、メタデータはデータ・モデル構造のタブに表示されないため、データ構造またはデータ・フィールドを変更できません。プロシージャ・コールを使用してSQLを作成するには、コードをテキスト・ボックスに直接入力するか、別のSQLエディタからコピーして貼り付けます。クエリー・ビルダーは、このようなタイプの問合せの変更または構築に使用できません。
非標準SQL
この問合せタイプは、次のものを組み込むことができるSQL文を発行する場合に使用します。
ネストされた結果セットを返すCursor文
たとえば、次のように入力します。
Ex:SELECT TO_CHAR(sysdate,'MM-DD-YYYY') CURRENT_DATE , CURSOR (SELECT d.order_id department_id, d.order_mode department_name , CURSOR (SELECT e.cust_first_name first_name, e.cust_last_name last_name, e.customer_id employee_id, e.date_of_birth hire_date FROM customers e WHERE e.customer_id IN (101,102) ) emp_cur FROM orders d WHERE d.customer_id IN (101,102) ) DEPT_CUR FROM dual
REFカーソルを返す関数
たとえば、次のように入力します。
create or replace PACKAGE REF_CURSOR_TEST AS TYPE refcursor IS REF CURSOR; pCountry VARCHAR2(10); pState VARCHAR2(20); FUNCTION GET( pCountry IN VARCHAR2, pState IN VARCHAR2) RETURN REF_CURSOR_TEST.refcursor; END;
create or replace PACKAGE BODY REF_CURSOR_TEST AS FUNCTION GET( pCountry IN VARCHAR2, pState IN VARCHAR2) RETURN REF_CURSOR_TEST.refcursor IS l_cursor REF_CURSOR_TEST.refcursor; BEGIN IF ( pCountry = 'US' ) THEN OPEN l_cursor FOR SELECT TO_CHAR(sysdate,'MM-DD-YYYY') CURRENT_DATE , d.order_id department_id, d.order_mode department_name FROM orders d WHERE d.customer_id IN (101,102); ELSE OPEN l_cursor FOR SELECT * FROM EMPLOYEES; END IF; RETURN l_cursor; END GET; END REF_CURSOR_TEST;
BI PublisherでREFカーソルを使用するには、次のようにします。
create SQL dataset with query as SELECT REF_CURSOR_TEST.GET(:PCNTRY,:PSTATE) AS CURDATA FROM DUAL
匿名ブロック/ストアド・プロシージャ
BI Publisherでは、PL/SQL匿名ブロックの実行がサポートされています。PL/SQLブロックで計算を実行し、結果のセットを返すことができます。BI Publisherでは、コール可能文を使用して匿名ブロックを実行します。
次の要件に注意してください。
PL/SQLブロックは、REFカーソル型の結果セットを返す必要があります。
名前が"xdo_cursor"のout変数を宣言する必要があります。宣言しないと、最初のバインド変数がout変数タイプとして扱われ、REFカーソルとバインドします。
名前が"xdo_cursor"のデータ・モデル・パラメータを宣言します。この名前は、プロシージャ/匿名ブロックのout変数タイプ用に予約されています。
例:
DECLARE type refcursor is REF CURSOR; xdo_cursor refcursor; empno number; BEGIN OPEN :xdo_cursor FOR SELECT * FROM EMPLOYEES E WHERE E.EMPLOYEE_ID = :P2; COMMIT; END;
if-else式を使用すると、条件付き問合せを実行できます。単一のデータ・セットで複数のSQL問合せを定義できますが、式の値に応じて実行時に実行される問合せは1つのみです。式では、検証してブール値を返し、値がtrueの場合、そのセクションのSQL問合せが実行されます。
次の制限に注意してください。
式の評価では、構文: $if{
、$elseif{
、$else{
がサポートされています
式はtrueまたはfalseを返す必要があります。
次の演算子のみサポートされています。
== <= >= < >
Example: create sql dataset with following query $if{ (:P_MODE == PRODUCT) }$ SELECT PRODUCT_ID ,PRODUCT_NAME ,CATEGORY_ID ,SUPPLIER_ID ,PRODUCT_STATUS ,LIST_PRICE FROM PRODUCT_INFORMATION WHERE ROWNUM < 5 $elsif{(:P_MODE == ORDER )}$ SELECT ORDER_ID ,ORDER_DATE ,ORDER_MODE ,CUSTOMER_ID ,ORDER_TOTAL ,SALES_REP_ID FROM ORDERS WHERE ROWNUM < 5 $else{ SELECT PRODUCT_ID , WAREHOUSE_ID ,QUANTITY_ON_HAND FROM INVENTORIES WHERE ROWNUM < 5 }$ $endif$
非標準SQL文を使用してデータ・セットを作成すると、メタデータはデータ・モデル構造のタブに表示されないため、データ構造またはデータ・フィールドを変更できません。クエリー・ビルダーは、このようなタイプの問合せの変更または構築に使用できません。
非標準SQLデータ・セットのXML行タグを定義するには:
データ・モデルの定義でxmlRowTagName=""
を使用して、非標準SQL問合せデータ・セットのxml行タグを定義します。これにより、有効なタグ名を入力できます。属性が空の場合、実行時のデフォルトはROWになります。
データセットの定義を次に示します。
<dataSet name="Q1" type="simple"> <sql dataSourceRef="bipdev4-demo" nsQuery="true" xmlRowTagName=""> ,, </sql> </dataset>
コーディングせずにSQL問合せを作成するには、クエリー・ビルダーを使用します。クエリー・ビルダーを使用すると、SQLに関する最小限の知識で、データベース・オブジェクトの検索とフィルタ処理、オブジェクトと列の選択、オブジェクト間の関連の作成、および書式設定された問合せ結果の表示を行うことができます。
この項では、クエリー・ビルダーの使用方法について説明します。この項の内容は次のとおりです。
「クエリー・ビルダー」ページは、「オブジェクト選択」ペインと設計と出力ペインに分かれています。
「オブジェクト選択」ペインには、問合せの作成に使用できるオブジェクトのリストが表示されます。現行スキーマのオブジェクトのみが表示されます。
設計と出力ペインは、次の4つのタブで構成されています。
モデル - 「オブジェクト選択」ペインから選択したオブジェクトが表示されます。
条件 - 選択した列に条件を適用できます。
SQL - 問合せが表示されます。
結果 - 問合せの結果が表示されます。
この手順を実行して問合せを作成します。
スキーマを選択します。
「スキーマ」リストには、データソースで使用可能なすべてのスキーマが表示されます。ただし、リスト内にアクセスできないスキーマがある場合があります。
「設計」ペインにオブジェクトを追加して、列を選択します。
「オブジェクト選択」ペインには、選択したスキーマの表、ビューおよびマテリアライズド・ビューがリストされます(Oracleデータベースの場合、シノニムもリストされます)。リストからオブジェクトを選択すると、そのオブジェクトが「設計」ペインに表示されます。「設計」ペインを使用して、選択したオブジェクトを問合せで使用する方法を特定します。
「検索」フィールドを使用して、検索文字列を入力することが必要になる場合があります。データソースに100を超える表がある場合は、この「検索」機能を使用して、目的のオブジェクトを検索および選択する必要があります。
(省略可能)オブジェクト間の関係を確立します。
すべての重複列に一意の別名を追加します。
(省略可能)問合せ条件を作成します。
問合せを実行し、結果を表示します。
すべてのタイプの列がオブジェクトとして「設計」ペインに表示されます。
次の列制限に注意してください。
各問合せで選択できる列の数は60以下です。
選択できるのは次の列タイプのみです。
VARCHAR2、CHAR
NUMBER
DATE, TIMESTAMP
注意:
データ型TIMESTAMP WITH LOCAL TIMEZONEは、サポートされていません。
バイナリ・ラージ・オブジェクト(Binary Large Object: BLOB)
注意:
BLOBはイメージです。クエリー・ビルダーで問合せを実行すると、BLOBは「結果」ペインに表示されませんが、問合せはデータ・モデル・エディタに保存されるときに正しく作成されます。
キャラクタ・ラージ・オブジェクト(CLOB)
データ・モデル内でCLOBデータを使用する方法の詳細は、キャラクタ・ラージ・オブジェクト(CLOB)として格納されたデータのデータ・モデル内での使用方法を参照してください。
設計ペインでオブジェクトを削除または非表示にできます。
オブジェクトを削除するには:
オブジェクトの右上隅にある「削除」をクリックします。
オブジェクト内の列を一時的に非表示にするには:
条件を使用すると、作業対象のデータをフィルタ処理して識別できます。
オブジェクト内の列を選択するときは、(次に示した)「条件」タブで条件を指定できます。これらの属性を使用して、列別名の変更、列条件の適用、列のソート、または関数の適用を行うことができます。
次の表では「条件」タブで使用可能な属性について説明します。
条件属性 | 説明 |
---|---|
上矢印および下矢印 |
問合せ結果内の列の表示順序を制御します。 |
列 |
列名を表示します。 |
別名 |
列の別名(オプション)を指定します。別名とは列名の別称です。別名は、列名をより説明的にする場合や、列名を短縮する場合、あいまいな参照を回避する場合に使用されます。別名にはマルチバイト・キャラクタはサポートされないので注意してください。 |
オブジェクト |
オブジェクト名が表示されます。 |
条件 |
条件によって、問合せのWHERE句が変更されます。列条件を指定するときは、適切な演算子およびオペランドを含める必要があります。標準のSQL条件はすべてサポートされています。たとえば、次のように入力します。 >=10 ='VA' IN (SELECT dept_no FROM dept) BETWEEN SYSDATE AND SYSDATE + 15 |
ソート・タイプ |
ASC(昇順)またはDESC(降順)を選択します。 |
ソート順序 |
番号(1、2、3・・・)を入力して、選択した列が表示される順序を指定します。 |
表示 |
列を問合せ結果に含めるには、このチェック・ボックスを選択します。フィルタ処理のためにのみ列を問合せに追加する場合は、「表示」を選択する必要はありません。たとえば、次の問合せを作成する場合について説明します。
この問合せをクエリー・ビルダーで作成する手順は、次のとおりです。
|
関数 |
使用可能な引数関数は次のとおりです。
|
グループ基準 |
集計関数の使用時にグループ化に使用する列を指定します。出力に含まれる列にのみ適用できます。 |
削除 |
問合せから列を排除して、選択解除します。 |
列を選択し条件を定義すると、クエリー・ビルダーによってSQLが書き込まれます。
基になるSQLを表示するには:
「SQL」タブを選択します。
結合を作成することで、オブジェクト間の関係を作成できます。結合によって、複数の表、ビューまたはマテリアライズド・ビューの間の関連が識別されます。
結合の問合せを記述するときは、2つのオブジェクトの関係を示す条件を指定します。この条件は結合条件と呼ばれます。
結合条件によって、1つのオブジェクトの行を別のオブジェクトの行とどのように組み合せるかが決定されます。
クエリー・ビルダーは、内部結合、外部結合、左側結合および右側結合をサポートしています。内部結合(単純結合とも呼ばれます)は、結合条件を満たす行を戻します。外部結合は、単純結合の結果を拡張します。外部結合は、結合条件を満たすすべての行を戻し、さらに、一方の表に結合条件を満たす行がない場合は、結合条件を満たす一部またはすべての行をもう一方の表から戻します。
問合せを構築した後にその問合せを保存します。
問合せの作成後には、「保存」をクリックしてデータ・モデル・エディタに戻ります。この問合せは、「SQL問合せ」ボックスに表示されます。「OK」をクリックするとデータ・セットが保存されます。
問合せの作成後、ユーザーがこの問合せにパラメータを渡して結果を限定できるようにすることが必要な場合があります。たとえば、従業員のリストで、ユーザーが特定の部門を選択できるようにする必要があります。
変数を追加するには、次のどちらかの方法を使用します。
クエリー・ビルダーの「条件」タブを使用してバインド変数を追加するには:
次の「条件」を列に追加します。
in (:PARAMETER_NAME)
このPARAMTER_NAMEは、次に示されているように、パラメータに選択した名前です。
SQL問合せを、テキスト・ボックス内で直接更新します。
注意:
問合せを手動で編集すると、その問合せをクエリー・ビルダーで解析することはできなくなります。それ以降の編集も、手動で実行する必要があります。
テキスト・ボックス内でSQL問合せを直接更新するには:
問合せ内のWHERE句の後ろに、次の行を追加します。
and "COLUMN_NAME" in (:PARAMETER_NAME)
次に例を示します。
and "DEPARTMENT_NAME" in (:P_DEPTNAME)
このP_DEPTNAMEは、次に示されているように、パラメータに選択した名前です。
「保存」をクリックすると、次に示されているように、バインド変数構文を使用して入力したパラメータを作成するかどうかを尋ねる画面が表示されます。
パラメータを選択して「OK」をクリックすると、パラメータ・エントリが自動的に作成されます。パラメータのプロパティを定義する方法の詳細は、パラメータと値リストの追加を参照してください。
字句参照を使用して、SELECT、FROM、WHERE、GROUP BY、ORDER BYまたはHAVINGの後にくる句を置換できます。
実行時にパラメータで複数の値を置換する場合は字句参照を使用します。字句参照がサポートされるのは、Oracleアプリケーションに対する問合せのみです。
SQL問合せの中に字句参照を作成するには、次の構文を使用します。
¶metername
注意:
字句参照を使用すると、フレックスフィールドを問合せに組み込むこともできます。フレックスフィールドの使用方法の詳細は、フレックスフィールドの追加を参照してください。
字句パラメータを定義するには:
たとえば、パッケージをemployee
という名前で作成します。employee
パッケージの中で、where_clause
というパラメータを次のように定義します。
Package employee AS where_clause varchar2(1000); ..... Package body employee AS ..... where_clause := 'where DEPARTMENT_ID=10'; .....
SQL問合せの中で字句パラメータを参照します。このパラメータが、パッケージ内で定義されたコードで置き換えられます。たとえば、次のように入力します。
select "EMPLOYEES"."EMPLOYEE_ID" as "EMPLOYEE_ID", "EMPLOYEES"."FIRST_NAME" as "FIRST_NAME", "EMPLOYEES"."LAST_NAME" as "LAST_NAME", "EMPLOYEES"."SALARY" as "SALARY", from "OE"."EMPLOYEES" "EMPLOYEES" &where_clause
SQLデータ・セットの作成ダイアログ・ボックスの「OK」をクリックすると、字句参照ダイアログ・ボックスが表示されます。これは、次に示されているようにSQL問合せ内に入力した字句参照の値を入力するためのものです。字句参照の値を、PL/SQLパッケージ内で定義されているとおりに入力します。
実行時に、パッケージ内で定義されたwhere_clause
の内容で &where_clause
が置き換えられます。
クエリー・ビルダーをOracle BIサーバーに対して起動すると、クエリー・ビルダーには、カタログからのサブジェクト・エリアが表示されます。このサブジェクト・エリアをクエリー・ビルダーの作業領域にドラッグすると、列が表示されます。データ・モデルに入れる列を選択します。
データ・セットをOracle BIサーバーに対して作成するときは、次の点に注意してください。
SQLデータ・エディタまたはクエリー・ビルダーを使用して、SQL問合せをOracle BIサーバーに対して作成するときは、論理SQLが生成されます。他のデータベース・ソースの場合とは異なり、物理SQLは生成されません。
階層列はサポートされません。最も上のレベルが常に返されます。
サブジェクト・エリアの中では、表間の結合条件がすでに作成されています。したがって、クエリー・ビルダーで結合を作成する必要はありません。クエリー・ビルダーによって主キーが公開されることはありません。
データ・モデル・エディタの「リンクの作成」機能を使用してデータ・セットどうしをリンクできます。要素レベルのリンクの作成を参照してください。BIサーバーから作成したデータ・セットの場合、1つのデータ・モデルに対して2つの要素レベルのリンクという制限があります。
クエリー・ビルダーの「条件」タブに表示される機能のうち、「ソート順序」と「グループ基準」は、Oracle BIサーバーに対する問合せの場合はサポートされません。「ソート順序」に入力した場合や、「グループ基準」チェック・ボックスを選択した場合も、クエリー・ビルダーによってSQLが作成されてBI Publisherの「SQL問合せ」テキスト・ボックスに出力されますが、「データ・セット」ダイアログを閉じようとすると、問合せは検証不合格となります。
SQL問合せで取り出したデータをグループ化するには、データ・モデル・エディタの「グループ基準」機能をかわりに使用してください。サブグループの作成を参照してください。
パラメータをOracle BIサーバーに渡すとともに、「全選択可能」で「NULL値が渡されました」を選択した場合は、問合せの中で確実にnull値の処理を行う必要があります。
Oracle BIサーバーに対するSQL問合せを作成するには:
Oracle Fusionアプリケーション表に対する問合せを書く際にOracle Fusionアプリケーション顧客に対する特別な考慮事項が適用されます
月の名前をsysdateからto_char(sysdate,"mon")
を使用して返すことはできません。この関数は月の番号を返します。月の名前を表示するには、次のいずれかのソリューションを使用します:
レイアウトの日付フィールドを、次の構文を使用して書式設定します: <?format_date:fieldname;MASK)?>
レイアウトにおける日付の書式設定の詳細は、Oracle Business Intelligence Publisherレポート・デザイナーズ・ガイドの日付の書式設定を参照してください。
月の番号に基づいて月の名前を表示するには、レイアウトで次の構文を使用します:
<?xdoxslt:month_name(month, [abbreviate?], $_XDOLOCALE)?>
このmonth
は、月の数値(January = 1)で、
[abbreviate?]
は、省略しない場合は0で省略する場合は1です。
たとえば、次のように入力します。
<?xdoxslt:month_name(1, 0, $_XDOLOCALE)?>
Januaryが返されます
データ・モデルに式を追加するには、次の式を使用します:
Format_date(date, format_String)
たとえば、次のように入力します。
SUBSTRING(FORMAT_DATE(G_1.SYSDATE,MEDIUM),0,3)
Novが返されます (現在のSYSTDATEがNovemberの場合)