These topics explain how to create data sets using SQL queries.
Use these steps to enter SQL queries.
For information about optimizing your SQL Queries and the Generate Explain Plan option, see Best Practices for SQL Data Sets.
In addition to creating data sets using basic SQL commands, you can create data sets using more complex commands.
Procedure Call
Use this query type to call a database procedure. For example, Oracle PL/SQL statements start with BEGIN
. When you use this SQL data type, no metadata is displayed on the data model structure tab, therefore you cannot modify the data structure or data fields. To construct your SQL with a procedure call enter the code directly in the text box or copy and paste from another SQL editor. You cannot use the Query Builder to modify or build these types of queries.
Non-standard SQL
Use this query type to issue SQL statements that can include the following:
Cursor statements that return nested results sets
For example:
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
Functions returning REF
cursors
For example:
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;
To use REF
cursor in Oracle BI Publisher:
create SQL dataset with query as SELECT REF_CURSOR_TEST.GET(:PCNTRY,:PSTATE) AS CURDATA FROM DUAL
Anonymous blocks/Stored procedures
BI Publisher supports executing PL/SQL anonymous blocks. You can perform calculations in the PL/SQL block and return the result set. BI Publisher uses callable statements to execute anonymous blocks.
The requirements are:
The PL/SQL block must return a result set of type REF
cursor
You must declare the out variable with the name, xdo_cursor;
. If you do not declare the name properly, the first bind variable is treated as an out variable type and binds with REF
cursor
Declare the data model parameter with name xdo_cursor
. This name is reserved for out variable type for procedure/anonymous blocks.
Example:
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;
Conditional queries can be executed if you use an if-else expression. You can define multiple SQL queries in a single data set, but only one query executes at run time depending on the expression value. The expression validates and returns a boolean value. If the value is true, executes that section of the SQL query.
The limitations are:
The following syntax is supported to evaluate expressions: $if{
, $elseif{
, $else{
The expression must return true, false
Only the following operators are supported:
== <= >= < >
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$
When your data set is created using non-standard SQL statements, no metadata is displayed on the data model structure tab, therefore you cannot modify the data structure or data fields. You cannot use Query Builder to modify or build these types of queries.
To define XML row tag for non-standard SQL dataset:
Use xmlRowTagName=""
in data model definition to define xml row tag for non-standard SQL query dataset. This allows you to enter a valid tag name. If the attribute is empty, it defaults to ROW at runtime.
Dataset definition:
<dataSet name="Q1" type="simple"> <sql dataSourceRef="bipdev4-demo" nsQuery="true" xmlRowTagName=""> ,, </sql> </dataset>
Use the Query Builder to build SQL queries without coding. The Query Builder enables you to search and filter database objects, select objects and columns, create relationships between objects, and view formatted query results with minimal SQL knowledge.
This section describes how to use the Query Builder and includes the following topics:
The Query Builder page is divided into an Object Selection pane and a design and output pane.
Object Selection pane contains a list of objects from which you can build queries. Only objects in the current schema display.
Design and output pane consists of four tabs:
Model — Displays selected objects from the Object Selection pane.
Conditions — Enables you to apply conditions to your selected columns.
SQL — Displays the query.
Results — Displays the results of the query.
Perform these steps to build a query.
Select a schema.
The Schema list contains all the available schema in the data source. You might not have access to all that are listed.
Add objects to the Design pane and select columns.
The Object Selection pane lists the tables, views, and materialized views from the selected schema, for Oracle Database, synonyms are also listed. Select the object from the list and it displays on the Design pane. Use the Design pane to identify how the selected objects are used in the query.
You might need to use the Search field to enter a search string. If more than 100 tables are present in the data source, you must use the Search feature to locate and select the desired objects.
(Optional) Establish relationships between objects.
Add a unique alias name for any duplicate column.
(Optional) Create query conditions.
Execute the query and view results.
Columns of all types display as objects in the Design pane.
The column restrictions are:
You can select no more than 60 columns for each query.
You can select the following column types:
VARCHAR2, CHAR
NUMBER
DATE, TIMESTAMP
Note:
The TIMESTAMP WITH LOCAL TIMEZONE
data type is not supported.
Binary Large Object (BLOB)
Note:
The BLOB must be an image. When you execute the query in the Query Builder, the BLOB does not display in the Results pane; however, the query is constructed correctly when saved to the data model editor. BI Publisher does not support querying of BLOB columns in an Oracle BI EE data source.
Character Large Object (CLOB)
Note:
BI Publisher does not support querying of CLOB columns in an Oracle BI EE data source.
See Using Data Stored as a Character Large Object (CLOB) in a Data Model for more information about working with CLOB data in the data model.
Select each object you want to add to the Design pane.
When you add an object, an icon representing the data type displays next to each column name.
When you select a column, it appears on the Conditions tab. The Show check box on the Conditions tab controls whether a column is included in query results. Be default, this check box is selected.
To select the first twenty columns, click the small icon in the upper left corner of the object and then select Check All.
You can also execute a query by pressing the CTRL + ENTER keys.
You can remove or hide objects in the Design pane.
To remove an object:
Click Remove in the upper right corner of the object.
To temporarily hide the columns within an object:
Conditions enable you to filter and identify the data you want to work with.
As you select columns within an object, you can specify conditions on the Conditions tab (shown below). You can use these attributes to modify the column alias, apply column conditions, sort columns, or apply functions.
The table below describes the attributes available on the Conditions tab.
Condition Attribute | Description |
---|---|
Up and Down Arrows |
Controls the display order of the columns in the resulting query. |
Column |
Displays the column name. |
Alias |
Specify an optional column alias. An alias is an alternative column name. Aliases are used to make a column name more descriptive, to shorten the column name, or prevent possible ambiguous references. Note that multibyte characters are not supported in the alias name. |
Object |
Displays the object name. |
Condition |
The condition modifies the query's WHERE clause. When specifying a column condition, you must include the appropriate operator and operand. All standard SQL conditions are supported. For example: >=10 ='VA' IN (SELECT dept_no FROM dept) BETWEEN SYSDATE AND SYSDATE + 15 |
Sort Type |
Select ASC (Ascending) or DESC (Descending). |
Sort Order |
Enter a number (1, 2, 3, and so on) to specify the order in which selected columns should display. |
Show |
Select this check box to include the column in your query results. You do not need to select Show to add a column to the query for filtering only. For example, to create following query: SELECT ename FROM emp WHERE deptno = 10 To create this query in Query Builder:
|
Function |
Available argument functions include:
|
Group By |
Specify columns to be used for grouping when an aggregate function is used. Only applicable for columns included in output. |
Delete |
Deselect the column, excluding it from the query. |
As you select columns and define conditions, Query Builder writes the SQL for you.
To view the underlying SQL:
Select the SQL tab.
You can create relationships between objects by creating a join. A join identifies a relationship between two or more tables, views, or materialized views.
When you write a join query, you specify a condition that conveys a relationship between two objects. This condition is called a join condition.
A join condition specifies how the rows from one object combine with the rows from another object.
Query Builder supports inner, outer, left, and right joins.
An inner join, also called a simple join, returns the rows that satisfy the join condition.
An outer join extends the result of a simple join.
An outer join returns all rows that satisfy the join condition and returns some or all of those rows from one table for which no rows from the other satisfy the join condition.
Save queries after building them.
Once you have built the query, click Save to return to the data model editor. The query appears in the SQL Query box. Click OK to save the data set.
When you have saved the query from the Query Builder to the data model editor, you can also use the Query Builder to edit the query.
If you have made modifications to the query, or did not use the Query Builder to construct it, you may receive an error when launching the Query Builder to edit it. If the Query Builder cannot parse the query, you can edit the statements directly in the text box.
After creating a query, you may want users to be able to pass a parameter to the query to limit the results. For example, in the employee listing, you want users to be able to choose a specific department.
The image shows the columns in the department table.
You can use lexical references to replace the clauses appearing after SELECT, FROM, WHERE, GROUP BY, ORDER BY, or HAVING.
Use a lexical reference when you want the parameter to replace multiple values at runtime. Lexical references are supported in queries against Oracle applications only.
Create a lexical reference in the SQL query using the following syntax:
¶metername
Note:
You also use lexical references to include flexfields in your query. For more information about using flexfields, see Adding Flexfields.
For example, create a package called employee
. In the employee
package, define a parameter called where_clause
:
Package employee AS where_clause varchar2(1000); ..... Package body employee AS ..... where_clause := 'where DEPARTMENT_ID=10'; .....
Reference the lexical parameter in the SQL query where you want the parameter to be replaced by the code defined in the package, for example:
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
When you click OK on the Create SQL Data Set dialog box, the lexical reference dialog box prompts you to enter a value for lexical references you entered in the SQL query, as shown in the image that follows. Enter the value of the lexical reference as it is defined in the PL/SQL package.
At runtime, the data engine replaces &where_clause
with the contents of where_clause
defined in the package.
When you launch the Query Builder against the Oracle BI Server, the Query Builder displays the subject areas from the catalog. You can drag the subject areas to the Query Builder workspace to display the columns. Select the columns to include in your data model.
Keep the following points in mind when creating a data set against the Oracle BI Server:
When you create a SQL query against the Oracle BI Server using the SQL Data Editor or the Query Builder, logical SQL is generated, not physical SQL like other database sources.
Hierarchical columns are not supported. The highest level is always returned.
Within a subject area, the join conditions between tables are already created; it is therefore not necessary to create joins in the Query Builder. The Query Builder does not expose the primary key.
It is possible to link data sets using the data model editor's Create Link function. See Creating Element-Level Links. For data sets created from the Oracle BI Server, there is a limit of two element-level links for a single data model.
In the Query Builder, the functions Sort Order and Group By shown on the Conditions tab are not supported for queries against the Oracle BI Server. If you enter a Sort Order or select the Group By check box, the Query Builder constructs the SQL, and write it to the BI PublisherBI Publisher SQL Query text box, but when you attempt to close the Data Set dialog, the query fails validation.
To apply grouping to the data retrieved by the SQL query, you can use the data model editor's Group by function instead. See Creating Subgroups.
If you pass parameters to the Oracle BI Server and you choose Null Value Passed for Can Select All, you must ensure that you handle the null value in your query.
Special considerations for Oracle Fusion Applications customers apply when writing queries against the Oracle Fusion Applications tables
You cannot return month name from sysdate
using to_char(sysdate,"mon")
. This function returns the month number. To display month name, use one of the following solutions:
Format the date field in your layout using the following syntax: <?format_date:fieldname;MASK)?>
For more information about date formatting in your layout, see Formatting Dates in Report Designer's Guide for Oracle Business Intelligence Publisher.
To display month name based on month number, use the following syntax in your layout:
<?xdoxslt:month_name(month, [abbreviate?], $_XDOLOCALE)?>
where month
is the numeric value of the month (January = 1) and
[abbreviate?]
is the value 0 for do not abbreviate or 1 for abbreviate.
For example:
<?xdoxslt:month_name(1, 0, $_XDOLOCALE)?>
returns January
To add an expression in the data model, use the following expression:
Format_date(date, format_String)
For example:
SUBSTRING(FORMAT_DATE(G_1.SYSDATE,MEDIUM),0,3)
returns Nov (when the current SYSTDATE
is November)