Skip Headers

Oracle Reports Building Reports 10g (9.0.4) Part Number B10602-01 |
Home | Contents | Index

# 2
Advanced Concepts

This chapter introduces the concepts for advanced users of Oracle Reports. Each topic in this chapter is also included in the Advanced Concepts section of Reports Builder online help (see Section 3.1.1, "Using the online help").

Topics are grouped into the following sections:

- Section 2.1, "Reports"

- Section 2.2, "Web Reports"

- Section 2.3, "Data Model Objects"

- Section 2.4, "Layout Objects"

- Section 2.5, "Parameter Form Objects"

- Section 2.6, "PL/SQL"

- Section 2.7, "Templates"

- Section 2.8, "Output Formats and Capabilities"

- Section 2.9, "Data Sources"

- Section 2.10, "Debugging Tools"

## 2.1 Reports

The topics in this section build on the basic concepts discussed in Section 1.2, "Reports".

- About report titles

- About report sectioning and sections

- About the report unit of measurement

- About the report dimensions

- About conditional formatting

- About nested matrix reports

- About matrix with group reports

### 2.1.1 About report titles

You can add a title to a report in either of the following ways:

- manually, by creating a boilerplate text object in the margin of the Paper Layout view.

- by typing in the Title field on the Style page of the Report Wizard.

When you use the Report Wizard to add a title and do not select a template for your report output, the title is inserted into the margin of the report with default attributes defined by Reports Builder. You can modify the attributes in the Paper Layout view.

When you use the Report Wizard to add a title, and do select a predefined template or a user-defined template file for your report output, Reports Builder looks for a boilerplate text object named B_OR$REPORT_TITLE defined for the selected template:

- If B_OR$REPORT_TITLE exists, the title is displayed using the attributes of this object, with the text you typed in the Report Wizard.

- If B_OR$REPORT_TITLE is not found, the title is displayed using the attributes defined by the Default properties (under the Title node in the Property Inspector) of the selected template.

  Note: If you do not specify a title in the Report Wizard, the B_OR$REPORT_TTILE object is not copied to your report.

For layouts created using the Report Block Wizard, the title is inserted into the new layout as a group title rather than into the margin of the report. In this case, the attributes are set per the Default properties (under the Title node in the Property Inspector) of the selected template, and B_OR$REPORT_TITLE is ignored. If you do not select a template, the title uses the default attributes defined by Reports Builder.

##### See also

Section 3.5.6, "Adding a title to a report"

Section 3.12.5, "Formatting the report title in a template"

Section 2.7.1, "About templates"

### 2.1.2 About report sectioning and sections

Report sectioning enables you to define multiple layouts in the same report, each with a different target audience, output format, page layout, page size, or orientation. You can define up to three report sections, each with a body area and a margin area: the names of the sections are Header, Main, and Trailer. By default, a report is defined in the Main section. In the other sections, you can define different layouts, rather than creating multiple separate reports. For example, a single report can include an executive summary for senior management in one section and also a detailed breakdown for individual managers in another section. If you wish, you can use the margin and body of the Header and Trailer sections to create a Header and Trailer page for your reports.

In the Object Navigator, the report sections are exposed in the Object Navigator under the Paper Layout node as Header Section, Main Section, and Trailer Section.

For detailed information about section-level distribution, see Chapter 36, "Bursting and Distributing a Report". This chapter also covers distribution based on a repeating section, then e-mail those sections based on the distribution.xml.

#### Examples

##### Example 1

You can use sectioning and distribution to publish your report output in HTML, and also send a Postscript version to the printer.

##### Example 2

You can send an executive summary of the report to a senior management, and also mail detailed breakdowns to individual managers. In this example, a single report with two report sections needs to be created: a portrait-sized summary section and a landscape-sized detail Section. Associating the detail section with a data model group that lists the managers and then altering the destination on each instance of the data model group sends the output to the appropriate managers.

##### See also

Section 2.8.3, "About report distribution"

Section 3.10.1, "Displaying a section layout view"

Section 3.10.2, "Creating a default layout for a section"

### 2.1.3 About the report unit of measurement

A report can be defined using inches, centimeters, or points. The unit of measurement is independent of the device on which you build the report. As a result, you can design reports that will run on any platform on which Reports Builder runs. You can change a report's unit of measurement in these ways:

- Setting the Unit of Measurement property.

- Converting the report using rwconverter, specifying a different unit of measurement with the DUNIT keyword.

- Opening the report in a different environment. For example, if you open a character-mode report, Reports Builder will change the report's unit of measurement to the bit-mapped environment's default. If you then save the report, it will be saved with the new unit of measurement.

### 2.1.4 About the report dimensions

A report page can have any length and any width. Because printer pages may be smaller or larger than your paper report's "page," the concept of physical and logical pages is used. A physical page is the size of a page that is output by your printer. A logical page is the size of one page of your report; one logical page may be made up of multiple physical pages.

For each section (header, main, trailer) of a report:

- you specify the dimensions of the physical page (including the margin) using the Width property and Height property.

- you specify the dimensions of the logical page (report page) in physical pages (printer pages) using the Horizontal Panels per Page property (width) and the Vertical Panels per Page property (height). For example, a Horizontal Panels per Page size of 1 means that each logical page is one physical page wide, and a Vertical Panels per Page size of 2 means that each logical page is two physical pages in height.

In this example, one logical page is made up of six physical pages. The logical page is three physical pages wide and two physical pages high. Consequently, Horizontal Panels per Page size is 3 and Vertical Panels per Page size is 2. If you wanted the logical page to be two physical pages wide and three physical pages high, you would specify a Horizontal Panels per Page size of 2 and a Vertical Panels per Page size of 3.

#### Figure 2-1 Report dimensions

Text description of the illustration ch4log01.gif

### 2.1.5 About fonts in reports

For detailed information about using and adding fonts in Oracle Reports, including font configuration files, font aliasing, troubleshooting font issues, and font types, refer to the chapter "Fonts in Oracle Reports" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page (`http://otn.oracle.com/docs/products/reports/content.html`).

### 2.1.6 About conditional formatting

Using the Conditional Formatting and Format Exception dialog boxes, you can specify output formatting attributes (font and/or color) for a selected layout object based on conditions that exist. The conditions that you define are called format exceptions.

You can display the Conditional Formatting dialog box from the Paper Layout view or Paper Design view in any of the following ways:

- Double-click the object to display the Property Inspector. Under the General Layout node, click the Conditional Formatting value field (labeled...).

- Display the pop-up menu (right-click in Windows) for the object.

- Click the object, then choose Format > Conditional Formatting.

The Format Exception dialog box displays when you click New or Edit in the Conditional Formatting dialog box, and enables you to quickly and easily specify output formatting attributes for a selected layout object based on defined conditions. After you specify conditions and formatting for the current layout object in the Format Exception dialog box, the entire definition is exported to a PL/SQL format trigger. If a format trigger already exists for the layout object, the definition in the Format Exception dialog box overwrites the existing trigger code when you confirm the Reports Builder prompt.

You can edit the format trigger manually via the PL/SQL Editor; however, if you subsequently modify the definition using the Format Exception dialog box, Reports Builder displays a prompt to overwrite the existing format trigger.

##### See also

Section 3.9.1.5, "Applying conditional formatting to a layout object"

### 2.1.7 About nested matrix reports

A nested matrix report is a matrix report in which at least one parent/child relationship appears within the matrix grid.

A nested matrix report has more than two dimensions; therefore, it has multiple dimensions going across and/or down the page. For example, look at the report below (Figure 2-2). Notice that for each year there is a nested list of related departments. Also notice that the list of jobs (the across values) appears only once. Because the job values appear only once, a summary of each category of jobs can be made to line up with the values it summarizes.

For an example, see the example report in Chapter 26, "Building a Nested Matrix Report".

##### See also

Section 2.3.7, "About matrix objects"

Section 1.3.7, "About matrix reports"

### 2.1.8 About matrix with group reports

A matrix with group report is a group above report with a separate matrix for each value of the master group. For example, for each year (master) in the report below there is a unique matrix that contains only that year's departments and jobs. This means that a summary of each job category may not line up with the values it summarizes because the position of each job category in the matrix may vary for each year.

A multi-query matrix with group report is similar to a nested matrix report in that it has more than two dimensions. For example, in the following report, notice that for each year there is a nested list of related departments.

#### Figure 2-2 Sample matrix with group and nested matrix report

Text description of the illustration a_mtx_grp_rpts1.gif

The advantage of using multiple queries is that you get a real break, or master/detail relationship, for the nesting groups (e.g., notice that in the multi-query example above, Year 80 shows only record 20; with a single query, Year 80 would show all records whether or not they contain data for Year 80). If you want to suppress detail records that do not contain data for a particular master record, you must use multiple queries.

For a complete example, see the example report in Chapter 27, "Building a Matrix with Group Above Report".

##### See also

Section 2.3.7, "About matrix objects"

Section 1.3.7, "About matrix reports"

## 2.2 Web Reports

The topics in this section build on the basic concepts discussed in Section 1.2.2, "About Web reports".

- About JavaServer Pages (JSPs) and servlets

- About previewing JSP-based Web reports

- About Web links for HTML output

- About Web links for PDF output

- About hyperlinks

- About hyperlink destinations

- About bookmarks

- About application command line links

- About before and after escapes

- About style sheets

##### See also

Section 1.2.2, "About Web reports"

### 2.2.1 About JavaServer Pages (JSPs) and servlets

Oracle Reports supports JavaServer Pages (JSPs) as the underlying technology to enable you to enhance Web pages with information retrieved using Reports Builder. JSP technology is an extension to the Java servlet technology from Sun Microsystems that provides a simple programming vehicle for displaying dynamic content on a Web page. A JSP is an HTML page with embedded Java source code that is executed in the Web server or application server. The HTML provides the page layout that is returned to the Web browser, and the Java provides the business logic.

JSPs keep static page presentation and dynamic content generation separate. Because JSPs cleanly separate dynamic application logic from static HTML content, Web page designers who have limited or no Java programming expertise can modify the appearance of the JSP page without affecting the generation of its content, simply using HTML or XML tags to design and format the dynamically-generated Web page. JSP-specific tags or Java-based scriptlets can be utilized to call other components that generate the dynamic content on the page.

JSPs have the .jsp extension. This extension notifies the Web server that the page should be processed by a JSP container. The JSP container interprets the JSP tags and scriptlets, compiles the JSP into a Java servlet and executes it, which generates the content required, and sends the results back to the browser as an HTML or XML page.

A JSP can be accessed and run from a browser-based client, typically over the Internet or a corporate intranet. Unlike traditional client-server applications, JSP applications:

- run on a wider variety of client machines and browsers.

- run on thinner clients, thereby consuming fewer client-machine resources.

- scale to a larger number of simultaneous users.

- require less effort to install and maintain.

When a JSP is called for the first time, it is compiled into a Java servlet class and stored in the Web server's memory. Because it is stored in memory, subsequent calls to that page are very fast, thereby avoiding the performance limitations seen with traditional Common Gateway Interface (CGI) programs, which spawn a new process for each HTTP request.

For additional background information about JSP technology, see the JavaSoft web site at http://www.javasoft.com/products/jsp/.

#### 2.2.1.1 Using JSPs in Oracle Reports

In Oracle Reports, you use JSPs to embed data retrieved using the data model into an existing Web page to create a JSP-based Web report. You can create new JSP reports, or save existing reports as JSP reports. New reports are by default saved as JSP reports. The benefit of saving reports as JSPs is that JSPs are text files that are easy to edit as opposed to, for example, the binary .rdf format. When a report is saved as a JSP file, the data model is embedded using XML tags. The entire report can now be defined using XML tags and saved as an XML file.

Using the Oracle Reports custom JSP tags, you can easily add report blocks and graphs to existing JSP files. These tags can be used as templates to enable you to build and insert your own data-driven Java component into a JSP-based Web report. Not only can you edit the HTML or XML code that encapsulates the report block, but you can also edit the report block in the JSP itself, by modifying, adding or deleting their bodies and attributes.

Not only can you edit the HTML code that encapsulates the report block, but you can also edit the report block in the JSP itself, by modifying, adding or deleting their bodies and attributes.

The Report Editor's Web Source view displays the source code for your Web report, including HTML, XML, and JSP tags.

In prior releases, Oracle Reports introduced Web links that you can add to paper-based reports, which become active when you display your paper report in a Web browser or PDF viewer. For JSP reports, hyperlinks have to be created manually, and if the hyperlinks need to substitute data values, the data values must be provided via the rw:field JSP tag. For example:

    <a href="http://server/path/rwservlet?report=department.jsp&p_deptno=<rw:field

      id="F_Deptno" src="Deptno"/>">
    <rw:field id="F_Deptno" src="Deptno">10</rw:field>
    </a>

##### See also

- Oracle Reports New Features, available on the Oracle Technology Network Oracle Reports main page (`http://otn.oracle.com/products/reports/content.html`).

- Topic "Custom JSP tags for Oracle Reports" and "XML tag list" in the Reference section of the Reports Builder online help.

### 2.2.2 About previewing JSP-based Web reports

You can preview a JSP-based Web report by clicking the Run Web Layout button in the toolbar, or by choosing Program > Run Web Layout, to run the Web Source. Reports Builder displays Web reports in your default browser.

Note: If Netscape 7.0 is your default browser, the browser may not display. You can work around this bug by making a copy of the Netscape 7.0 executable, naming it `netscape.exe`; with this name, the browser will display as expected.

You do not need to have the Reports Server configured to use this functionality. Reports Builder includes an embedded OC4J (Oracle Container for Java) server in it. If you are using this option to preview a JSP report locally, if your JSP depends on external files, such as images, or if you want to check the generated Java files, it is important to understand what Reports Builder does with the temporary files. Each instance of the Builder has its own OC4J server listening on different port, so you can have multiple Builder sessions at a time. If not specified, the Builder automatically looks for a free port in the default range.

A JSP gets converted into a .java file and compiled into a class file. When the class file is executed, it will return HTML in an .html file. This file and the .java and .class files are all located in the $`REPORTS_TEMP/docroot` directory. $`REPORTS_TEMP` can be passed in as a command line parameter to Reports Builder, thus allowing you to override the default location for the docroot directory. The contents of the docroot directory are cleaned up when you exit the Reports Builder.

#### Document Root

By default, the Reports Builder document root is the docroot directory under the directory specified by the `$REPORTS_TMP` environment variable (e.g., `c:/temp/docroot`). The end user can override this default `docroot` from the command line (using the `WEBSERVER_DOCROOT` command line keyword). If your JSP depends on external files, such as images, style sheets, and so on, make sure you copy them into the `docroot` directory. Better yet, you can specify the `WEBSERVER_DOCROOT` command line value to be your document root directory.

#### Document Root Structure

A JSP gets translated into a .java file and compiled into a .class file. When the class file is executed, it will return HTML in an .html file. This file and the .java and .class files are all located in the docroot directory. The docroot directory structure looks as follows after running emp.jsp (note that we use the default `docroot`, which is `$REPORTS_TMP/docroot`):

    temp

      docroot

        3000                        working directory for instance of the Builder

          default

            defaultWebApp            temporary JSP working directory
              temp
                _pages

                _empxxx.class       compiled Java class
                _empxxx.java         translated Java file
          log                        OC4J log directory
            global-application.log
            server.log
            orion-conf               OC4J configuration files directory
          stderr.log                 debug log when WEBSERVER_LOG=yes
          stdout.log
        3002                         another instance's working directory
        css                          template style sheets
        images                       template images
        WEB-INF
          lib
          reports_tld.jar
        web.xml
        rwerror.jsp                  template error JSP
        empxxx.jsp                   working copy of emp.jsp
        empxxx.html                  resulting output

##### Usage notes

- The large numbers in generated filenames are simply unique IDs, and have no particular meaning (e.g., emp012345678.jsp).

- The temporary files created in the docroot directory get cleaned up when you exit Reports Builder.

##### See also

Section 3.7.15.4, "Displaying report output in your Web browser"

Section 3.7.16.3, "Printing a report from your Web browser"

### 2.2.3 About Web links for HTML output

This topic discusses the Web links that you can add to paper-based reports that will become active when you run your report to an HTML file and display it in a Web browser.

In most cases, you can define Web links in an object's Property Inspector. You can specify column and field names in the link value to create dynamic links at runtime. If you require more complex implementation of Web links, such as conditional settings, you must specify the link using PL/SQL and the Reports Builder built-in packaged procedure SRW.SET_ATTR.

Reports output in HTML format can include the following types of Web links:

- A link from an object to another object within the same report, or to another HTML or PDF document (see Section 2.2.5, "About hyperlinks").

