Oracle8i Client Administrator's Guide Release 2 (8.1.6) for Windows Part Number A73017-01 |
|
This chapter describes topics of interest to application developers on Windows NT.
Specific topics discussed are:
The following table describes where to find the information on developing applications specifically for Windows NT.
To find information on... | Look in the guide... |
---|---|
Oracle's XML products include the XML Parser for Java - Version 1 and Version 2 (which includes an XSLT processor), the XML Class Generator, and the XML Parsers for C, C++, and PL/SQL as well as demos, utilities and sample code designed to illustrate the simplest and most powerful ways to work with XML-formatted data. |
|
Oracle WebDB enables you to publish your data to the Web |
Oracle WebDB Installation Guide and Tutorial Note: WebDB is available on a separate CD-ROM and included with Oracle8i for Windows NT. |
Oracle Application Wizards allow developers to create database applications easily and quickly. They improve ease-of-use and reduce development time by generating much of the code for database connectivity. |
Oracle AppWizard for Microsoft Visual C++ User's Guide for Windows NT |
OLE Automation |
Oracle COM Automation Developer's Guide Oracle Objects for OLE (online Help) for Windows NT |
Oracle8i Client provides Oracle Services for Microsoft Transaction Server (MTS). A Windows NT service called Oracle Service for MTS, permits enhanced deployment of COM components in MTS, using an Oracle database as the resource manager. |
|
Pro*C/C++ and Pro*COBOL--based applications |
Pro*C/C++ Precompiler Getting Started |
Writing external routines and the call specification |
PL/SQL User's Guide and Reference Oracle8i Java Stored Procedures Developer's Guide Oracle8i Application Developer's Guide - Fundamentals The following files in ORACLE_BASE\ORACLE_HOME\RDBMS\EXTPROC:
|
OLE DB |
Additional Information:
Oracle ODBC Driver Release 8.1.6 is included on your CD-ROM. This driver is updated on a regular basis. To download the latest release of this driver, visit the following Web site:
|
This section describes how to create and use external routines on Windows NT.
External routines, previously referred to as external procedures, are functions written in a third-generation language (3GL), such as C, and callable from within PL/SQL or SQL as if they were a PL/SQL routine or function. External routines let you take advantage of the strengths and capabilities of a 3GL programming language in a PL/SQL environment.
The main advantages of external routines consist of the following:
You can use external routines to perform specific processes, such as the following:
Creating and using an external routine would involve the following sequential tasks:
This section describes the installation and configuration of the Oracle8i database and Net8.
Install these products on your Windows NT server:
If you install Net8 Server from your CD-ROM, your server network files are automatically configured to use external routines.
When PL/SQL calls an external routine, the Net8 listener launches a session-specific process called EXTPROC. Through Net8, PL/SQL passes the following information to EXTPROC:
EXTPROC then loads the DLL and invokes the external routine.
If you copy your Oracle7 server network files into your Oracle8i network files directory, you must manually configure the following files for the external routine behavior described previously to occur:
See Chapter 8 of the Net8 Administrator's Guide for instructions.
.Using a 3GL programming language, such as C, you can write functions to be built into DLLs and invoked by EXTPROC. The following is a simple Microsoft Visual C++ example of an external routine:
#include <windows.h> #define NullValue -1 /* This function simply returns the larger of x and y. */ long __declspec(dllexport) find_max(long x, short x_indicator, long y, short y_indicator, short *ret_indicator) { /* It can be tricky to debug DLL's that are being called by a process that is spawned only when needed, as in this case. Therefore try using the DebugBreak(); command. This will start your debugger. Uncomment the line with DebugBreak(); in it and you can step right into your code. */ /* DebugBreak(); */ /* first check to see if you have any nulls */ /* Just return a null if either x or y is null */ if ( x_indicator==NullValue || y_indicator==NullValue) { *ret_indicator = NullValue; return(0); } else { *ret_indicator = 0; /* Signify that return value is not null */ if (x >= y) return x; else return y; } }
After writing your external routine(s) in a 3GL programming language, use the appropriate compiler and linker to build a DLL, making sure to export the external routines, as noted above. See your compiler and linker documentation for instructions on building a DLL and exporting its functions.
After building the DLL, you can move it to any directory on your system. For the example above, you can build the external routine find_max into a DLL called EXTERN.DLL. To build the above example, go to ORACLE_BASE\ORACLE_HOME\RDBMS\EXTPROC and type MAKE.
Once you have built a DLL containing your external routine(s), you must register your external routine(s) with the Oracle8i Database:
C:\> SQLPLUS
SQL> CREATE LIBRARY externProcedures AS 'C:\ORACLE\ORA81\RDBMS\ EXTPROC\EXTERN.DLL';
Do this by writing a PL/SQL subprogram that uses the EXTERNAL clause instead of declarations and a BEGIN...END block. The EXTERNAL clause is the interface between PL/SQL and the external routine. The EXTERNAL clause identifies the following information about the external routine:
To execute an external routine, you must call the PL/SQL program unit (that is, the alias for the external function) that registered the external routine. These calls can appear in any of the following:
In "Step 4: Registering an External Routine", the PL/SQL function PLS_MAX registered the external routine find_max. Follow the steps below to execute find_max:
CREATE OR REPLACE PROCEDURE UseIt AS a integer; b integer; c integer; BEGIN a := 1; b := 2; c := PLS_MAX(a,b); dbms_output.put_line('The maximum of '||a||' and '||b||' is '||c); END;
SQL> EXECUTE UseIt;
This section discusses the following topics:
You must add a parameter to the registry before using Intercartridge Exchange.
To configure Intercartridge Exchange:
C:\> REGEDT32
The Registry Editor window appears.
The Add Value dialog box appears.
where marketing.com is an example of a Web site. (Type the domain name of your real Web site.)
Intercartridge Exchange enables you to use a stored package called UTL_HTTP to make Hypertext Transfer Protocol (HTTP) calls from PL/SQL, SQL, and SQL*Plus statements.
UTL_HTTP can do both of the following:
UTL_HTTP contains two similar entry points, known as packaged functions, that turn PL/SQL and SQL statements into HTTP callouts:
Both packaged functions peform the following tasks:
The declarations to use with both packaged functions are described in the following subsections.
UTL_HTTP.REQUEST uses a URL as its argument and returns up to the first 2000 bytes of data retrieved from that URL.
Specify UTL_HTTP.REQUEST as follows:
FUNCTION REQUEST (URL IN VARCHAR2) RETURN VARCHAR2;
To use UTL_HTTP.REQUEST from SQL*Plus, enter:
SQL> SELECT UTL_HTTP.REQUEST('HTTP://WWW.ORACLE.COM/') FROM DUAL;
which returns:
UTL_HTTP.REQUEST('HTTP://WWW.ORACLE.COM/')
------------------------------------------------------
<html> <head><title>Oracle Corporation Home Page</title> <!--changed Jan. 16, 19 1 row selected.
UTL_HTTP.REQUEST_PIECES uses a URL as its argument and returns a PL/SQL table of 2000 bytes of data retrieved from the given URL. The final element may be shorter than 2000 characters. The UTL_HTTP.REQUEST_PIECES return type is a PL/SQL table of type UTL_HTTP.HTML_PIECES.
UTL_HTTP.REQUEST_PIECES, which uses type UTL_HTTP.HTML_PIECES, is specified as:
type html_pieces is table of varchar2(2000) index by binary_integer; function request_pieces (url in varchar2, max_pieces natural default 32767) return html_pieces;
A call to REQUEST_PIECES can look like the example below. Note the use of the PL/SQL table method COUNT to discover the number of pieces returned; this may be zero or more:
declare pieces utl_http.html_pieces; begin pieces := utl_http.request_pieces('http://www.oracle.com/'); for i in 1 .. pieces.count loop .... -- process each piece end loop; end;
The second argument to UTL_HTTP.REQUEST_PIECES, (MAX_PIECES) is optional. MAX_PIECES is the maximum number of pieces (each 2000 characters in length, except for the last, which may be shorter) that UTL_HTTP.REQUEST_PIECES returns. If provided, that argument is usually a positive integer.
For example, the following block retrieves up to 100 pieces of data (each 2000 bytes, except perhaps the last) from the URL. The block prints the number of pieces retrieved and the total length, in bytes, of the data retrieved.
set serveroutput on / declare x utl_http.html_pieces; begin x := utl_http.request_pieces('http://www.oracle.com/', 100); dbms_output.put_line(x.count || ' pieces were retrieved.'); dbms_output.put_line('with total length '); if x.count < 1 then dbms_output.put_line('0'); else dbms_output.put_line ((2000 * (x.count - 1)) + length(x(x.count))); end if; end; /
which outputs:
Statement processed. 4 pieces were retrieved. with total length 7687
The elements of the PL/SQL table returned by UTL_HTTP.REQUEST_PIECES are successive pieces of data obtained from the HTTP request to that URL.
This subsection describes the exceptions (errors) that can be raised by packaged functions UTL_HTTP.REQUEST and UTL_HTTP.REQUEST_PIECES.
PRAGMA RESTRICT_REFERENCES enables the display of exceptions:
create or replace package utl_http is function request (url in varchar2) return varchar2; pragma restrict_references (request, wnds, rnds, wnps, rnps);
PRAGMA RESTRICT_REFERENCES enables exceptions to be displayed:
create or replace package utl_http is type html_pieces is table of varchar2(2000) index by binary_integer; function request_pieces (url in varchar2,
max_pieces natural default 32767)
return html_pieces; pragma restrict_references (request_pieces, wnds, rnds, wnps, rnps);
The following table describes error messages that may appear.
Do not expect UTL_HTTP.REQUEST or UTL_HTTP.REQUEST_PIECES to succeed in contacting a URL unless you can contact that URL by using a browser on the same computer (and with the same privileges, environment variables, and so on).
If UTL_HTTP.REQUEST or UTL_HTTP.REQUEST_PIECES fails (that is, if it raises an exception or returns an HTML-formatted error message, yet you believe that the URL argument is correct), try contacting that same URL with a browser to verify network availability from your computer.
|
![]() Copyright © 1996-2000, Oracle Corporation. All Rights Reserved. |
|