- An identifier for the destination of a Web link (see Section 2.2.6, "About hyperlink destinations"). The destination can be any printable object (field, boilerplate, frame, etc.) in your report layout.

- A string in a frame of the master HTML document that links to an associated object (see Section 2.2.7, "About bookmarks"). You can associate a bookmark with any printable object (field, boilerplate, frame, etc.) in your report layout. In the formatted report, you can click on a bookmark to display the associated object at the top of the window.

- URLs that specify image resources. The URLs must be available to your Web server so that the images can be located when the HTML output is displayed by the server.

Additionally, your report can include the following headers and footers that use escapes to add HTML tags to your paper-based report:

- a document header (a before report escape) for placing a logo or some standard links at the beginning of an HTML document (see Section 2.2.9, "About before and after escapes").

- a document footer (an after report escape) for placing a logo or some standard links at the end of an HTML document.

- a page header (a before page escape) for placing a logo or some standard links at the beginning of one page or all pages in an HTML document.

- a page footer (an after page escape) for placing a logo or some standard links at the end of one page or all pages in an HTML document.

- a Parameter Form header (a before form escape) for placing a logo or some standard links in the header of the HTML Parameter Form.

- a Parameter Form footer (an after form escape) for placing a logo or some standard links in the footer of the HTML Parameter Form.

### 2.2.4 About Web links for PDF output

This topic discusses the Web links that you can add to paper-based reports that will become active when you run your report to a PDF file and display it in a PDF viewer.

Reports output in PDF format can include the following types of Web links:

- A link from an object to another object within the same report, or to another HTML or PDF document (see Section 2.2.5, "About hyperlinks").

- An identifier for the destination of a Web link (see Section 2.2.6, "About hyperlink destinations"). The destination can be any printable object (field, boilerplate, frame, etc.) in your report layout.

- A string in the bookmark area of the PDF viewer that links to an associated object (see Section 2.2.7, "About bookmarks"). You can associate a bookmark with any printable object (field, boilerplate, frame, etc.) in your report layout. In the formatted report, you can click on a bookmark to display the associated object at the top of the window.

- A link that executes a command when clicked (see Section 2.2.8, "About application command line links"). You can associate a command with any printable object (field, boilerplate, frame, etc.) in your report layout. In the formatted report, you can click on the object to execute the associated command.

In most cases, you can define Web links in an object's Property Inspector. You can specify column and field names in the link value to create dynamic links at runtime. If you require more complex implementation of Web links, such as conditional settings, you must specify the link using PL/SQL.

### 2.2.5 About hyperlinks

A hyperlink is an attribute of an object that specifies a hypertext link to either of the following destinations:

- an object identified with a hyperlink destination within the same report

- another HTML or PDF document on the same machine or on a remote Web server

You can set the Additional Hyperlink Attributes property to specify additional HTML to be applied to the hyperlink.

##### See also

Section 3.6.7.1.7, "Creating a hyperlink using the Property Inspector"

Section 3.6.7.2.7, "Creating a hyperlink using PL/SQL"

### 2.2.6 About hyperlink destinations

A hyperlink destination is an attribute of an object that identifies the destination of a hypertext link.

##### See also

Section 3.6.7.1.8, "Creating a hyperlink destination using the Property Inspector"

Section 3.6.7.2.8, "Creating a hyperlink destination using PL/SQL"

### 2.2.7 About bookmarks

A bookmark is an attribute of an object that specifies a string that is a link to the object.

##### See also

Section 3.6.7.1.10, "Creating a bookmark using the Property Inspector"

Section 3.6.7.2.10, "Creating a bookmark using PL/SQL"

Section 3.6.7.1.11, "Creating a bookmark on break columns using the Property Inspector"

### 2.2.8 About application command line links

(PDF output only) An application command line link is an attribute of an object that specifies a command line to be executed when the object is clicked.

##### Restrictions

An object that is associated with a application command line link cannot also be the source of a Web link (a hyperlink).

##### See also

Section 3.6.7.1.9, "Creating an application command line link using the Property Inspector"

Section 3.6.7.2.9, "Creating an application command line link using PL/SQL"

### 2.2.9 About before and after escapes

- A before report escape specifies any text, graphics, or HTML commands that you want to appear at the beginning of your document.

- An after report escape specifies any text, graphics, or HTML commands that you want to appear at the end of your document.

- A before page escape specifies any text, graphics, or HTML commands that you want to appear at the beginning of one page or all pages of your document.

- An after page escape specifies any text, graphics, or HTML commands that you want to appear at the end of one page or all pages of your document.

- A before form escape specifies any text, graphics, or HTML commands that you want to appear at the top of the HTML Parameter Form.

- An after form escape specifies any text, graphics, or HTML commands that you want to appear at the bottom of the HTML Parameter Form.

##### See also

Section 3.6.7.1.1, "Creating an HTML document header using the Property Inspector"

Section 3.6.7.2.1, "Creating an HTML document header using PL/SQL"

Section 3.6.7.1.2, "Creating an HTML document footer using the Property Inspector"

Section 3.6.7.2.2, "Creating an HTML document footer using PL/SQL"

Section 3.6.7.1.3, "Creating an HTML page header using the Property Inspector"

Section 3.6.7.2.3, "Creating an HTML page header using PL/SQL"

Section 3.6.7.1.4, "Creating an HTML page footer using the Property Inspector"

Section 3.6.7.2.4, "Creating an HTML page footer using PL/SQL"

Section 3.6.7.1.5, "Creating an HTML Parameter Form header using the Property Inspector"

Section 3.6.7.2.5, "Creating an HTML Parameter Form header using PL/SQL"

Section 3.6.7.1.6, "Creating an HTML Parameter Form footer using the Property Inspector"

Section 3.6.7.2.6, "Creating an HTML Parameter Form footer using PL/SQL"

### 2.2.10 About style sheets

Style sheets (or cascading style sheets) refer to HTML extensions that provide powerful formatting flexibility. With style sheet support, your HTML documents can include any of the following:

- any font size or style

- overlapping objects

- horizontal and vertical lines and rectangles of any color or width

- precise object positioning on a page

- pagination

- printing from a Web browser

- inline image maps

This means that the sophisticated formatting in a report is preserved when you format the report as an HTML document. Without style sheet extensions, your HTML documents display only basic text formats and imported images. With style sheets, images of highly formatted text can be replaced with text objects of equivalent style, color, and font. Text objects can be positioned to overlay image objects. All text is fully searchable, and fewer images have to be downloaded.

To view an HTML document that takes advantage of style sheets, you must display it in a browser that supports style sheets.

##### Restrictions

The following elements are not supported by HTML style sheet extensions:

- ellipses, arcs, polygons/polylines, and diagonal lines

- rounded rectangles (formatted as rectangles)

- arrows on lines

- dashes on lines or borders of objects

##### See also

Section 3.7.15.4, "Displaying report output in your Web browser"

Section 3.7.16.3, "Printing a report from your Web browser"

## 2.3 Data Model Objects

The topics in this section build on the basic concepts discussed in Section 1.7, "Data Model Objects".

- About summary columns

- About formula columns

- About placeholder columns

- About referencing columns and parameters

- About non-linkable queries

- About links versus groups

- About matrix objects

### 2.3.1 About summary columns

A summary column performs a computation on another column's data. Using the Report Wizard or Data Wizard, you can create the following summaries: sum, average, count, minimum, maximum,% total. You can also create a summary column manually in the Data Model view, and use the Property Inspector to create the following additional summaries: first, last, standard deviation, variance.

If your report requires a customized computation, for example, one that computes sales tax, create a formula column (see Section 3.8.7, "Creating or editing a formula column").

Note: For group reports, the Report Wizard and Data Wizard create n summary fields in the data model for each summary column you define: one at each group level above the column being summarized, and one at the report level. For example, if a report is grouped by division, and further grouped by department, then a summary column defined for a salary total would create fields for the sum of salaries for each division and each department group (group-level summaries), and the sum of all salaries (report-level summary).

##### See also

Section 3.8.8, "Creating a summary column"

### 2.3.2 About formula columns

A formula column performs a user-defined computation on the data of one or more column(s), including placeholder columns. For example, :ITEMTOT *.07 is a formula that performs a computation on one column, while :SAL + :COMM performs a computation using two columns in a record. You create formulas in PL/SQL using the PL/SQL Editor.

Note: Formula columns should not be used to set values for parameters.

##### See also

Section 3.8.7, "Creating or editing a formula column"

Section 2.6.8, "About formulas"

### 2.3.3 About placeholder columns

A placeholder is a column for which you set the datatype and value in PL/SQL that you define. Placeholder columns are useful when you want to selectively set the value of a column (e.g., each time the nth record is fetched, or each time a record containing a specific value is fetched, etc.). You can set the value of a placeholder column in the following places:

- the Before Report trigger, if the placeholder is a report-level column

- a report-level formula column, if the placeholder is a report-level column

- a formula in the placeholder's group or a group below it (the value is set once for each record of the group)

##### See also

Section 3.8.9, "Creating or editing a placeholder column"

Section 2.6.8, "About formulas"

### 2.3.4 About referencing columns and parameters

You can reference user parameters, system parameters and columns as either bind references or lexical references.

#### 2.3.4.1 About bind references

Bind references (or bind variables) are used to replace a single value in SQL or PL/SQL, such as a character string, number, or date. Specifically, bind references may be used to replace expressions in SELECT, WHERE, GROUP BY, ORDER BY, HAVING, CONNECT BY, and START WITH clauses of queries. Bind references may not be referenced in FROM clauses or in place of reserved words or clauses.

You create a bind reference by typing a colon (:) followed immediately by the column or parameter name. If you do not create a column or parameter before making a bind reference to it in a SELECT statement, Reports Builder will create a parameter for you by default.

##### Restrictions

Bind references must not be the same name as any reserved SQL keywords. For more information, see the Oracle9i Server SQL Language Reference Manual.

#### Examples

##### Example 1: SELECT clause

In the following example, the value of DFLTCOMM replaces null values of COMMPLAN in the rows selected.

    SELECT CUSTID, NVL(COMMPLAN, :DFLTCOMM) COMMPLAN

    FROM ORD;

##### Example 2: WHERE clause

The value of CUST is used to select a single customer.

    SELECT ORDID, TOTAL

    FROM ORD
    WHERE CUSTID = :CUST;

##### Example 3: GROUP BY clause

All non-aggregate expressions such as NVL(COMMPLAN, :DFLTCOMM) in the SELECT clause must be replicated in the GROUP BY clause.

    SELECT NVL(COMMPLAN, :DFLTCOMM) COMMPLAN, SUM(TOTAL) TOTAL

    FROM ORD
    GROUP BY NVL(COMMPLAN, :DFLTCOMM);

##### Example 4: HAVING clause

The value of MINTOTAL is used to select customers with a minimum total of orders.

    SELECT CUSTID, SUM(TOTAL) TOTAL

    FROM ORD
    GROUP BY CUSTID HAVING SUM(TOTAL) > :MINTOTAL;

##### Example 5: ORDER BY clause

The value of SORT is used to select either SHIPDATE or ORDERDATE as the sort criterion. Note that this is not the same as ORDER BY 1 because :SORT is used as a value rather than to identify the position of an expression in the SELECT list. Note that DECODE is required in this example. You cannot use a bind variable in an ORDER BY clause unless it is with DECODE.

    SELECT ORDID, SHIPDATE, ORDERDATE, TOTAL

    FROM ORD
    ORDER BY DECODE(:SORT, 1, SHIPDATE, 2, ORDERDATE);

##### Example 6: CONNECT BY and START WITH clauses

References in CONNECT BY and START WITH clauses are used in the same way as they are in the WHERE and HAVING clauses.

##### Example 7: PL/SQL

    procedure double is begin; :my_param := :my_param*2; end;

The value of `myparam` is multiplied by two and assigned to myparam.

#### 2.3.4.2 About lexical references

Lexical references are placeholders for text that you embed in a SELECT statement. You can use lexical references to replace the clauses appearing after SELECT, FROM, WHERE, GROUP BY, ORDER BY, HAVING, CONNECT BY, and START WITH. Use a lexical reference when you want the parameter to substitute multiple values at runtime.

You cannot make lexical references in a PL/SQL statement. You can, however, use a bind reference in PL/SQL to set the value of a parameter that is then referenced lexically in SQL. Look at the example below.

You create a lexical reference by typing an ampersand (&) followed immediately by the column or parameter name. A default definition is not provided for lexical references. Therefore, you must do the following:

- Before you create your query, define a column or parameter in the data model for each lexical reference in the query. For columns, you must set the Value if Null property, and, for parameters, you must set the Initial Value property. Reports Builder uses these values to validate a query with a lexical reference.

- Create your query containing lexical references.

##### Restrictions

- You cannot make lexical references in a PL/SQL statement.

- If a column or parameter is used as a lexical reference in a query, its Datatype must be Character.

- If you want to use lexical references in your SELECT clause, you should create a separate lexical reference for each column you will substitute. In addition, you should assign an alias to each lexical reference. This enables you to use the same layout field and boilerplate label for whatever value you enter for the lexical reference on the Runtime Parameter Form.

- If you use lexical references in your SELECT clause, you must specify the same number of items at runtime as were specified in the report's data model. Each value you specify for your lexical references at runtime must have the same datatype as its Initial Value.

- If you use lexical references in your SELECT clause, the width of the column is derived from the Initial Value of the parameter. Consequently, you should ensure that the Initial Value of the parameter corresponds to the widest column that you intend to use.

- A Reports Builder link should not depend upon a lexical reference. That is, neither the child column of a link or its table name should be determined by a lexical reference. To achieve this functionality, you need to create a link with no columns specified and then enter the SQL clause (e.g., WHERE) for the link directly in the query. For example, your parent and child queries might be written as follows:

  Parent Query:

      SELECT DEPTNO FROM EMP

  Child Query:

      SELECT &PARM_1 COL_1, &PARM2 COL_2

      FROM EMP
      WHERE &PARM_1 = :DEPTNO

  Note how the WHERE clause makes a bind reference to DEPTNO, which was selected in the parent query. Also, this example assumes that you have created a link between the queries in the Data Model editor with no columns specified.

- A lexical reference cannot be used to create additional bind variables after the After Form trigger fires. For example, suppose you have a query like the following (note that the WHERE clause is replaced by a lexical reference):

      SELECT ENAME, SAL FROM EMP
      &where_clause

  If the value of the WHERE_CLAUSE parameter contains a reference to a bwind variable, you must specify the value in the After Form trigger or earlier. You would get an error if you supplied the following value for the parameter in the Before Report trigger:

      WHERE SAL = :new_bind

  If you supplied this same value in the After Form trigger, the report would run.

  #### Examples

  ##### Example 1: SELECT clause

      SELECT &P_ENAME NAME, &P_EMPNO ENO, &P_JOB ROLE

      FROM EMP;

  P_ENAME, P_EMPNO, and P_JOB can be used to change the columns selected at runtime. For example, you could enter DEPTNO as the value for P_EMPNO on the Runtime Parameter Form. Note that in this case, you should use aliases for your columns. Otherwise, if you change the columns selected at runtime, the column names in the SELECT list will not match the Reports Builder columns and the report will not run.

  ##### Example 2: FROM clause

      SELECT ORDID, TOTAL

      FROM &ATABLE;

  ATABLE can be used to change the table from which columns are selected at runtime. For example, you could enter ORD for ATABLE at runtime. If you dynamically change the table name in this way, you may also want to use lexical references for the SELECT clause (look at the previous example) in case the column names differ between tables.

  ##### Example 3: WHERE clause

      SELECT ORDID, TOTAL

      FROM ORD
      WHERE &CUST;

  CUST can be used to restrict records retrieved from ORD. Any form of the WHERE clause can be specified at run-time.

  ##### Example 4: GROUP BY clause

      SELECT NVL(COMMPLAN, DFLTCOMM) CPLAN, SUM(TOTAL) TOTAL

      FROM ORD
      GROUP BY &NEWCOMM;

  The value of NEWCOMM can be used to define the GROUP BY clause.

  ##### Example 5: HAVING clause

      SELECT CUSTID, SUM(TOTAL) TOTAL

      FROM ORD
      GROUP BY CUSTID HAVING &MINTOTAL;

  The value of MINTOTAL could, for example, be used to select customers with a minimum total of orders.

  ##### Example 6: ORDER BY clause

      SELECT ORDID, SHIPDATE, ORDERDATE, TOTAL

      FROM ORD
      ORDER BY &SORT;

  The value of SORT can be used to select SHIPDATE, ORDERDATE, ORDID, or any combination as the sort criterion. It could also be used to add on to the query, for example to add a CONNECT BY and START WITH clause.

  ##### Example 7: CONNECT BY and START WITH clauses

  Parameters in CONNECT BY and START WITH clauses are used in the same way as they are in the WHERE and HAVING clauses.

  ##### Example 8: Multiple clauses

      SELECT &COLSTABLE;

  COLSTABLE could be used to change both the SELECT and FROM clauses at runtime. For example, you could enter DNAME ENAME, LOC SAL FROM DEPT for COLSTABLE at runtime.

      SELECT * FROM EMP &WHEREORD;

  WHEREORD could be used to change both the WHERE and ORDER BY clauses at runtime. For example, you could enter WHERE SAL > 1000 ORDER BY DEPTNO for &WHEREORD at runtime.

  ##### Example 9: PL/SQL and SQL

      SELECT &BREAK_COL C1, MAX(SAL)

      FROM EMP
      GROUP BY &BREAK_COL;

  BREAK_COL is used to change both the SELECT list and the GROUP BY clause at runtime. The Initial Value of the parameter &BREAK_COL is JOB. At runtime, the user of the report can provide a value for a parameter called GROUP_BY_COLUMN (of Datatype Character).

  In the Validation Trigger for GROUP_BY_COLUMN, you call the following PL/SQL procedure and pass it the value of GROUP_BY_COLUMN:

      procedure conv_param (in_var IN char) is
      begin

      if upper(in_var) in ('DEPTNO','EMPNO','HIREDATE') then

      :break_col := 'to_char('||in_var||')' ;

      else

      :break_col := in_var;

      end if;

      end;

  This PL/SQL ensures that, if necessary, a TO_CHAR is placed around the break column the user chooses. Notice how in SQL, you make a lexical reference to BREAK_COL. In PL/SQL, you must make a bind reference to BREAK_COL because lexical references are not allowed in PL/SQL.

  #### 2.3.4.3 Differences between bind and lexical references

  Bind references are used to replace a single value in SQL or PL/SQL. Specifically, bind references may be used to replace expressions in SELECT, WHERE, GROUP BY, ORDER BY, HAVING,CONNECT BY, and START WITH clauses of queries. Binds may not be referenced in the FROM clause. An example is:

      SELECT ORDID,TOTAL

      FROM ORD
      WHERE CUSTID = :CUST

  Lexical references are placeholders for text that you embed in a SELECT statement, when you want the parameter to substitute multiple values at runtime. You can use lexical references to replace the clauses appearing after SELECT, FROM, WHERE, GROUP BY, ORDER BY, HAVING, CONNECT BY, and START WITH. You cannot make lexical references in PL/SQL. Before you reference a lexical parameter in a query you must have predefined the parameter and given it an initial value. An example is:

      SELECT ORDID, TOTAL

      FROM &ATABLE

  ### 2.3.5 About non-linkable queries

  A non-linkable query is a detail query that contains column objects that prevent the query from being linked to via a column-to-column link (when you create a column-to-column link, Reports Builder adds a WHERE clause to your query). If you attempt to create such a link, a message dialog box displays, which prompts you to choose whether to create a group-to-group query (using the parent groups), or to cancel the operation. A non-linkable query displays the non-linkable query icon in its title bar.

  Instead, you can create a group-to-group link (when you create a group-to-group link, Reports Builder does not add a WHERE clause to your query) between the two queries and add a WHERE clause to the child query's SELECT statement, using a bind variable to reference the parent column. See Section 3.8.6, "Creating a data link".

  For example, suppose you want to create a column-to-column link between the ADDRESS.STREET column in your child query and the LOC1 column in your parent query. You can create a group-to-group link, and then modify the child query SQL statement to say:

      SELECT * FROM EMP E WHERE E.ADDRESS.STREET = :LOC1

  ##### See also

  Section 1.7.4, "About data links"

  Section 1.7.1, "About queries"

  Section 2.3.4.1, "About bind references"

  ### 2.3.6 About links versus groups

  In Reports Builder, data is defined independent of format (layout). Therefore, you should be aware of when to use data links instead of groups.

  The layouts of a master/detail report that uses two queries and a data link, and a group report that uses one query and two groups can be identical. Following is an example of a default master/detail report and a group report that query the same data. Notice the difference between the two reports: unlike the group report, the master/detail report displays department 40. This is because the data link in the master/detail report causes an outer-join: the link automatically fetches unrelated data. If you are designing a group report that requires an outer-join, explicitly add it to your SELECT statement via (+).

  #### Figure 2-3 Default master/detail and group report that query same data

  Text description of the illustration a_links_vs_breaks1.gif

  A master/detail/detail report, as shown in the figure below, is a report that contains three groups of data: for each master group, two unrelated detail groups are displayed. To produce a master/detail/detail report or any variation of it, you must use data links. If you try to produce this report with a control break using a single query and three groups the query will establish a relationship between the two detail groups.

  #### Figure 2-4 Master/detail/detail report

  Text description of the illustration a_links_vs_breaks2.gif

  ##### See also

  Section 1.7.2, "About groups"

  Section 1.7.4, "About data links"

  ### 2.3.7 About matrix objects

  A matrix object merely defines a relationship between two repeating frames: it isn't really owned by anything, nor does it own anything. A matrix object is created only for layouts with a Matrix layout style. A report may have multiple matrices within it, provided that the data model contains the necessary groups. Reports Builder creates one matrix object for each pair of intersecting, perpendicular repeating frames.

  The repeating frames are the dimensions of the matrix and the matrix object contains the field that will hold the "filler" or values of the cell group. One of the repeating frames must have the Print Direction property set to Down and the other must have the Print Direction property set to Across in order to form a matrix.

  ##### Restrictions

  - The down repeating frames must be below the across repeating frames in a matrix.

  - A matrix object must always be on top of the repeating frames that form it (i.e., it must be one or more layers above its horizontal and vertical repeating frames). Reports Builder prevents you from moving the matrix below its horizontal and vertical repeating frames.

  - Moving a matrix also causes its two repeating frames to move.

  - A matrix object cannot be anchored to another object and other objects cannot be anchored to it (i.e., a matrix object cannot be the parent or child object for an anchor).

  - To copy a matrix, you must select the matrix and its two repeating frames. If you select the matrix object by itself, nothing will be copied to the paste buffer. If you select the matrix and one of the repeating frames, only the repeating frame is placed in the paste buffer.

  - A matrix object can only be resized by resizing its associated repeating frames.

  - You cannot use Alignment or Size Objects from the Layout menu on matrix objects.

  - The source groups of the repeating frames that make up the dimensions of a matrix must be from the same cross-product group.

  - Repeating frames whose source groups are in the same "family" hierarchy (i.e., are descendants or ancestors of each other) must have the same Print Direction. Parent-child relationships within a cross-product group are used to create nesting in the matrix. As a result, the repeating frames associated with such groups must print in the same direction on the page.

  - You can put a border on a matrix object just as you would any other object, but the width will always be the minimum width possible. You cannot widen the border due to the closeness of the objects in a matrix layout.

  #### Example

  Suppose that you have a group named Group1 that contains a column called C_DEPTNO, which gets its values from the database column DEPTNO. A group called Group2, contains column C_JOB, which gets its values from the database column JOB, and column C_DEPTNO1, which is used for linking to Group1's query. A group called Group3 contains a column called SUMSAL, which is a summary of the database column SAL.

                          Job
                Analyst  Clerk  Manager

            10           $1300   $2450
      Dept  20    $6000  $1900   $2975
            30           $ 950   $2850

  In this example:

  - The Vertical Repeating Frame is the repeating frame that contains Group2 (the job titles).

  - The Horizontal Repeating Frame is the repeating frame that contains Group1 (the department numbers).

  - The Cross Product Group is Group4 (the group that is the parent of Group1 and Group2).

  If you need to build a more complex matrix, you can do so by adding more columns to Group1 and Group2. For example, instead of having Group1 just contain department numbers, it could also contain the locations (LOC) of the departments. The matrix might then look something like this:

                                    Job
       Loc        Dept    Analyst  Clerk  Manager

       New York    10              $1300   $2450
       Dallas      20      $6000   $1900   $2975
       Chicago     30              $ 950   $2850

  ##### See also

  Section 1.3.7, "About matrix reports"

  Section 2.1.7, "About nested matrix reports"

  Section 2.1.8, "About matrix with group reports"

  Section 3.9.1.3, "Creating a matrix object"

  Section 3.8.5, "Creating a matrix (cross-product) group"

  Section 3.5.3, "Creating a nested matrix report"

  ## 2.4 Layout Objects

  The topics in this section build on the basic concepts discussed in Section 1.8, "Layout Objects".

  - About layout objects

  - About layout defaulting

  - About images

  - About anchors

  - About changing colors and patterns

  - About resizing objects

  - About moving and layering objects in the Paper Layout view

  ### 2.4.1 About layout objects

  Several important concepts and properties apply to layout objects:

  - the frequency with which you want the object to appear in the report, specified by the Print Object On property

  - how Reports Builder fetches and formats data for instances of repeating frames, specified by the Column Mode property

  - whether to keep an object and the object to which it is anchored on the same logical page, specified by the Keep With Anchoring Object property

  - whether to try to keep the entire object and its contents on the same logical page, specified by the Page Protect property

  - format triggers, which are PL/SQL functions executed before an object is formatted that can dynamically change the formatting attributes of objects

  - report layout, generated by defaulting applied by Reports Builder, modified in the Paper Layout view, or created from scratch.

  ##### See also

  Section 3.5.4, "Creating a default layout for a report"

  Section 3.10.2, "Creating a default layout for a section"

  Section 2.6.12.2, "About format triggers"

  The Properties section of the Reports Builder online help

  ### 2.4.2 About layout defaulting

  When you select one of the default layout styles in the Report Wizard, Reports Builder creates the necessary layout objects, based upon the report's data model. For example, if you want to build a mailing label report and have defined an appropriate data model, simply choose the mailing label default style. Reports Builder automatically creates the report's layout objects and displays them in the Layout Model view. You can completely customize any default layout you create. You can cut, copy, paste, move, resize, and edit each layout object that Reports Builder generates for you.

  Layout defaulting is governed by the following rules:

  - All previously-defined layout objects for the report will be overwritten (including format triggers) unless you define the area in which you wish to create the layout as one which does not already contain layout objects.

  - One report can have any number of different formats. For example, you can build a report that has a tabular format on the top of the first page, and a matrix format on the bottom of the same page by creating an additional report layout (see Section 3.5.5, "Creating an additional report layout").

  - Once you have created a report layout, any further changes you make to the data model will not automatically be included in the layout. For example, if you create a query after you have created a report layout and then run your report, the data from the new query will not appear in the report output. To incorporate your changes, you need to either redefault or modify the layout.

  Reports Builder defaults report layout according to the following rules:

  1. Unless otherwise noted, a group with a Print Direction of Across defaults identically to a group with a Print Direction of Down, except that the default format is transposed. To quickly determine the defaulting of an Across group, do the following:

     - Draw the down layout for the group on translucent paper.

     - Turn the page over as if it was a page in a book.

     - Rotate the page counter-clockwise 90 degrees.

  2. In form letter reports, all default fields are hidden, and have a Horizontal Elasticity property setting of Variable and a Vertical Elasticity property setting of Fixed. In all other reports, all default fields have a Horizontal and Vertical Elasticity property setting of Fixed.

     Exception: For tabular, form-like, group left/above, and matrix reports, the default for CHAR (if you reduce the default width) and LONG fields have a Horizontal Elasticity property setting of Fixed and a Vertical Elasticity property setting of Variable. As a result, all of the field's value will be displayed, instead of truncated, by word-wrapping any data to the next lines.

     Caution: For form letter and mailing label reports, the default for CHAR (if you reduce the default width) and LONG fields have a Horizontal Elasticity and Vertical Elasticity property setting of Fixed. As a result, the field value will be truncated if the size of the data is greater than the size of the field.

  3. Summaries that are owned by the report, not by a group, are allowed in all report layout styles. They are all formatted in the following way:

     - If the layout style is form-like, form letter, or mailing label, the summary is a report column. A report column is formatted like any other database column for that report style.

     - If the layout style is tabular, group left/above, or matrix, and the column on which the summary performs its function is not selected, the summary is a report column. (It is formatted as stated in the bullet above.) Otherwise, the summary is a report summary. It is formatted left-justified at the end of the report, with the label to the left of the field (if there is room).

  4. If the layout style is tabular, group left/above, or matrix, a summary is defaulted like a database column if the column it summarizes is not selected. Otherwise, a summary is defaulted like summaries (i.e., appearing inside the M_groupname_FTR frames).

  5. If the layout style is tabular, group left/above, or matrix, Reports Builder places one summary type per line, in the following order:

     - SUM

     - AVERAGE

     - MINIMUM

     - MAXIMUM

     - COUNT

     - FIRST

     - LAST

     - % OF TOTAL

     - STANDARD DEVIATION

     - VARIANCE

  6. If the layout style is tabular, group left/above, or matrix, the summary label will appear to the far-left of the group footer frame (M_groupname_FTR). If there is not room for the full label, the label will be truncated.

  ##### See also

  Section 3.5.4, "Creating a default layout for a report"

  Section 3.10.2, "Creating a default layout for a section"

  ### 2.4.3 About images

  You can add an image to a report by:

  - selecting a column in the database that contains images (see Section 3.9.8.7, "Selecting an image from the database")

  - importing the image from a file into the report layout (see Section 3.9.8.6, "Importing a drawing or image")

  - linking an image object to a file (see Section 3.9.8.9, "Linking an image object to a file")

  - for HTML output, selecting a column in the database that contains URL links to images or linking an image object to a URL (see Section 3.9.8.8, "Selecting an image URL from the database" and Section 3.9.8.10, "Linking an image object to a URL")

  By default, images display in fields so that they appear in the printed report, not only in the Previewer.

  Oracle Reports 10g (9.0.4) enhances imaging support via the REPORTS_OUTPUTIMAGEFORMAT environment variable and OUTPUTIMAGEFORMAT command line keyword. The image formats supported in the report definition are: JPEG (all types), PNG, BMP, TIFF, GIF, CGM, and OGD. The enhancements in imaging support provide the capability to generate complex graphics-intensive reports with high fidelity image output. Additionally on UNIX, the dependency on a windowing system for displaying images is removed; the PostScript printer driver `screenprinter.ppd` provides surface resolution for images.

  You can include an unlimited number of image objects without running out of local disk space by using non-caching references. A non-caching reference causes objects to be read from the database only when needed while a report is processing. You must be connected to an ORACLE V7.1 or later database to use this feature.

  If you reference a URL for an image, the image is displayed when you format your report for HTML output. For other output formats, the URL text displays in the Paper Design view; in the output destination (for example, a file or PDF document), nothing is displayed. It is your responsibility to verify that the URL exists; Reports Builder does not validate the existence of the resource nor the syntax of the protocol. The size of the object that contains the URL defines the size of the image in the HTML output. Any elasticity properties applied to the object are ignored.

  ##### Limitations

  - If the input image includes more than 256 colors, and the output image format is set to GIF (via the OUTPUTIMAGEFORMAT command line keyword or the REPORTS_OUTPUTIMAGEFORMAT environment variable), Oracle Reports implements a color reduction to 256 colors to successfully generate the GIF.

  - On UNIX, CGM and OGD (Oracle6i Graphics) formats are not supported in HTML output. This limitation does not apply on the Windows platform.

  ##### See also

  Section 3.9.8.6, "Importing a drawing or image"

  Section 3.9.8.7, "Selecting an image from the database"

  Section 3.9.8.8, "Selecting an image URL from the database"

  Section 3.9.8.9, "Linking an image object to a file"

  Section 3.9.8.10, "Linking an image object to a URL"

  ### 2.4.4 About anchors

  Anchors fasten an edge of one object to an edge of another object, ensuring that they maintain their relative positions. For example, you can anchor boilerplate text to the edge of a variable-sized repeating frame, guaranteeing the boilerplate's distance and position in relation to the repeating frame, no matter how the frame's size might change.

  Anchors determine the vertical and horizontal positioning of a child object relative to its parent. The child object may be either outside of or contained within the parent.

  Since the size of some layout objects may change when the report runs (and data is actually fetched), you need anchors to define where you want objects to appear relative to one another. An anchor defines the relative position of an object to the object to which it is anchored. Positioning is based on the size of the objects after the data has been fetched rather than on their size in the editor. It should also be noted that the position of the object in the Paper Layout view affects the final position in the report output. Any physical offset in the layout is incorporated into the percentage position specified in the Anchor properties.

  There are two types of anchors:

  - Implicit anchors. At runtime, Reports Builder generates an implicit anchor for each layout object that does not already have an explicit anchor. It determines for each layout object which objects, if any, can overwrite it, then creates an anchor from the layout object to the closest object that can overwrite it. This prevents the object from being overwritten. The implicit anchor functionality saves you from having to define the positioning of each object. Implicit anchors are not visible in the Paper Layout view. However, you can specify in the Object Navigator Options dialog box that the Object Navigator display anchoring information. By default, objects are anchored to the upper left corner of their enclosing object. If this view of the Object Navigator does not show anchoring information for an object, you can assume that the object is anchored to its enclosing object, which might be the frame or the body.

  - Explicit anchors. You can create an anchor in the Layout editor using the Anchor tool, dragging from one edge of the child to the one of the parent's edges. Any anchor you create for an object will override its implicit anchoring. Explicit anchors are always visible in the Paper Layout view unless you specify otherwise in the Layout Options dialog box.

  #### Relative positioning of anchors

  When you anchor a child object to a parent object, the x and y coordinates of the anchor's attachments are important.

  If the parent object is located above or below the child object:

  - the vertical distance between the two objects is fixed. For example, in the figure below, the vertical spacing between the parent and Object 1 is fixed.

  - the horizontal positioning of the anchor's x-coordinate on the child object is relative to the anchor's x-coordinate on the parent object. For example, in the figure below, the anchor is 50% from the edge of the parent and 75% from the left edge of Object 1. Therefore, when this report is run, Reports Builder will shift Object 1 25% to the left of the center of the parent.

  #### Figure 2-5 Parent object above child object

  Text description of the illustration a_anchors_rp.gif

  If the parent object is located to the right or left of the child object:

  - the vertical positioning of the two objects is relative. For example, in the figure below, both ends of the anchor are about 80% down from the top edges of the objects. Therefore, when the report is run, Reports Builder will calculate the length of the two objects (as they may expand), calculate the y coordinate that is 80% down for both objects, and position the two objects so that those two points are separated by the amount of space separating them in the Paper Layout view.

  - the horizontal positioning between the two objects is fixed. For example, in the figure below, the horizontal spacing between the parent and Object 1 is fixed.

  #### Figure 2-6 Parent object to the right of child object

  Text description of the illustration a_anchors_rp2.gif

  If you need to position an object outside a repeating frame or frame, but you want the object to be "owned" by the repeating frame or frame (i.e., to be formatted when its "owner" is formatted), create an anchor that is attached to an object inside the frame or repeating frame.

  #### Collapsing Anchors

  You can create anchors to be "collapsible." Collapsing anchors help avoid unnecessary empty space in your report. Such empty space can occur when the parent object does not print on the same page as the child object, either because the parent and child can not fit on the same page or because of an assigned Print Condition. A collapsing anchor allows the child object to move into the position that would have been taken by the parent had it printed. The child object will also maintain its relative position as defined by the anchor.

  #### 2.4.4.1 Implicit anchoring algorithm

  Reports Builder creates implicit anchors at runtime in the body region. The margin algorithm differs slightly.

  #### Body algorithm

  1. Determine which objects are not entirely enclosed by a repeating frame of frame (directly or indirectly), or explicitly anchored to an object that is enclosed by a frame or repeating frame (directly or indirectly). We'll call these objects Type A objects. (Type A objects are typically group frames, repeating frames, other objects you create that are not owned by a frame or repeating frame, etc.) An object is considered to be enclosed by another object only if all of the following are true:

     - Both objects belong to the same region (Body or Margin).

     - The outermost of the two objects is a frame or repeating frame.

     - The outermost of the two objects is behind the other object.

     - The innermost of the two objects lies entirely within the borders of the other object.

  2. Determine all children objects of a frame or repeating frame (these are the non-Type A objects). We'll call these objects Type B objects.

  3. Follow this procedure for Type A and Type B objects independently:

     - Find all objects that are of the same type (e.g., Type A), and are on the same layer.

     - Determine which of those objects have potential to "push" other objects of that type. An object has potential to "push" object of that type if it has a Horizontal and/or Vertical Elasticity setting of Variable or Expand, and a second object is located in its "push path" (i.e., in the area in which it can possibly grow). Also, a repeating frame with a Horizontal and/or Vertical Elasticity setting of Fixed or Contract has a "push path": its Print Direction.

     - Create pairs of objects. Each pair must contain a pusher (i.e., the object that will grow) and a pushee (i.e., the object that will be pushed). When creating these pairs, a pushee object cannot be a child of an explicit anchor--those objects are ignored.

     - Go through this loop. For each pair, determine the distance in the "push path" between the pusher and pushee. Next, find the pair with the shortest distance. Finally, create an implicit anchor between those two objects using this algorithm:

       If the "push path" direction is Down, anchor the pushee object's top 0% to the pusher object's bottom 0%.

       If the "push path" direction is Across, anchor the pushee object's left 0% to the pushed object's right 0%.

     - That pair is now treated like one object, and the loop continues until either all objects have one anchor, or nothing will push the remaining, unanchored objects.

     - For each remaining, unanchored object, create an implicit anchor from the top-left corner of the object to the top-left corner of the body region.

     - Move to the next layer, and follow the procedure starting at step 1.

  #### Rules:

  - If an object is in the "push path" of two other objects and it is equidistant from the other two objects, the implicit anchoring of the object may vary between executions of the report. For example, the drawing that follows shows two cases where this could occur:

  #### Figure 2-7 Object in push path of two other objects

  Text description of the illustration ch2ru636.gif

  In the first case, M_Sums is in the "push path" of both B_Text1 and R_Ename. Because M_Sums is equidistant from B_Text1 and R_Ename, though, the normal criteria (shortest distance) for determining implicit anchors does not work in this case. Consequently, the formatting algorithm will randomly create an implicit anchor between M_Sums and either B_Text1 or R_Ename at runtime. To avoid this behavior, you could create an explicit anchor between M_Sums and B_Text1 or R_Ename.

  In the second case, B_Text3 is in the "push path" of M_Emp. Since the bottom edges of M_Emp and R_Mgr are virtually in the same position, though, B_Text3 could be implicitly anchored to either M_Emp or R_Mgr. Consequently, the formatting algorithm will randomly create an implicit anchor between B_Text3 and either M_Emp or R_Mgr at runtime. To avoid this behavior, you could create an explicit anchor from B_Text3 to one of the objects or remove the explicit anchor between R_Ename and B_Text2. Removing the explicit anchor would cause R_Mgr to be treated as a descendant of M_Emp and, therefore, the implicit anchor would always be created between B_Text3 and M_Emp.

  (Note that Case 2 is most likely to occur in character mode, where it is common to have the edges of objects overlap in the Paper Layout view.)

  #### Margin algorithm

  Reports Builder creates implicit anchors for all Type B objects in the margin region using the Body algorithm. For each Type A object, however, Reports Builder creates an implicit anchor from the top-left corner of the object to the top-left corner of the margin. No Type A object will be implicitly anchored to another Type A object. (This ensures that Type A objects will not be pushed off the page. However, they may be overwritten by another Type A object, if they are found on the same layer.)

  ##### See also

  Section 3.9.5.1, "Anchoring objects together"

  Section 3.9.5.2, "Viewing implicit anchors"

  Section 3.9.5.3, "Moving an anchor"

  ### 2.4.5 About changing colors and patterns

  Color and pattern selections are applied to an entire object (e.g., you can apply a color to all the text in the object but not to a segment of the text).

  You can change colors and patterns in your report in the following ways:

  - In the Reports Builder user interface, use the following tools in the Paper Layout view's tool palette:

    - The Line Color tool is used to customize the color of borders around layout objects.

      Note: The Windows platform does not support a border pattern (that is, patterns for the Line Color tool).

    - The Fill Color tool is used to fill layout objects with colors and patterns.

    - The Text Color tool is used to change the default text color.

    - The Fill/Line/Text Display, the box directly above the three Color tools, shows the currently selected fill, border, and text. The default fill and border for objects created by Reports Builder is transparent, while the default for objects you create is a black, one point line around a white fill.

  - In PL/SQL, use the following SRW packaged procedures:

    - SRW.SET_BACKGROUND_BORDER_COLOR

    - SRW.SET_BACKGROUND_FILL_COLOR

    - SRW.SET_FOREGROUND_BORDER_COLOR

    - SRW.SET_FOREGROUND_FILL_COLOR

    - SRW.SET_TEXT_COLOR

    - SRW.SET_FILL_PATTERN

    - SRW.SET_BORDER_PATTERN

  - For templates, set the following properties in the template Property Inspector:

    - The Fill Pattern property defines the pattern to use for the space enclosed by the objects. You can define the background and foreground colors of the fill pattern using the Foreground Color and Background Color properties.

    - The Edge Pattern property defines the pattern to use for the borders of the objects. You can define the background and foreground colors of the edge pattern using the Edge Foreground Color and Edge Background Color properties.

      Note: The Windows platform does not support a border pattern.

    - The Text Color property specifies the text color to use for the object(s).

  Additionally, you can set color palette preferences to specify how it is used by a report (see Section 3.2.6, "Setting color palette preferences") and modify the color palette to change the definition of individual colors (see Section 3.9.6.5, "Modifying the color palette").

  To change the color palette being used by the current report, you can import a new color palette. You can also export the current color palette for use by other reports. (See Section 3.9.6.6, "Importing or exporting a color palette".)

  ##### See also

  Section 3.9.6.2, "Changing colors"

  Section 3.9.6.3, "Changing patterns"

  Section 3.9.6.4, "Changing colors and patterns using PL/SQL"

  Section 3.9.4.2, "Changing object border attributes"

  Topics "Oracle CDE1 color palette", "Default color palette", "Grayscale color palette", and "Pattern color palette" in the Reference > Color and Pattern Palettes section of the Reports Builder online help

  Topic "SRW built-in package" in the Reference > PL/SQL Reference > Built-in Packages section of the Reports Builder online help

  Topic "Template properties" in the Properties section of the Reports Builder online help

  ### 2.4.6 About resizing objects

  You can resize queries, groups, frames, repeating frames, fields, matrix objects, and boilerplate objects. You cannot resize anchors. However, an anchor is automatically resized if you move one of the objects it anchors.

  Caution: When you resize boilerplate text, be very careful that all of the text fits within the object. If font descends (the space left for the lower parts of letters like g and q) do not fit, the line of text will appear in the Report Editor view, but, when the report is run, the line will not appear in the output. When you click a handle and drag it, the two edges that join at the corner will be resized; that is, the object will grow or reduce in both the x and y directions.

  ##### See also

  Section 3.9.12.1, "Resizing objects"

  Section 3.9.12.2, "Making multiple objects the same size"

  Section 3.9.11.3, "Adjusting parent borders automatically"

  ### 2.4.7 About moving and layering objects in the Paper Layout view

  In the Paper Layout view, objects must be on a layer above the objects that enclose them. For example, the fields that belong to a repeating frame must be at least one layer above the repeating frame in the Paper Layout view. If not, then they are not considered to be enclosed by the repeating frame any longer and will cause a frequency error at runtime. When you move or group objects in the Paper Layout view, it is possible to change the layering such that you will get frequency errors when you run the report. To avoid this problem, you should take advantage of Confine or Flex mode when moving objects in the Paper Layout view.

  ##### See also

  Section 3.9.4.3, "Changing the current mode (Confine or Flex)"

  Section 3.9.11.7, "Changing object layering"

  Section 3.9.11.2, "Moving an object outside its parent"

  Section 3.9.11.1, "Moving multiple objects"

  Section 3.9.11.6, "Aligning objects"

  ## 2.5 Parameter Form Objects

  The topic in this section builds on the basic concepts discussed in Section 1.9, "Parameter Form Objects".

  ### 2.5.1 About Parameter Form HTML extensions

  Parameter Form HTML extensions enable you to enhance your Runtime Parameter Form with HTML tagged text and JavaScript when your paper reports are run via the Web. To enhance your Paper Parameter Form for displaying on the Web, you can:

  - create boilerplate text with HTML tags for adding hyperlinks or any other HTML tagged text to your Parameter Form (see Section 3.6.7.1.14, "Creating a boilerplate text object for HTML tags").

  - insert parameter fields with JavaScript for defining input or select events, such as raising errors when users enter invalid data in a parameter field (see.Section 3.11.12, "Creating HTML Parameter Form input or select events").

  - create a Parameter Form header (a before form escape) for placing a logo or some standard links in the header of the HTML Parameter Form (see Section 3.6.7.1.5, "Creating an HTML Parameter Form header using the Property Inspector" to use the Property Inspector, or Section 3.6.7.2.5, "Creating an HTML Parameter Form header using PL/SQL").

  - create a Parameter Form footer (an after form escape) for placing a logo or some standard links in the footer of the HTML Parameter Form (see Section 3.6.7.1.6, "Creating an HTML Parameter Form footer using the Property Inspector" to use the Property Inspector, or Section 3.6.7.2.6, "Creating an HTML Parameter Form footer using PL/SQL").

  You can access the Parameter Form Builder from the Object Navigator or by choosing Tools > Parameter Form Builder.

  ##### See also

  Section 1.2.2, "About Web reports"

  Section 1.9.4, "About Parameter Forms for Web reports"

  Section 2.2.3, "About Web links for HTML output"

  ## 2.6 PL/SQL

  The topics in this section discuss the use of PL/SQL in Reports Builder.

  - About the PL/SQL Editor

  - About the Stored PL/SQL Editor

  - About the Syntax Palette

  - About program units

  - About stored program units

  - About stored program units

  - About external PL/SQL libraries

  - About attached libraries

  - About formulas

  - About group filters

  - About ref cursor queries

  - About built-in packages

  - About triggers

  ### 2.6.1 About the PL/SQL Editor

  The PL/SQL Editor enables you to create and edit PL/SQL program units.

  ##### Usage notes

  When you make changes to a program unit, dependent program units lose their compiled status, which is indicated by an asterisk (*) after their name under the Program Units node in the Object Navigator. You can navigate to those program units directly in the PL/SQL Editor using the Name drop-down list to recompile them.

  ##### Restrictions

  - If you delete a PL/SQL package, function, or procedure, you must also delete all references to it in your report. Otherwise, you will get an error when you compile, generate, or run the report.

  - PL/SQL package, function, and procedure names must be unique within the report and may not duplicate the names of any columns, groups, queries, or printable objects.

  ##### See also

  Section 3.13.3.1, "Creating a local program unit"

  ### 2.6.2 About the Stored PL/SQL Editor

  The Stored PL/SQL Editor enables you to create and edit stored PL/SQL program units in a database (listed under the Database Objects node in the Object Navigator).

  ##### See also

  Section 3.13.3.2, "Creating a stored program unit"

  ### 2.6.3 About the Syntax Palette

  The Syntax Palette is a programming tool that enables you to display and copy the constructs of PL/SQL language elements and built-in packages into the PL/SQL Editor and Stored PL/SQL Editor.

  ##### See also

  Section 3.13.2.4, "Inserting syntax into the PL/SQL Editor"

  ### 2.6.4 About program units

  Program units are packages, functions, or procedures that you can reference from any PL/SQL within the current report.

  Note: Program units cannot be referenced from other documents. If you want to create a package, function, or procedure that can be referenced from multiple documents, create an external PL/SQL library (see Section 3.13.5.1, "Creating an external PL/SQL library").

  For a detailed example of using PL/SQL in a report, see Chapter 37, "Building a PL/SQL Report".

  ##### Restrictions

  - If you delete a PL/SQL package, function, or procedure, you must also delete all references to it in your report. Otherwise, you will get an error when you compile, generate, or run the report.

  - PL/SQL package, function, and procedure names must be unique within the report and may not duplicate the names of any columns, groups, queries, or printable objects.

  #### Example: Referencing a PL/SQL function in formulas

  Suppose that you have a report with the following groups and columns:

      Groups    Columns         Summary
      -----------------------------------------
      RGN       REGION
                RGNSUMSAL       SUM(DEPTSUMSAL)
                COSTOFLIVING

      DEPT      DNAME
                DEPTNO
                DEPTSUMSAL      SUM(EMP.SAL)

      JOB       JOB
                HEADCOUNT       COUNT(EMP.EMPNO)

      EMP       ENAME
                EMPNO
                SAL
                COMM

  Given these groups and columns, you might create multiple formulas that apply the cost of living factor (COSTOFLIVING) to salaries. To avoid duplication of effort, you could create the following PL/SQL function and reference it from the formulas:

      function CompSal(salary number) return number is
      begin
        return (salary*CostofLiving);
      end;

      Following are some examples of how you might reference the PL/SQL function in
      formulas:

      CompSal(:RGNSUMSAL)

      or

      CompSal(:SAL) + COMM

  ##### See also

  Section 3.13.3.1, "Creating a local program unit"

  ### 2.6.5 About stored program units

  Stored program units (also known as stored subprograms, or stored procedures) can be compiled separately and stored permanently in an Oracle database, ready to be executed. Once compiled and stored in the data dictionary, they are schema objects, which can be referenced by any number of applications connected to that database.

  Stored program units offer higher productivity, better performance, memory savings, application integrity, and tighter security. For example, by designing applications around a library of stored procedures and functions, you can avoid redundant coding and increase your productivity.

  Stored program units are stored in parsed, compiled form. So, when called, they are loaded and passed to the PL/SQL engine immediately. Also, they take advantage of shared memory. So, only one copy of a program unit need be loaded into memory for execution by multiple users.

  Because stored program units run in ORACLE, they can perform database operations more quickly than PL/SQL that is local to your report. Therefore, in general, use stored program units for PL/SQL that performs database operations. Use local program units for PL/SQL that does not involve database operations. However, if you are on a heavily loaded network with very slow response time, using stored program units may not be faster for database operations. Similarly, if your server is significantly faster than your local machine, then using local program units may not be faster for non-database operations.w

  ##### See also

  Section 3.13.3.2, "Creating a stored program unit"

  ### 2.6.6 About external PL/SQL libraries

  External PL/SQL libraries are collections of PL/SQL procedures, functions, and packages that are independent of a report definition. By attaching an external library to a report, you can reference its contents any number of times. For example, you could reference a procedure in an attached library from both a Before Report trigger and a format trigger. This eliminates the need to re-enter the same PL/SQL for each application.

  When you associate an external PL/SQL library with a report or another external library, it is called an attached library.

  ##### See also

  Section 3.13.5.1, "Creating an external PL/SQL library"

  ### 2.6.7 About attached libraries

  Attached libraries are external PL/SQL libraries that you have associated with a report or another external library. When an external library is attached, you can reference its packages, functions, and procedures from within your report. For example, if you attached an external library name MYLIB to your report and it contained a function named ADDXY, then you could reference ADDXY from any PL/SQL in the report.

  External PL/SQL libraries are independent of a report definition

  ##### Usage notes

  Local PL/SQL executes more quickly than a reference to a procedure or function in an external PL/SQL library. As a result, you should only use external PL/SQL libraries when the benefits of sharing the code across many applications outweigh the performance overhead.

  ##### Restrictions

  - If Reports Builder cannot find a library that you specify in the Attached Libraries list, a warning will be raised when you accept the dialog box, save the report, or open the report. If you try to run the report or compile the PL/SQL in it, an error will be raised.

  - The Attached Libraries list is saved. The next time you open the report or library the list will have the same contents it did when you last saved the report.

  - If an external library references another library, you must attach both libraries to the report even if the first library already has the second one attached.

  ##### See also

  Section 3.13.5.5, "Attaching a PL/SQL library"

  ### 2.6.8 About formulas

  Formulas are PL/SQL functions that populate formula or placeholder columns. You can access the PL/SQL for formulas from the Object Navigator, the PL/SQL Editor, or the Property Inspector (i.e., the PL/SQL Formula property).

  A column of datatype Number can only have a formula that returns a value of datatype NUMBER. A column of Datatype Date can only have a formula that returns a value of datatype DATE. A column of Datatype Character can only have a formula that returns a value of datatype CHARACTER, VARCHAR, or VARCHAR2.

  ##### Restrictions

  - You can read and assign values to a column in a formula, if the column is a placeholder or parameter column; you cannot change the value of database columns (values retrieved from the database). For example, you can use the value of a column called COMP in a condition (e.g., IF :COMP = 10) and you can directly set its value in an assignment statement (e.g.,:COMP:= 15).

  - A formula can only make reference to columns that are in the same or a higher group in the group hierarchy. For example, a formula for a report-level column can only reference other report-level columns.

  - Formulas are calculated such that any column referenced in the formula will be calculated first. To do so, Reports Builder builds a dependency list, to guarantee proper ordering of calculations. Note that circular dependencies, in which a column references another column which in turn references the first column, either directly or indirectly, are not allowed.

  - When using SRW.DO_SQL, we recommend that you do not read database values that are updated or inserted in the same report. There is no guarantee of the exact time Reports Builder will fetch records from the database for formatting the output. Reports Builder does internal "data look-ahead" to optimize performance. Thus, a particular record might already have been accessed before an update is issued to the same record. Reports Builder builds internal dependency lists which guarantee that events, such as invocation of user exits, calculation of summaries, etc., happen in the correct order. However, Reports Builder cannot guarantee these events will be synchronized with its internal data access or with the formatting of data.

  #### Examples

  ##### Example 1: Adding values

  The following example populates the column with the value of the salary plus the commission.

      function salcomm return NUMBER is
      begin
        return(:sal + :comm);
      end;

  ##### Example 2: Using conditions

  The following code adds the commission to the salary if the value for the commission is not null.

      function calcomm return NUMBER is
      temp number;
      begin
        if :comm IS NOT NULL then
          temp := :sal + :comm;
        else
          temp := :sal;
        end if;
        return (temp);
      end;

  ##### See also

  Section 2.3.2, "About formula columns"

  Section 3.13.4.3, "Creating or editing a formula column"

  Section 3.13.4.4, "Creating a placeholder column"

  ### 2.6.9 About group filters

  A group filter determines which records to include in a group. You can use the packaged filters, First and Last, to display the first n or last n records for the group, or you can create your own filters using PL/SQL. You can access group filters from the Object Navigator, the Property Inspector (the PL/SQL Filter property), or the PL/SQL Editor.

  The function must return a boolean value (TRUE or FALSE). Depending on whether the function returns TRUE or FALSE, the current record is included or excluded from the report.

  #### Difference between group filters and Maximum Rows to Fetch property

  The Maximum Rows to Fetch property restricts the actual number of records fetched by the query. A group filter determines which records to include or exclude, after all the records have been fetched by the query. Since Maximum Rows to Fetch actually restricts the amount of data retrieved, it is faster than a group filter in most cases. If you use a Filter of Last or Conditional, Reports Builder must retrieve all of the records in the group before applying the filter. Also, you should be aware that when using Maximum Rows to Fetch for queries. It can effect summaries in other groups which depend on this query. For example, if you set Maximum Rows to Fetch to 8 any summaries based on that query will only use the 8 records retrieved.

  ##### Restrictions

  Group filters cannot be added to groups if Filter Type is First or Last.

  - Group filters cannot be added to cross-product groups.

  - The function that you enter for a group filter can only depend upon the following columns:

    - a database column owned by the group's query or a query above it in the data model hierarchy

    - computed columns (formulas or summaries) that depend on unrelated queries (i.e., computed columns that do not depend upon columns in the group, the group's ancestors, or the group's descendants)

  - In a group filter, you can read the values of Reports Builder columns and parameters of the correct frequency, but you cannot directly set their values. For example, you can use the value of a parameter called COUNT1 in a condition (e.g., IF :COUNT1 = 10), but you cannot directly set its value in an assignment statement (e.g.,:COUNT1:= 10). Note also that the use of PL/SQL global variables to indirectly set the values of columns or parameters is not supported. If you do this, you may get unpredictable results. You also cannot reference any page-dependent columns (i.e., Reset At of Page) or columns that rely on page-dependent columns in a group filter.

  #### Example

      function filter_comm return boolean is
      begin
        if :comm IS NOT NULL then
          if :comm < 100 then
            return (FALSE);
          else
            return (TRUE);
          end if;
        else
          return (FALSE); -- for rows with NULL commissions
        end if;
      end;

  ##### See also

  Section 3.13.4.2, "Creating or editing a group filter"

  ### 2.6.10 About ref cursor queries

  A ref cursor query uses PL/SQL to fetch data. Each ref cursor query is associated with a PL/SQL function that returns a cursor value from a cursor variable. The function must ensure that the ref cursor is opened and associated with a SELECT statement that has a SELECT list that matches the type of the ref cursor.

  ##### Usage notes

  - When you make a ref cursor query the child in a data link, the link can only be a group to group link. It cannot be a column to column link.

  - If you use a stored program unit to implement ref cursors, you receive the added benefits that go along with storing your program units in the Oracle database.

  - You base a query on a ref cursor when you want to:

    1. more easily administer SQL.

    2. avoid the use of lexical parameters in your reports.

    3. share data sources with other applications, such as Form Builder.

    4. increase control and security.

    5. encapsulate logic within a subprogram.

  Furthermore, if you use a stored program unit to implement ref cursors, you receive the added benefits that go along with storing your program units in the Oracle database.

  For more information about ref cursors and stored subprograms, refer to the PL/SQL User's Guide and Reference.

  #### Examples

  ##### Example 1: Package with ref cursor example

      /* This package spec defines a ref cursor
      ** type that could be referenced from a
      ** ref cursor query function.
      ** If creating this spec as a stored
      ** procedure in a tool such as SQL*Plus,
      ** you would need to use the CREATE
      ** PACKAGE command.
      */

      PACKAGE cv IS
      type comp_rec is RECORD
        (deptno number,
         ename varchar(10),
         compensation number);
      type comp_cv is REF CURSOR return comp_rec;
      END;

  ##### Example 2: Package with ref cursor and function

      /* This package spec and body define a ref
      ** cursor type as well as a function that
      ** uses the ref cursor to return data.
      ** The function could be referenced from
      ** the ref cursor query, which would
      ** greatly simplify the PL/SQL in the
      ** query itself. If creating this spec
      ** and body as a stored procedure in a
      ** tool such as SQL*Plus, you would need
      ** to use the CREATE PACKAGE and CREATE
      ** PACKAGE BODY commands.
      */

      PACKAGE cv IS
      type comp_rec is RECORD
        (deptno number,
         ename varchar(10),
         compensation number);
      type comp_cv is REF CURSOR return comp_rec;
      function emprefc(deptno1 number) return comp_cv;
      END;

      PACKAGE BODY cv IS
      function emprefc(deptno1 number) return comp_cv is
        temp_cv cv.comp_cv;
      begin
        if deptno1 > 20 then
          open temp_cv for select deptno, ename,
          1.25*(sal+nvl(comm,0)) compensation
          from emp where deptno = deptno1;
        else
          open temp_cv for select deptno, ename,
          1.15*(sal+nvl(comm,0)) compensation
          from emp where deptno = deptno1;
        end if;
        return temp_cv;
      end;
      END;

  ##### Example 3: Ref cursor

      empCur rcPackage.empCurType;
      BEGIN
        OPEN empCur FOR SELECT * FROM emp;
        RETURN empCur;
      END;

      /* Note, rcPackage is a local program unit defined as: */

      PACKAGE rcPackage IS
        TYPE empCurType IS REF CURSOR RETURN emp%ROWTYPE;
      END;

  ##### Example 4: Ref cursor query

      /* This ref cursor query function would be coded
      ** in the query itself. It uses the cv.comp_cv
      ** ref cursor from the cv package to return
      ** data for the query.
      */
      function DS_3RefCurDS return cv.comp_cv is
        temp_cv cv.comp_cv;
      begin
        if :deptno > 20 then
          open temp_cv for select deptno, ename,
          1.25*(sal+nvl(comm,0)) compensation
          from emp where deptno = :deptno;
        else
         open temp_cv for select deptno, ename,
         1.15*(sal+nvl(comm,0)) compensation
         from emp where deptno = :deptno;
        end if;
        return temp_cv;
      end;

  ##### Example 5: Ref cursor query calling function

      /* This ref cursor query function would be coded
      ** in the query itself. It uses the cv.comp_cv
      ** ref cursor and the cv.emprefc function from
      ** the cv package to return data for the query.
      ** Because it uses the function from the cv
      ** package, the logic for the query resides
      ** mainly within the package. Query
      ** administration/maintenance can be
      ** done at the package level (e.g.,
      ** modifying SELECT clauses could be done
      ** by updating the package). You could also
      ** easily move the package to the database.
      ** Note this example assumes you have defined
      ** a user parameter named deptno.
      */

      function DS_3RefCurDS return cv.comp_cv is
        temp_cv cv.comp_cv;
      begin
        temp_cv := cv.emprefc(:deptno);
        return temp_cv;
      end;

  ##### See also

  Section 3.8.1.9, "Creating a query: Ref Cursor Query tool"

  ### 2.6.11 About built-in packages

  A built-in package is a group of logically related PL/SQL types, objects, and functions or procedures. It generally consists of two parts: the package spec (including data declarations) and the package body. Packages are especially useful because they allow you to create global variables.

  Oracle provides several packaged procedures that you can use when building or debugging your PL/SQL-based applications. Your PL/SQL code can make use of the procedures, functions, and exceptions in the Reports Builder built-in package (SRW), and numerous Tools built-in packages, as described below.

  #### 2.6.11.1 About the Reports Builder built-in package (SRW)

  Reports Builder is shipped with a built-in package (SRW), a collection of PL/SQL constructs that include many functions, procedures, and exceptions you can reference in any of your libraries or reports.

  The PL/SQL provided by the SRW package enables you to perform such actions as change the formatting of fields, run reports from within other reports, create customized messages to display in the event of report error, and execute SQL statements.

  You can reference the contents of the SRW package from any of your libraries or reports without having to attach it. However, you cannot reference its contents from within another product, e.g., from SQL*Plus.

  Constructs found in a package are commonly referred to as "packaged"; i.e., packaged functions, packaged procedures, and packaged exceptions.

  ##### See also

  Topic "SRW built-in package" in the Reference section of the Reports Builder online help

  #### 2.6.11.2 About the Tools built-in packages

  Several client-side built-in packages are provided that contain many PL/SQL constructs you can reference while building applications or debugging your application code. These built-in packages are not installed as extensions to the package STANDARD. As a result, any time you reference a construct in one of the packages, you must prefix it with the package name (e.g., TEXT_IO.PUT_LINE).

  The Tools built-in packages are:

  - DDE

    Provides Dynamic Data Exchange support within Reports Builder components.

  - DEBUG

    Provides procedures, functions, and exceptions for when debugging your PL/SQL program units. Use these built-in subprograms to create debug triggers and set breakpoints with triggers.

  - EXEC_SQL

    Provides procedures and functions for executing dynamic SQL within PL/SQL code written for Reports Builder applications.

  - LIST

    Provides procedures, functions, and exceptions you can use to create and maintain lists of character strings (VARCHAR2). This provides a means of creating arrays in PL/SQL Version 1.

  - ORA_FFI

    Provides a foreign function interface for invoking C functions in a dynamic library.

  - ORA_JAVA

    Provides an interface for invoking Java classes from PL/SQL.

  - ORA_NLS

    Enables you to extract high-level information about your current language environment. This information can be used to inspect attributes of the language, enabling you to customize your applications to use local date and number format. Information about character set collation and the character set in general can also be obtained. Facilities are also provided for retrieving the name of the current language and character set, allowing you to create applications that test for and take advantage of special cases.

  - ORA_PROF

    Provides procedures, functions, and exceptions you can use for tuning your PL/SQL program units (e.g. examining how much time a specific piece of code takes to run).

  - TEXT_IO

    Provides constructs that allow you to read and write information from and to files. There are several procedures and functions available in Text_IO, falling into the following categories:

    - file operations. The FILE_TYPE record, the FOPEN and IS_OPEN functions, and the FCLOSE procedure enable you to define FILE_TYPE variables, open files, check for open files, and close open files, respectively.

    - output (write) operations. The PUT, PUTF, PUT_LINE, and NEW_LINE procedures enable you to write information to an open file or output it to the PL/SQL Interpreter.

    - input (read) operations. The GET_LINE procedure enables you to read a line from an open file

  - TOOL_ENV

    Allows you to interact with Oracle environment variables by retrieving their values for use in subprograms.

  - TOOL_ERR

    Allows you to access and manipulate the error stack created by other built-in packages such as DEBUG.

    In addition to using exceptions to signal errors, some built-in packages (e.g., the DEBUG package) provide additional error information. This information is maintained in the form of an "error stack".

    The error stack contains detailed error codes and associated error messages. Errors on the stack are indexed from zero (oldest) to n-1 (newest), where n is the number of errors currently on the stack. Using the services provided by the TOOL_ERR package, you can access and manipulate the error stack.

  - TOOL_RES

    Provides a means of extracting string resources from a resource file with the goal of making PL/SQL code more portable by isolating all textual data in the resource file.

  The following packages are used only internally by Oracle Reports. There are no subprograms available for external use with these packages.

  - ORA_DE

    Contains constructs used by Reports for private PL/SQL services.

  - STPROC

    Calls subprograms stored in the database. Calls to this package are automatically generated.

  - JNI

    Facilitates calling Java from PL/SQL.

  ##### See also

  Topics for each of the Tools built-in packages under in the Reference > PL/SQL Reference > Built-in Packages section of the Reports Builder online help

  ### 2.6.12 About triggers

  Triggers check for an event. When the event occurs they run the PL/SQL code associated with the trigger.

  Report triggers are activated in response to report events such as the report opening and closing rather that the data that is contained in the report. They are activated in a predefined order for all reports.

  Format triggers are executed before an object is formatted. A format trigger can be used to dynamically change the formatting attributes of the object.

  Validation triggers are PL/SQL functions that are executed when parameter values are specified on the command line and when you accept the Runtime Parameter Form.

  Database triggers are procedures that are stored in the database and implicitly executed when a triggering statement such as INSERT, UPDATE, or DELETE is issued against the associated table.

  #### 2.6.12.1 About report triggers

  Report triggers execute PL/SQL functions at specific times during the execution and formatting of your report. Using the conditional processing capabilities of PL/SQL for these triggers, you can do things such as customize the formatting of your report, perform initialization tasks, and access the database. To create or modify a report trigger, use Report Triggers in the Object Navigator. Report triggers must explicitly return TRUE or FALSE. Reports Builder has five global report triggers (you cannot create new global report triggers):

  - Before Report trigger

  - After Report trigger

  - Between Pages trigger

  - Before Parameter Form trigger

  - After Parameter Form trigger

  For information about these triggers, see the Reference section of the Reports Builder online help.

  ##### Usage notes

  The Before Report trigger fires before the report is executed but after the queries are parsed.

  You can think of order in this way:

  1. Queries are parsed.

  2. Before Report trigger fires.

  3. Report is executed (i.e., fetch data+format output.)

  Consistency is guaranteed if you use DML, DDL in (or before) the After Form Trigger. However, consistency is not guaranteed in the Before Report trigger, since Reports Builder may have to start work on data cursors before that trigger based on the definition of the report. Before the Before Report trigger, Reports Builder describes the tables involved and opens cursors. Any change to the tables after that will not be seen by the report.

  ##### See also

  Section 3.13.3.5, "Creating a report trigger"

  Section 3.13.3.6, "Deleting a report trigger"

  #### 2.6.12.2 About format triggers

  A format trigger is a PL/SQL function executed before an object is formatted. A trigger can be used to dynamically change the formatting attributes of the object. For example, you can use a format trigger to cause a value to display in bold if it is less than zero. Another example is to use a format trigger to use scientific notation for a field if its value is greater than 1,000,000.

  A format trigger can fire multiple times for a given object, whenever Reports Builder attempts to format the object. Consider the case where Reports Builder starts to format the object at the bottom of a page. If the object does not fit on the page, Reports Builder stops formatting and reformats on the following page. In this case, the format trigger will fire twice. It is therefore not advisable to do any kind of "persistence" operation, such as logging, in this trigger.

  The Reports Builder SRW built-in package contains PL/SQL procedures with which you can quickly change the format attributes of an object. These include procedures to:

  - change the border pattern and color of an object

  - change the interior pattern and color of an object

  - change the font size, style, weight, spacing, and justification of a field or boilerplate text

  - change the format mask of a field

  - access a field's value

  #### Examples

  See the topic "Format trigger" in the Reference section of the Reports Builder online help.

  ##### See also

  Section 3.13.4.1, "Creating or editing a format trigger"

  #### 2.6.12.3 About validation triggers

  Validation triggers are PL/SQL functions that are executed when parameter values are specified on the command line and when you accept the Runtime Parameter Form.

  Note: For JSP-based Web reports, the Runtime Parameter Form displays when you run a report in Reports Builder, but does not display in the runtime environment. If parameters are not specified on the Runtime Parameter Form, the validation trigger returns false and generates error message `rep-546 Invalid Parameter Input error`. Thus, you need to provide the parameters in an alternate way, as described in Section 1.9.4, "About Parameter Forms for Web reports".

  Validation triggers are also used to validate the Initial Value property of the parameter. Depending on whether the function returns TRUE or FALSE, the user is returned to the Runtime Parameter Form.

  #### Example

  See the topic "Validation trigger" in the Reference section of the Reports Builder online help.

  ##### See also

  Section 3.11.4, "Validating a parameter value at runtime"

  #### 2.6.12.4 About database triggers

  Database triggers are procedures that are stored in the database and implicitly executed when a triggering statement such as INSERT, UPDATE, or DELETE is issued against the associated table. Triggers can be defined only on tables, not on views. However, triggers on the base table of a view are fired if an INSERT, UPDATE, or DELETE statement is issued against a view.

  A trigger can include SQL and PL/SQL statements that execute as a unit, and can invoke other stored procedures. Use triggers only when necessary. Excessive use of triggers can result in cascading or recursive triggers. For example, when a trigger is fired, a SQL statement in the trigger body potentially can fire other triggers.

  By using database triggers, you can enforce complex business rules and ensure that all applications behave in a uniform manner. Use the following guidelines when creating triggers:

  - Use triggers to guarantee that when a specific operation is performed, related actions are performed.

  - Use database triggers only for centralized, global operations that should be fired for the triggering statement, regardless of which user or database application issues the statement.

  - Do not define triggers that duplicate the functionality already built into Oracle. For example, do not define triggers to enforce data integrity rules that can be easily enforced using declarative integrity constraints.

  - Limit the size of triggers (60 lines or fewer is a good guideline). If the logic for your trigger requires much more than 60 lines of PL/SQL code, it is better to include most of the code in a stored procedure, and call the procedure from the trigger.

  - Be careful not to create recursive triggers. For example, creating an AFTER UPDATE statement trigger on the EMP table that itself issues an UPDATE statement on EMP causes the trigger to fire recursively until it has run out of memory.

  For additional information about how triggers are used in applications, see the Oracle9i Application Developer's Guide. See the Oracle9i Concepts Manual for more information about the different types of triggers.

  ##### See also

  Section 3.13.3.7, "Creating a database trigger"

  ## 2.7 Templates

  The topics in this section discuss the use of templates in Reports Builder.

  - About templates

  - About template attributes

  - About applying templates

  - About inheritance in templates

  - About the Template Editor

  ### 2.7.1 About templates

  Templates define common characteristics and objects that you want to apply to multiple paper-based reports. For example, you can define a template that includes the company logo and sets fonts and colors for selected areas of a report.

  When you use the Report Wizard to create a paper-based report, you use the Templates page of the wizard to apply a template (.tdf file) to the report. The Templates page lists the default templates, as well as any templates that you have created.

  Note: If the list of templates does not appear, make sure that the REPORTS_PATH environment variable includes the location of the templates (e.g., ORACLE_HOME`\reports\templates`).

  When you choose a template, objects in the margin area of a template are imported into the same locations in the current report section, overwriting any existing objects. The characteristics (formatting, fonts, colors, etc.) of objects in the body area of the template are applied to objects in the body area of the current report section. Any template properties, parameters, report triggers, program units, and attached libraries you have defined are also applied. You can apply different templates to each section of the report. However, if you are applying one of the default templates, you cannot combine two report blocks that use different default templates in a single report. All of your report blocks in any one report must use the same default template.

  If you later apply another template to a report, the existing template objects will be deleted in the current report section.

  ##### See also

  Section 3.12, "Define a Template"

  ### 2.7.2 About template attributes

  In the Layout Body area of a template, you can define Default and Override attributes under the following Object Navigator nodes:

  - Frames, which contains the following:

    - a Section Frame node, which defines attributes for the parent frame surrounding the currently selected section.

    - a Headings Frame node, which defines attributes for the parent frame surrounding the column headings.

    - a Fields Frame node, which defines attributes for the parent frame surrounding the fields.

    - a Summaries Frame node, which defines attributes for the parent frame surrounding the summaries (totals).

  - Field Labels/Headings, which contains the following:

    - a Character node, which defines attributes for the labels or column headings of character fields.

    - a Number node, which defines attributes for the labels or column headings of number fields.

    - a Date node, which defines attributes for the labels or column headings of date fields.

  - Fields, which contains the following:

    - a Character node, which defines attributes for character fields.

    - a Number node, which defines attributes for number fields.

    - a Date node, which defines attributes for date fields.

  - Summary Labels, which contains the following:

    - a Character node, which defines attributes for the labels of summaries on character fields.

    - a Number node, which defines attributes for the labels of summaries on numeric fields.

    - a Date node, which defines attributes for the labels of summaries on date fields.

  - Summaries, which contains the following:

    - a Character node, which defines attributes for summaries on character fields.

    - a Number node, which defines attributes for summaries on number fields.

    - a Date node, which defines attributes for summaries on date fields.

  #### Default attributes

  The Default node in the Object Navigator defines the default visual attributes (formatting, fonts, colors, etc.) for all report styles. If you want to define attributes for individual report styles, you do so under the Override node. When you apply a template to a report, all Default attributes are applied to the report, except for attributes that are localized under the Override node.

  #### Override attributes

  Under the Override node in the Object Navigator, you can define attributes for individual report styles. Each report style contains one or more sections that map to groups in the report:

  Single-section report styles: Tabular, Form, Mailing Label, Form Letter

  Multiple section report styles: Group Left, Group Above, Matrix, Matrix with Group

  For the report styles that support multiple groups, you can create additional sections as needed. Sections are mapped to groups as follows:

  Same number of groups as sections: one-to-one mapping (the first section is mapped to the first group, the second section to the second group, and so on).

  More groups than sections: one-to-one mapping until the next-to-last section. Then, all subsequent groups are mapped to the next-to-last section, and the last group is mapped to the last section. If only one section exists, all groups are mapped to it.

  More sections than groups: one-to-one mapping until the next-to-last group. Then, the last group is mapped to the last section.

  ##### See also

  Section 3.12.2, "Defining default template attributes"

  Section 3.12.3, "Defining override template attributes"

  ### 2.7.3 About applying templates

  When you apply a template to a report, all of the following objects, properties, and attributes from the template are applied to the current report section:

  - parameters and their validation triggers

  - physical page size

  - logical page size

  - character/bitmap mode

  - margin position

  - panel print order

  - Maximum Horizontal Body Pages property

  - Maximum Vertical Body Pages property

  In addition, all of the layout objects in the margin of the template are copied into the same location in the current report section.

  ##### Usage notes

  - The template will be applied to the current section of the report (the section displayed in the Paper Layout view) by default. If no section is displayed, the template will be applied to the Main Section of the report by default. If you select the node for the entire report in the Object Navigator, the template will be applied to the Main Section of the report by default. To apply the template to a specific section of your report, select the node for that section in the Object Navigator.

  - You can apply different templates to each section of the report. However, if you are applying one of the default templates, you cannot combine two report blocks that use different default templates in a single report. All of your report blocks in any one report must use the same default template.

  ##### See also

  Section 3.12.4, "Applying a template to a report"

  ### 2.7.4 About inheritance in templates

  In templates, Sections, Frames, Fields, Labels, Headings, and Summaries properties all may inherit their values.

  #### Default properties

  The Default properties inherit the values preset by Reports Builder. When a property is set to its default Reports Builder value, the icon next to it in the Property Inspector is a small circle. Default properties become localized when you change their values, or select them and click the Localize Property button in the toolbar. When a property is localized, the icon next to it changes to a square. To return the properties to their inherited values, select the properties and click the Inherit Property button in the toolbar.

  #### Override properties

  The properties of Override Sections inherit their values from the Default properties. When a property inherits from a Default property, the icon next to it in the Property Inspector is an arrow. Properties in the Override Sections become localized when you change their values, or select them and click the Localize Property button in the toolbar. When a property is localized, the icon next to it changes to an arrow with a red cross through it. To return the values of properties in the Override Sections to their inherited values, select the properties and click the Inherit Property button in the toolbar.

  ### 2.7.5 About the Template Editor

  The Template Editor is a work area in which you can define objects and formatting properties for your templates. It is similar to the Paper Layout view of the Report Editor. You can create, delete, and modify objects (e.g., page numbers, text, and graphics) in the margin area. You cannot create and delete objects in the body area, but you can modify the properties of body objects in the Property Inspector (Tools > Property Inspector).

  The Report Style drop-down list allows you to view the layout for a selected report style. To define default settings for all report styles, you can choose Default from the Report Style drop-down list. To make changes for an individual report style, you can select that report style from the Report Style drop-down list to specify settings that override the default.

  #### Access

  You can access the Template Editor in the following ways:

  When creating a new template:

  - Choose File > New > Template.

  - In the Object Navigator, click the Templates node, then click the Create button in the toolbar.

  When displaying an existing template:

  - From the Window menu, choose a window displaying Template Editor Paper Layout view.

  - In the Object Navigator, double-click the view icon next to the Paper Layout node for a template.

  ## 2.8 Output Formats and Capabilities

  The topics in this section discuss the various output formats and capabilities in Reports Builder.

  - About format order

  - About batch reporting

  - About report distribution

  - About pluggable destinations

  - About event-driven publishing

  - About switching the printer tray

  - About XML in reports

  - About HTML output

  - About PDF output

  - About RTF output

  - About delimited output

  - About text output

  - About creating an ASCII (character-mode) report

  ### 2.8.1 About format order

  In prior releases, Oracle Reports formatted the sections of a report in sequential order: Header section, followed by Main section, followed by Trailer section. This release introduces the capability to change the order in which the three sections of a report are formatted.

  Note: Regardless of the order in which the report sections are formatted, the output order is unchanged: Header section first, then Main section, then Trailer section.

  The format order can be set in either of the following ways:

  - Format Order of Sections property

  - SRW.SET_FORMAT_ORDER built-in procedure (if defined, overrides the Format Order of Sections property setting)

  This feature is useful for formatting any report section first to retrieve information that is known only at the time of formatting, such as page numbers, then using that information in the formatting of a previous section.

  For example, to create a table of contents (TOC) for a report, you can format the Main section first and use report triggers to build a table containing the TOC entries. When the first element for the TOC is formatted, a trigger fires and creates a row in the TOC table containing the TOC entry and the page number. After the Main section has completed formatting, the format order setting can define that the Header section is formatted next. The Header section can contain a report block based on the TOC table. After formatting, you can output your report with a TOC (the Header section), followed by the report body (the Main section), followed by the Trailer section.

  For the steps to create a TOC for a report, see the example reports in Chapter 34, "Building a Paper Report with a Simple Table of Contents and Index" and Chapter 35, "Building a Paper Report with a Multilevel Table of Contents".

  A note about page numbering:

  The page numbering of a report follows the format order. For example, in a report with a Header section of 2 pages, a Main section of 8 pages, and a Trailer section of 3 pages, with Format Order set to Main-Trailer-Header, the page numbering will be as follows in the report output: 12, 13 (Header pages, which were formatted last), 1, 2, 3, 4, 5, 6, 7, 8, (Main pages, which were formatted first) 9, 10, 11(Trailer pages, which were formatted second).

  ### 2.8.2 About batch reporting

  If you do not need to examine report output in the Previewer (e.g., you may have to generate large volumes of output from a fully-tested report or run several reports in succession), you can run your report in batch using `rwrun`. This leaves you free to pursue other tasks while your reports are running.

  You can run reports in batch mode from the command line, or use a command file to specify arguments. A command file can save you a great deal of typing if you wish to run several reports using the same set of arguments.

  You can also use the Reports Server to batch process reports by specifying BACKGROUND=YES on the command line (valid for `rwclient`, `rwcgi`, or `rwservlet`) to run reports asynchronously (the client sends the call to the server, then continues with other processes without waiting for the report job to complete; if the client process is killed, the job is canceled).

  ##### See also

  Section 3.7.2, "Running a report from the command line"

  Section 3.7.3, "Running a report using a command file"

  The Reference > Command Line section of the Reports Builder online help (for information about BATCH and BACKGROUND)

  ### 2.8.3 About report distribution

  Report distribution enables you to design a report that can generate multiple output formats and be distributed to multiple destinations from a single run of the report. You can create distributions for an entire report, and for individual sections of the report. For example, in a single run of a report, you can generate HTML output, send a PostScript version to the printer, and also e-mail any or all sections of the report to a distribution list.

  You can define the distribution for a report in any of the following ways:

  - using XML, as described in the chapter "Creating Advanced Distributions" in Oracle Application Server Reports Services Publishing Reports to the Web, available on the Oracle Technology Network Oracle Reports Documentation page (http://otn.oracle.com/docs/products/reports/content.html).

  - in the Distribution dialog box to define a distribution list for the entire report and/or any report section.

    Note: To display the Distribution dialog box: In the report or section Property Inspector, under the Report node, click the Distribution property value field

  - on the command line, via the DESTINATION keyword that specifies a DST file or XML file.

    Note: The DST file method is supported for backward compatibility; the preferred and recommended method of distributing reports is via XML or the Distribution dialog box.

  For detailed information about when you'd use the report-level vs. section-level distribution, see Chapter 36, "Bursting and Distributing a Report". This chapter also covers distribution based on a repeating section, then e-mail those sections based on the distribution.xml.

  To distribute a report, you first define the distribution, then enable the distribution, as described in Section 3.7.11, "Distributing a report to multiple destinations".

  ##### Usage notes

  - You cannot mix character mode and bit-mapped output in one report. The MODE parameter can only be set to one value per the entire report (DEFAULT, BITMAP, or CHARACTER). As a result, you cannot have both within one report.

  #### 2.8.3.1 About the DST file

  As an alternative to defining the distribution for a report or report section in the Distribution dialog box, you can also create a DST file and specify its name on the command line via the DESTINATION keyword to distribute the report.

  Note: This method is supported for backward compatibility; the preferred and recommended method of distributing reports is via the Distribution dialog box or using XML, as described in the chapter "Creating Advanced Distributions" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page (http://otn.oracle.com/docs/products/reports/content.html).

  If a DST file is specified on the command line, the distribution that it defines overrides the distribution defined using the Distribution dialog box.

  Note: If you trace report distribution to identify distribution errors (see Section 3.14.19, "Tracing report distribution"), the trace file format is very similar to the DST file, so you can cut and paste to generate a DST file from the trace file.

  The format of each line of a DST file is as follows:

      dist_ID: output_def

  where

  `dist_ID` is an identifier for a distribution destination.

  `output_def` is a series of `rwrun` or `rwclient` command line keywords that specify the distribution definition. In addition, the following parameter is valid:

  LEVEL specifies the scope of the distribution.

  Values for LEVEL

  `REPORT` means that the distribution applies to the entire report.

  `Header_Section` means that the distribution applies to the header section only.

  `Main_Section` means that the distribution applies to the main (body) section only.

  `Trailer_Section` means that the distribution applies to the trailer section only.

  Default

  `REPORT`

  #### Example

  The definition in this example sends report output to an HTML file, 3 copies of the main section to a printer, and the header section to a PDF file.

      ;dst file (specified via the DESTINATION keyword on the command line)
      DEST1: DESNAME=testdst1.HTM DESTYPE=file
      DESFORMAT=HTML COPIES=1 LEVEL=Report
      DEST2: DESNAME=\\luna\2op813 DESTYPE=printer
      DESFORMAT=BITMAP COPIES=3
      LEVEL=Main_Section
      DEST3: DESNAME=SECTION1.pdf DESTYPE=file
      DESFORMAT=pdf COPIES=1
      LEVEL=Header_Section

  ##### See also

  Section 2.1.2, "About report sectioning and sections"

  ### 2.8.4 About pluggable destinations

  Pluggable destinations can be used to distribute any content that an engine (not only the Oracle Reports engine) has created in the Reports Server's cache. Oracle Reports provides several out-of-the-box destinations:

  - Web

  - printer

  - e-mail

  - file

  - OracleAS Portal

  You can also define access to your own custom destination by using the Oracle Reports Java APIs to implement a new destination component in the Reports Server. You can choose for your jobs to use an out-of-the-box destination or your customized destination to determine the destination for the output in the cache.

  For information and steps to implement and register a destination class, then use the destination with Oracle Reports, see the FTP Destination tutorial available via the Oracle Reports Plugin Exchange on OTN (http://otn.oracle.com/products/reports/pluginxchange/content.html).

  ##### See also

  "Configuring Destinations for OracleAS Reports Services" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page (http://otn.oracle.com/docs/products/reports/content.html).

  ### 2.8.5 About event-driven publishing

  Event-driven publishing enables you to set up a report to execute when a certain action has been performed. For example, when an employee submits an expense report, new data is being inserted into the database. When this insert event (e.g., a database trigger or an Advanced Queuing (AQ) message) occurs, a report is sent to the employee's manager via their portal page or e-mail notifying them to approve/reject this expense report.

  For detailed information, refer to the chapter "Event-Driven Publishing" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page (http://otn.oracle.com/docs/products/reports/content.html).

  ### 2.8.6 About switching the printer tray

  Using the Before Report, Between Pages, or format triggers, you can switch to different printer trays as your report formats. This allows you to easily print pages of the same report on different sheets of paper (e.g., letterhead, forms, colored).

  You can determine the names of the printer trays defined for your printer in the Page Setup dialog box, then use SRW.SET_PRINTER_TRAY to set the printer tray as desired.

  ##### See also

  Section 3.7.16.5, "Switching the printer tray"

  ### 2.8.7 About XML in reports

  Oracle Reports uses XML (Extensible Markup Language) in the following ways:

  - XML tags are used to define Web-based reports (see the topic "Oracle Reports XML tags" in the Reference section of the Reports Builder online help).

  - XML is used to define tag-delimited, structured information.

  - XML is a supported pluggable data source (PDS). For more information, see Chapter 41, "Building a Report with an XML Pluggable Data Source".

  XML is a form of encoding text formats that can be read by many different applications. The XML tags can be used to output information or as a basis for building a pluggable data source to exchange electronic data with a third-party application (EDI).

  You may change the XML properties that control XML output for your report at three levels: report, group, and column. Note that in any Reports Builder-generated XML file, your output mimics the data model, structured by groups and columns. For information on how to view your changes in XML output, see Section 3.7.7, "Generating XML output".

  For detailed information about using XML for report distribution and customizing reports through XML, see the chapters "Creating Advanced Distributions" and "Customizing Reports with XML" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page (http://otn.oracle.com/docs/products/reports/content.html).

  ##### See also

  Section 3.7.7, "Generating XML output"

  Section 3.7.1, "Running and dispatching a report from the user interface"

  The XML PDS section of the Reports Builder online help.

  ### 2.8.8 About HTML output

  Reports Builder can generate report output to Hypertext Markup Language (HTML) and Hypertext Markup Language with a Cascading Style Sheet (HTMLCSS) files, containing the formatted data and all objects. HTML is a form of encoding text formats that can be read by many different Web page developing software packages, such as Microsoft Front Page, and Web browsers. You can use the software's editing and graphics features to modify and enhance your report output. When you generate your report output to an HTML or HTMLCSS file, you can distribute the output to any HTML destination, including e-mail, printer, OracleAS Portal, and Web browser.

  Note: This topic discusses the HTML generated when you run a paper-based report to an HTML or HTMLCSS file. This is completely separate from HTML that might be generated when you run a JSP-based Web report (when you click the Run Web Layout button in the toolbar, or choose Program > Run Web Layout).

  ##### Usage notes

  - You can preview your HTML or HTMLCSS report output in your Web browser by choosing File > Preview Format > Paginated HTML (or Paginated HTMLCSS).

  - Bookmarks cause multiple HTML files to be created. One master file is created with two frames: one for bookmarks and one for the report output. One HTML file is created for each of these frames. The master document filename is the name specified in the DESNAME parameter. The bookmark filename is `desname` `b.htm`. The report output filename is `desname` `d.htm`.

  - Linked images, image fields, and graphs in a report cause GIF files to be created and referenced from the HTML document. Note that even if the linked boilerplate or image field refers to an external GIF file, a new GIF file is generated.

  - If an image is stored in the database, one GIF file may be generated for each occurrence of the image in the report. If an image is stored in a file (e.g., imported images, linked boilerplate, or image fields that reference files), only one GIF file will be generated per image regardless of how many times it is repeated in the report.

  - Any GIF image files generated for HTML output have a number sequence (e.g. `desname` `0.gif`... `desname` `17.gif`).

  - A comment block in the master document contains the names of all of the files that are associated with the master document.

  - HTML has seven sizes for text. The font sizes in the report are mapped according to the following table. Note that the user can override the size specified in the HTML file from their browser.

    ##### Table 2-1 Report to HTML font sizes

    Report font size | HTML font size
    --- | ---
    less than 8 | 1
    8 through 9 | 2
    10 through 12 | 3
    13 through 15 | 4
    16 through 20 | 5
    21 through 30 | 6
    more than 30 | 7

    Note: If the font used in the report is non-proportional, TeleType mode is turned on for the generated HTML file.

  - HTML does not have the concept of a page. A separator line is placed between each page of the report. Depending upon the browser, you may or may not need to scroll to see the entire report page. Furthermore, if you print the HTML document from your browser, the printer will not necessarily print the separator lines at the bottom of each page. If you do not want the separator line or you want to use a different separator line, you can use SRW.SET_AFTER_PAGE_HTML to change it.

  - For HTMLCSS, graphics and text can be overlapped.

  - Once you have generated your report to an HTML or HTMLCSS file, the data model and looping tags are removed and replaced with the data. You can open the HTML or HTMLCSS file in Reports Builder, but it will be a static text file and not a report.

  - For information about paginating HTML or HTMLCSS output, see Section 2.8.8.1, "About HTML page streaming".

  ##### Restrictions

  - Objects cannot overlap one another. For example, you could not have text on top of an image.

    - If objects overlap slightly (two characters or less), then the underneath object is truncated to prevent overlap.

    - If objects overlap significantly (or one is completely on top of the other), then the underneath object is removed altogether. In this case, any linking information of the removed object is transferred using the same rules as if it were a frame (see the rules about frames below).

    - Text always takes precedence over horizontal lines, regardless of which is on top. This prevents the line underneath a column label from eliminating the label text.

  - When multiple output files are generated (e.g., when bookmarks are used), any file except the master file will be overwritten without confirmation. For example, GIF files and bookmark files would be overwritten without prompting.

  - Report frames are not visually represented in the HTML output. Any fill or border attributes of frames do not appear in HTML output.

  - If the frame in a report is the target of a link or a bookmark, that attribute is transferred to the visible object nearest to the upper left corner of the frame in HTML output. If the frame object is a hyperlink, that attribute will be transferred to all the child (interior) objects that are not hyperlinks. If the hyperlink attribute cannot be transferred to the child objects, the frame's hyperlink is lost.

  - The only drawn object supported in HTML is a solid, black, horizontal line. The line width specified in the report may be honored depending upon the browser. All other drawn objects (e.g., rectangles or circles) in the report layout will not show up in the HTML output. Space for these drawn objects is reserved, but there is no visible representation in the HTML output.

  - Background (fill) and border (line) colors/patterns for text are not available in HTML. Bold, italic, underline, and foreground (text) color are supported if the browser supports them.

  - The PDF action attribute is ignored for HTML output.

  - Any browser customizations that have been made will affect how the generated HTML is displayed.

  ##### See also

  Section 1.2.2, "About Web reports"

  Section 2.2.3, "About Web links for HTML output"

  Section 3.7.5, "Generating HTML or HTMLCSS output"

  #### 2.8.8.1 About HTML page streaming

  HTML page streaming enables you to display individual pages of your HTML/HTMLCSS report output in your Web browser, without having to download the entire report. From the first page of the report, you can navigate to any page in the rest of the report. When you click a bookmark or hyperlink with a destination:

  - within the report, the frame that contains the current page will update with the destination page.

  - outside the report, the entire base frame (including the bookmark frame, the page, and the navigation frame) will reload.

  #### Navigation controls

  You can specify the navigation controls script for a report in either of the following ways:

  - via PL/SQL (SRW.SET_PAGE_NAVIGATION_HTML in a Before Report trigger)

  - in the Report Property Inspector via the Page Navigation Control Type and Page Navigation Control Value properties

  #### Output file names

  With HTML page streaming, each page is formatted as a separate HTML document. If your HTML file is named myreport.htm and there are no bookmarks, the new files are named as follows:

  - myreport.htm (for the base frame)

  - myreportb.htm (for the bookmark file, present only if bookmarks are used in the HTML files)

  - myreport_1.htm through myreport_n.htm (for the pages)

  - myreportj.htm (for the navigation JavaScript)

  #### Scope of HTML output

  To specify HTML to be displayed on only the first (header) or last (footer) pages of your report, set the Before Report or After Report properties or use the SRW.SET_BEFORE_REPORT_HTML or SRW.SET_AFTER_REPORT_HTML PL/SQL procedures. To specify global HTML to apply to the entire report, such as background colors or images, set the Before Page properties or SRW.SET_BEFORE_PAGE_HTML PL/SQL procedure. The Reports Builder-generated HTML logo appears only on the last page of your report.

  #### Enabling page-streamed output

  To enable page streaming when you format your report as HTML or HTMLCSS output, you must specify PAGESTREAM=YES on the command line. This option can not be set via the Reports Builder user interface.

  ##### See also

  Section 3.7.15.5, "Displaying individual pages of HTML report output"

  Section 3.6.7.1.12, "Adding navigation controls for HTML page-streamed output using the Property Inspector"

  Section 3.6.7.2.11, "Adding navigation controls for HTML page-streamed output using PL/SQL"

  ### 2.8.9 About PDF output

  Reports Builder can generate report output to PDF files, containing the formatted data and all objects. When you generate your report output to a PDF file, you can distribute the output to any PDF destination, including e-mail, printer, OracleAS Portal, and Web browser.

  Note: Oracle Reports does not support Windows UDC for PDF output. For the user-defined characters to be printed and/or rendered, all the glyphs must be within a single TTF or TTC file.

  For detailed information about PDF enhancements and capabilities in Oracle Reports, which include compression, font aliasing, font subsetting, font embedding and accessibility tags, refer to the chapter "PDF in Oracle Reports" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page (http://otn.oracle.com/docs/products/reports/content.html).

  ##### Usage notes

  - You can preview your PDF report output in your Web browser by choosing File > Preview Format > PDF.

  - If you are building a multibyte report for multi-byte languages, such as Chinese or Japanese, and you need to alias the font in PDF output, you need the CID fonts named within the Acrobat 4.0 packs. Otherwise, you do not need the CID fonts in the Acrobat 4.0 packs.

  - Graphics and text can be overlapped.

  - The foreground color of the object will be used as the fill color (regardless of a specified pattern).

  ##### Restrictions

  - For PDF output, the bit-mapped drivers (e.g., PostScript) for the currently selected printer are used to produce the output.

  ##### See also

  Section 1.2.2, "About Web reports"

  Section 2.2.4, "About Web links for PDF output"

  Section 3.7.6, "Generating PDF output"

  ### 2.8.10 About RTF output

  Reports Builder can generate report output to Rich Text Format (RTF) files, containing the formatted data and all objects. RTF can be read by many different word processing software packages, such as Microsoft Word. You can use the software's editing and graphics features to modify and enhance your report output. When you generate your report output to an RTF file, you can distribute the output to any RTF destination, including e-mail, printer, OracleAS Portal, and Web browser.

  ##### Usage notes

  - Graphics and text can be overlapped.

  - Text can only be rotated by 90-degree variations.

  - As with PDF output, the foreground color of the object will be used as the fill color (regardless of a specified pattern).

    Note: When you view the report in Microsoft Word in Office 95, you must choose View > Page Layout to see all the graphics and objects in your report.

  ##### See also

  Section 3.7.8, "Generating RTF output"

  Section 3.7.1, "Running and dispatching a report from the user interface"

  ### 2.8.11 About delimited output

  Reports Builder can generate report output that includes a delimiter to delimited files (e.g., files that contain comma-separated or tab-separated data), which are easily imported into spreadsheets or for use with word processors.

  Oracle Reports provides two choices for generating delimited output:

  - Delimited

  - DelimitedData (for use when you have problems running large volume reports with Delimited)

  You can specify a delimiter (a character or string of characters) to separate the data (boilerplate or field objects) in your report output in either of the following ways:

  - on the command line via the DELIMITER keyword.

  - in the Delimited Output dialog box or DelimitedData Output dialog box (displayed via File > Generate to File > Delimited or DelimitedData).

  When you generate delimited output, you can further distinguish the cells by using a cell wrapper. A cell wrapper can consist of any series of characters, such as a comma or parentheses.

  For example, if the data in your report output include the same character as the delimiter (e.g. a comma), you can use the parentheses cell wrapper to distinguish each cell:

      (1,000,000),(3,6000),(543),(2,003,500)...

  #### Running macros on delimited output in Microsoft Excel

  You can run predefined macros on report output generated in delimited (.csv) format when opening it using Microsoft Excel. This is similar to generating an Excel file on a predefined template with embedded macros to manipulate the worksheet. This is useful if you intend to use Excel to open a .csv file generated by Oracle Reports, and further manipulate it on Windows clients.

  To create and load macros when opening a .csv file using Microsoft Excel:

  1. In Microsoft Excel, use the record macro functionality (choose ToolsMacroRecord New Macro) to create the macros in a new worksheet.

  2. Save the macros in `personal.xls`, in the `root_directory``\``operating_system``\Profiles\``user_name``\Application Data\Microsoft\Excel\Xlstart` or `root_directory``\Program Files\Microsoft Office\Office\XLStart` directory.

     Note: You can save the macro in `personal.xls` via the Record Macro dialog box or you can manually add your macros to `personal.xls`.

  3. Choose Window > Unhide to ensure that `personal.xls` is opened by default whenever you use Excel, allowing you to use the macros you created and saved.

     Note: You can also specify an additional startup folder by choosing Tools > Options; on the General tab, type the folder path in Alternate startup file location. If a file with the same name is in both the `XLStart` folder and the additional startup folder, the file in the `XLStart` folder opens. Microsoft Excel will attempt to open every file in the `XLStart` and the additional startup folder, so make sure you specify an empty folder or a folder that contains only files that Excel can open.

  4. Save the template with embedded macros in one of the startup folders. Now, when you open your .csv file generated by Oracle Reports using Excel, you can run your macros on your report data (e.g., format data, perform calculations/manipulations, and so on).

  ##### Usage notes

  When you generate delimited output, the data displays according to the positions of the objects in the Paper Layout view.

  - If you place A above or to the left of B (where A and B are any boilerplate or field objects) Reports Builder displays each instance of A before each instance of B in every line of output.

  #### Figure 2-8 Delimited output of A above B

  Text description of the illustration delim1.gif

  - If you create a frame that contains a boilerplate object (A) and encloses a repeating frame that contains a field object (B), each instance of A displays with each instance of B.

  #### Figure 2-9 Delimited output of frame enclosing repeating frame

  Text description of the illustration delim2.gif

  - In the previous layout, if you add another frame that contains a boilerplate object (C) and encloses another repeating frame that contains a field object (D), A displays for every instance of B, and then C displays for every instance of D.

  #### Figure 2-10 Delimited output of two frames enclosing repeating frames

  Text description of the illustration delim3.gif

  - If you create a matrix in your report, be sure to align your objects carefully according to the grid in the Layout Model view. If the objects are not aligned, Reports Builder may interpret the extra space as an extra row or column and disrupt your report output.

  - If you create a boilerplate object outside of a matrix, each instance of the boilerplate repeats with every row (not column) of the matrix. Note that boilerplates contained in the matrix will not be repeated with field objects outside of the matrix.

  #### Figure 2-11 Delimited output of boilerplate outside matrix

  Text description of the illustration delim4.gif

  ##### Restrictions

  If the text file contains a field labeled "ID" (in uppercase) as the first field, you will be unable to open the file in Microsoft Excel. The following delimited output causes an error in Excel:

  ID, name, title, dept, etc.

  If you want to generate delimited output that contains an ID field, try changing the database column name to lowercase, i.e., id, or re-arranging the order of the fields.

  ##### See also

  Section 3.7.9, "Generating delimited output"

  Section 3.7.1, "Running and dispatching a report from the user interface"

  Section 1.2.2, "About Web reports"

  ### 2.8.12 About text output

  Reports Builder can generate report output to text files, containing the formatted data and all objects. When you generate your report output to text, and the running mode is character (MODE=CHARACTER, or MODE system parameter Initial Value property set to Character), the result is pure text output, which can be read by many different applications. If the running mode is bitmap (MODE=BITMAP, or MODE system parameter Initial Value property set to Bitmap), the result is PostScript output, which can be read and rendered only by PostScript-compatible applications (such as a PostScript printer).

  ##### See also

  Section 3.7.10, "Generating text output"

  ### 2.8.13 About creating an ASCII (character-mode) report

  To create a character-mode report, you first create a bit-mapped report, then convert that report to an ASCII (character-mode) report. The process will create a new character-mode version of your bit-mapped report; the original bit-mapped report remains unchanged.

  After conversion, many of your fields and text objects may need to be resized. Also, graphical objects such as images and drawings will not be included in your character-mode report. The following lists summarize what is supported in each output format:

  ##### Table 2-2 Supported items in bit-mapped and character-mode reports

  Bit-mapped | Character-mode
  --- | ---
  Images | Boxes
  Colors | Horizontal lines
  Drawings | Vertical lines
  Ellipses/Circles | ASCII text
  Italicized text | Boldface text
  Diagonal lines | Underlines
  Bit-mapped patterns |
  Multimedia objects |

  ##### See also

  Section 3.5.9, "Creating an ASCII (character-mode) report"

  Section 3.2.5, "Setting properties for an ASCII (character-mode) report"

  Section 3.7.1, "Running and dispatching a report from the user interface"

  ## 2.9 Data Sources

  Oracle Reports allows you to access any data source. See Section 3.15.1, "Accessing non-Oracle data sources".

  The topics in this section discuss information related to accessing other data sources in Reports Builder.

  - About database roles

  - About Oracle Net Services

  - About user exits

  - About the Oracle Call Interface (OCI)

  ##### See also

  The Pluggable Data Sources section of the Reports Builder online help, including the topics:

  - About pluggable data sources

  - Adding a pluggable data source

  - Connecting to a pluggable data source

  - Adding Online Help to a pluggable data source

  - Pluggable data source interface definition

  - Troubleshooting PDS problems

  ### 2.9.1 About database roles

  Database roles provide a way for end users to run reports that query tables to which they do not have access privileges. For example, a report may query a table that includes sensitive information such as salary data, even though the final report does not display this data.

  Database roles are checked in the runtime environment only. If a table requires special access privileges, end users without those privileges cannot run a report that retrieves data from that table. However, if a database role is defined for the report, end users with privileges for that role can run the report using Reports Runtime (`rwrun`).

  Note: To run a report for which a database role is defined, the end user must run the .rdf file, not the .rep file. When running multiple reports, Reports Runtime automatically switches to the role defined for the current report.

  If you try to open a report in Reports Builder for which a database role has been defined, you will be prompted for the role password. Typically, only the report designer and DBA have this information.

  ##### See also

  Section 3.16.1, "Setting a database role"

  ### 2.9.2 About Oracle Net Services

  Oracle Net Services is Oracle's remote data access software that enables both client-server and server-server communications across any network. It supports distributed processing and distributed database capability. Oracle Net Services runs over and interconnects many communication protocols. Oracle Net Services is backwardly compatible with Net8 and SQL*Net.

  ### 2.9.3 About user exits

  In prior releases, user exits provided a way to pass control from Reports Builder to a program you have written, which performs some function, and then returns control to Reports Builder. You could write ORACLE Precompiler user exits, OCI (ORACLE Call Interface) user exits, or non-ORACLE user exits to perform tasks such as complex data manipulation, passing data to Reports Builder from operating system text files, manipulating LONG RAW data, supporting PL/SQL blocks, or controlling real time devices, such as a printer or a robot.

  Now, you can call Java methods using the ORA_JAVA built-in package and the Java Importer. This reduces the need to have user exits in a report and allows for a more open and portable deployment. You may also use the
  ORA_FFI built-in package, which provides a foreign function interface for invoking C functions in a dynamic library. With the availability of these new built-in packages, the use of user exits is being deprecated in Oracle Reports, though makefiles will still be supplied to permit you to continue to work with existing user exits.

  ### 2.9.4 About the Oracle Call Interface (OCI)

  In prior releases, the Oracle Call Interface (OCI) provided a set of standard procedures that you could call in your 3GL programs to call Oracle Reports executables. These procedures (written in C) were shipped with the Reports Builder, Reports Runtime, and Reports Converter executables. For example, to run a Reports Builder report from a Pro*FORTRAN program, you could add a RWCRRB procedure call to your program to run the report using the Reports Runtime executable.

  Now, the OCI is obsolete. Instead, use the rwclient.exe command line interface or the JSP tag library.

  ## 2.10 Debugging Tools

  The topics in this section discuss debugging reports in Reports Builder.

  - About the debugging process

  - About the PL/SQL Interpreter

  - About the Source pane

  - About debug commands in the PL/SQL Interpreter

  - About debug actions

  - About the current execution location

  - About the current scope location

  - About debug levels

  - About modifying code at runtime

  ### 2.10.1 About the debugging process

  Debugging an application is an iterative process in which application errors are identified and corrected. In general, quickly identifying and locating failing code is essential to successfully debugging your application.

  ##### See also

  Section 3.14.1, "Debugging a report"

  Section 3.14.2, "Running a report in debug mode"

  ### 2.10.2 About the PL/SQL Interpreter

  The PL/SQL Interpreter is your debugging workspace, where you can display source code, create debug actions, run program units, and execute Interpreter commands, PL/SQL, and SQL statements.

  By default, two panes are always open in the PL/SQL Interpreter: Source pane and Interpreter pane.

  Debugging features include the following:

  - Direct manipulation debugging: insert debug actions and inspect program data by directly manipulating displayed source text.

  - Dynamic execution feedback: Reports Builder automatically displays and tracks the current PL/SQL source location as program execution is interrupted by debug actions or incrementally advanced during program stepping.

  - Browsing of interrupted program state: once execution has been interrupted, it is possible to browse the current stack, browse and modify variable state, and execute arbitrary PL/SQL statements. All information is accessed symbolically (i.e., by name as opposed to by address or number).

  ### 2.10.3 About the Source pane

  The PL/SQL Interpreter's Source pane displays a read-only copy of the program unit currently selected in the Object Navigator pane.

  The numbers along the left hand margin correspond to the line numbers of the displayed program unit.

  In addition, the symbols described below may appear in the margin.

  ##### Table 2-3 Symbols in the margin of the Source pane

  Symbol | Description
  --- | ---
  | | Specifies the current source location.
  => | Specifies the current scope location.
  - | Specifies the current execution location (if different from the current scope location).
  B(n) | Specifies the location of a breakpoint, where n is the corresponding debug action ID. It appears in the line number column.
  T(n) | Specifies the location of a trigger, where n is the corresponding debug action ID. It appears in the line number column.

  ### 2.10.4 About debug commands in the PL/SQL Interpreter

  The following commands are available when using the PL/SQL Interpreter:

  ##### Table 2-4 PL/SQL Interpreter Commands

  Command | Description
  --- | ---
  CREATE | Creates a new library that can be stored in either the file system or the current database.
  DELETE | Deletes: libraries that reside in the current database library program units program units
  DESCRIBE | Inspects a variable or parameter that is local to the current scope location. The description includes the name, type, and value of the specified local.
  EXPORT | Writes the source of one or more program units to a text file.
  LIST | Displays the source text for program units, triggers, and debug actions.
  LOG | Saves a transcript of PL/SQL Interpreter input and output to the specified log file.
  RESET | Returns control to an outer debug level without continuing execution in the current debug level.
  SET | Changes the current scope location to a specified frame of the stack. You can specify relative motion from the current stack frame to any other frame, or move to a particular subprogram on the stack. There are several ways to invoke SET: select a frame entry in the Object Navigator enter the SET command in the PL/SQL Interpreter
  SHOW | Lists the name, type, and value of all variables and parameters at the current scope location.

  ### 2.10.5 About debug actions

  The PL/SQL Interpreter can be invoked from report code (triggers, user-named program units, libraries, etc.) by creating debug actions in the code. These are instructions which that the execution of PL/SQL program units so they can be monitored.

  Each debug action you create is automatically assigned a unique numeric ID. While debugging, you can refer to this ID to browse, display, or modify a specific debug action via Reports Builder debug commands.

  You can display detailed information about one or more debug actions, including its ID, source location, and whether or not it is enabled. You can temporarily disable specific debug actions and then re-enable them later if necessary.

  There are two types of debug actions: breakpoints and debug triggers.

  Breakpoints suspend execution at a specific source line of a program unit, passing control to the PL/SQL Interpreter.

  Create breakpoints to identify specific debugging regions. For example, create a breakpoint at lines 10 and 20 to debug the code within this region.

  With breakpoints, suspension occurs just before reaching the line on which the breakpoint is specified. At this point, use the PL/SQL Interpreter's features to inspect and/or modify program state. Once satisfied, resume execution with the GO or STEP commands, or abort execution using the RESET command.

  Debug Triggers are a general form of debug action that associate a block of PL/SQL code with a specific source line within a program unit. When a debug trigger is encountered, Reports Builder executes the debug trigger code.

  Create a debug trigger to execute a block of PL/SQL code provided at debug time:

  1. when program execution reaches a single line in a program unit (e.g., the current source location, line 5, line 23, etc.)

  2. every time the PL/SQL Interpreter takes control (i.e., whenever it suspends program execution due to a breakpoint, program stepping, etc.)

  3. at every PL/SQL source line being run

  Debug triggers are especially useful as conditional breakpoints. You can raise the exception DEBUG.BREAK from within a trigger. For example, the debug trigger shown below establishes a conditional breakpoint on line 10 of `my_proc`, which will be reached only if the local NUMBER variable `my_sal` exceeds 5000:

      PL/SQL>line 10 is
      +> IF Debug.Getn('my_sal') > 5000 THEN
      +> Raise Debug.Suspend;
      +> END IF;

  #### 2.10.5.1 About creating a debug action

  You can create debug actions (breakpoints and debug triggers) in the PL/SQL Interpreter in the following ways:

  - choosing Program > Breakpoint or Program > Debugging Triggers on the Reports Builder menu bar while a program unit is open in the PL/SQL Interpreter

  - right-clicking in the Source pane of the PL/SQL Interpreter and choosing Breakpoint or Debug Trigger

  - inserting debug actions in the Object Navigator pane

  - entering commands in the Interpreter pane

  When you create a debug action, attach the breakpoint or debug trigger to a program unit source line that is "executable." A source line is considered executable if it contains one or more statements for which the PL/SQL compiler generates code. For example, source lines containing assignment statements and procedure calls are executable, while source lines containing comments, blank lines, declarations, or the NULL statement are not executable.

  ##### See also

  Section 3.14.3, "Setting a breakpoint"

  Section 3.14.4, "Setting a debug trigger"

  ### 2.10.6 About the current execution location

  The current execution location specifies the next PL/SQL source line to be executed. It corresponds to what is commonly referred to as the program counter, or PC.

  When control passes to the PL/SQL Interpreter while running a program (e.g., when a breakpoint is encountered or following a step operation), the Source pane in the PL/SQL Interpreter automatically displays the source line associated with the current execution location.

  Use the LIST command in the Interpreter pane to manually display the current execution location.

  For example, entering:

      .LIST PC

  will list the current execution location in the Source pane.

  ### 2.10.7 About the current scope location

  The current scope location dictates where the PL/SQL Interpreter looks for local variables and parameters. It corresponds to the current execution location of one of the PL/SQL subprograms on the stack.

  Each time a program unit's execution is interrupted (e.g., by a debug action), the scope location is initialized to the execution location of the subprogram at the bottom of the stack.

  Once execution has been interrupted, you can change the current scope location to another frame on the stack. This enables you to view local variables in another subprogram in the call chain.

  ##### See also

  Section 3.14.14, "Displaying the current scope location"

  ### 2.10.8 About debug levels

  When a debug action interrupts program execution, the PL/SQL Interpreter takes control and establishes what is known as a debug level. At a debug level, you can enter commands and PL/SQL statements to inspect and modify the state of the interrupted program unit as well as resume execution.

  Since any PL/SQL code interactively entered at a debug level may itself be interrupted (for example, by encountering another breakpoint), it is possible for debug levels to nest. To facilitate distinguishing one debug level from another, the levels are numbered. The most deeply nested level is assigned the highest number. Numbering starts at zero with the outermost level.

  The 0th or outermost level is commonly referred to as top level. Top level has no associated program state since it is the outermost level at which program units are originally invoked. When code invoked from top level is interrupted, debug level 1 is established. Similarly, interrupting code invoked from debug level 1 establishes debug level 2, and so on.

  The PL/SQL Interpreter command prompt reflects the current debug level. When the PL/SQL Interpreter enters levels below top level, the prompt includes a prefix containing the current debug level number. For example, the PL/SQL Interpreter command prompt at debug level 1 appears as:

      (debug 1)PL/SQL>

  ### 2.10.9 About modifying code at runtime

  At runtime, you can modify and compile any program unit, menu item command, or trigger that is not on the current stack.

  Note: To modify an item on the current stack, first clear the stack by issuing the RESET command.

  Although runtime code modification is not communicated back to Reports Builder, you can interactively test possible fixes, before returning to implement the eventual fix.

  ##### See also

  Section 3.14.13, "Modifying code at runtime"

| Copyright © 2002, 2003 Oracle Corporation. All Rights Reserved. |
Home | Contents | Index