Oracle8i Java ストアド・プロシージャ開発者ガイド, リリース8.1

Similar documents
Microsoft Word - 430_15_Developing_Stored_Procedure.doc

0315_F1_8iJDBC-SQLJ.PDF

橡実践Oracle Objects for OLE

KeySQL for Microsoft Windows 6.0 : B Copyright 2006, Oracle Corporation. All rights reserved. Printed in Japan. * Oracle Corporation Oracle Co

KeySQL R5.1 Release Note

Oracle Change Management Pack, Oracle Diagnostics Pack, Oracle Tuning Packインストレーション・ガイド リリース2.2

ストラドプロシージャの呼び出し方

1 SQL Server SQL Oracle SQL SQL* Plus PL/SQL 2 SQL Server SQL Server SQL Oracle SQL SQL*Plus SQL Server GUI 1-1 osql 1-1 Transact- SQL SELECTFROM 058

PowerPoint -O80_REP.PDF

BC4J...4 BC4J Association JSP BC4J JSP OC4J

Oracleコール・インタフェース for Windows スタート・ガイド リリース8.1.6

Oracle8 Workgroup Server for Windows NTインストレーション・ガイド,リリース8.0.6

new_logo.eps

new_logo.eps

DB12.1 Beta HandsOn Seminar

データベース認識Webサービス

第 2 章 問合せの基本操作 この章では データベースから情報を検索する際に使用する SELECT コマンド および SELECT コマンドと 同時に使用する句について説明します 1. 問合せとは 2. 基本的な問合せ 3. 列の別名 4. 重複行を一意にする 5. 検索行の絞込み 6. 文字パター

TopLink å SampleClient.java... 5 Ò readallsample() querysample() cachesample() Ç..

tkk0408nari

橡Oracle8i ORDBMS入門

新・明解Java入門

_02_3.ppt

Oracle Enterprise Manager概説 リリース2.2

日本オラクル株式会社

untitled

Windowsユーザーの為のOracle Database セキュリティ入門

Oracle9i

領域サイズの見積方法

_02-4.ppt

はじめに コースの概要と目的条件分岐の方法や複雑な集計の手法など SQL のコーディングの幅を広げるためのテクニックについて説明します また パフォーマンスを考慮した記述方法や正しい結果を取得するための記述方法などについても あわせて説明します 本コースでは 実践的な SQL の記述手法を広く浅く紹

橡ExCtrlPDF.PDF

FileMaker ODBC and JDBC Guide

untitled

橡j_Oracle_whitepaper.PDF

FileMaker 15 ODBC と JDBC ガイド

9iAS_DEV.PDF

FileMaker 16 ODBC と JDBC ガイド

Oracle9i Reportsのチューニング

Oracle9i JDeveloperによるWebサービスの構築

TopLink È... 3 TopLink...5 TopLink åø... 6 TopLink å Workbench O/R ~... 8 Workbench À ~... 8 Foundation Library å... 8 TopL

1,.,,,., RDBM, SQL. OSS,, SQL,,.

Oracle Lite Tutorial

KWCR3.0 instration

D1印刷用.PDF

052-XML04/fiÁ1-part3-’ÓŠ¹

早分かりS2Dao

S2Dao入門

FileMaker ODBC と JDBC ガイド

CAC

B2-Servlet-0112.PDF

Oracle Forms Services R6i

Oracle Lite Tutorial

PowerPoint プレゼンテーション

untitled

answer.indd

PowerPoint Presentation

untitled

Oracle Lite Tutorial

Oracle Application Server 10g Release 3(10.1.3)- アジャイル・エンタープライズ(俊敏な企業)のためのデータ・アクセス

untitled

Copyright Oracle Parkway, Redwood City, CA U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated softw

FileMaker ODBC and JDBC Guide

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1

K227 Java 2

ii II Web Web HTML CSS PHP MySQL Web Web CSS JavaScript Web SQL Web

Oracle9i Application Server for Windows NT Oracle HTTP Server powered by Apacheパフォーマンス・ガイド, リリース1.0.2

自己管理型データベース: アプリケーションおよびSQLチューニング・ガイド

// JDBC // CallableStatement cs = null; try { cs = conn.preparecall("{call DUMMY_PROC(?,?)}"); cs.setstring(1, "This is a test"); cs.registeroutparame

r1.dvi

Microsoft Word - J doc

PowerPoint プレゼンテーション

Oracle8i Java開発者ガイド, リリース8.1

Oracle Application Expressの機能の最大活用-インタラクティブ・レポート


Pro*COBOL for Windows プリコンパイラ・スタート・ガイド リリース8.1.6/1.8.51

第 1 章 条件分岐 この章では 条件に応じて処理を分岐する方法について説明します 1. CASE 式で複雑な条件分岐を実現 2. 関数を使用した条件分岐 3. MERGE 文による条件に応じた DML の実行

Java演習(4) -- 変数と型 --

ユニット・テストの概要

Oracle Database 10gの新しいSQL機能

3 Powered by mod_perl, Apache & MySQL use Item; my $item = Item->new( id => 1, name => ' ', price => 1200,

XML Consortium & XML Consortium 1 XML Consortium XML Consortium 2

Oracle8i Java開発者ガイド,リリース8.1

1 ex01.sql ex01.sql ; user_id from (select user_id ;) user_id * select select (3+4)*7, SIN(PI()/2) ; (1) select < > from < > ; :, * user_id user_name

Oracle Web Conferencing Oracle Collaboration Suite 2 (9.0.4) Creation Date: May 14, 2003 Last Update: Jan 21, 2005 Version: 1.21

Oracle Lite Windows CE開発者ガイド,リリース4.0.1

Gartner Day

第 5 章 結合 結合のパフォーマンスに影響を与える結合の種類と 表の結合順序について内部動作を交えて 説明します 1. 結合処理のチューニング概要 2. 結合の種類 3. 結合順序 4. 結合処理のチューニングポイント 5. 結合関連のヒント

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

意外と簡単!?

C3印刷用.PDF

Oracle Database 10gの新しいSQL性能: 正規表現、ネイティブ値、LOBパフォーマンスおよびその他の機能

Oracle Spatial

キャラクタ・セットの移行に関するベスト・プラクティス

S2DaoでもN:Nできます

Microsoft Word - ACCESSINGO...

time.book

Agenda

Oracle Developer Release 6i

Chapter

Transcription:

Oracle8i Java 8.1 2000 2 J00965-01

Oracle8i Java, 8.1 J00965-01 Oracle8i Java Stored Procedures Developer s Guide, Release 2 (8.1.6) A81358-01 Tom Portfolio Dave Alpern, Gray Clossman, Matthieu Devin, Steve Harris, Hal Hildebrand, Susan Kraft, Sunil Kunisetty, Thomas Kurian, Dave Rosenberg, Jerry Schwarz Copyright 1999, Oracle Corporation. All rights reserved. Printed in Japan. * Oracle Corporation Oracle Corporation Restricted Rights Notice Restricted Rights Notice Programs delivered subject to the DOD FAR Supplement are "commercial computer software" and use, duplication, and disclosure of the Programs, including documentation, shall be subject to the licensing restrictions set forth in the applicable Oracle license agreement. Otherwise, Programs delivered subject to the Federal Acquisition Regulations are "restricted computer software" and use, duplication, and disclosure of the Programs shall be subject to the restrictions in FAR 52.227-19, Commercial Computer Software - Restricted Rights (June, 1987). Oracle Corporation, 500 Oracle Parkway, Redwood City, CA 94065.

... v 1 Java RDBMS... 1-2... 1-3... 1-4... 1-4... 1-5... 1-6... 1-6... 1-6... 1-7... 1-7... 1-7... 1-7... 1-8 JServer JVM... 1-9 JServer JVM JVM... 1-10 JServer JVM... 1-11... 1-15 1: Java... 1-15 2: Java... 1-15 3: Java... 1-16 4:... 1-16 5:... 1-17 i

2 Java Java... 2-2 Java... 2-4... 2-4... 2-4... 2-7... 2-7 loadjava... 2-9... 2-12... 2-12... 2-14... 2-14 loadjava... 2-15... 2-15 dropjava... 2-18... 2-19... 2-19... 2-20 dropjava... 2-20... 2-21 3 Java... 3-2... 3-3... 3-3... 3-4 JDBC... 3-6 SQLJ... 3-8... 3-10 1... 3-11 2... 3-12 3... 3-12 4... 3-13... 3-14... 3-15 ii

... 3-17... 3-18... 3-18... 3-20 4 Java... 4-2... 4-2 1... 4-3 2... 4-4 Java... 4-6 1... 4-6 2... 4-8 SQL DML Java... 4-10... 4-11 PL/SQL Java... 4-12 Java PL/SQL... 4-14 JVM... 4-15 5... 5-2... 5-5... 5-7 Java... 5-9 Java... 5-15 Java... 5-16 Java... 5-18 iii

iv

Java Java Oracle JServer Java JVM Oracle8i Java Java v

Oracle8i Java Java SQL PL/SQL Oracle8i : Java Java x 5 1 Java Oracle RDBMS JServer JVM Oracle8i Java 2 Java Oracle Java loadjava dropjava Java 3 Java Java SQL 4 Java SQL DML PL/SQL Java 5 Java vi

Java { } // /* */... 1 SQL 2 vii

PL/SQL -- /* */... PL/SQL BNF [ ] { } 1... viii

dept emp CREATE TABLE dept (deptno NUMBER(2) NOT NULL, dname VARCHAR2(14), loc VARCHAR2(13)); CREATE TABLE emp (empno NUMBER(4) NOT NULL, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(2)); dept emp DEPTNO DNAME LOC ------- ---------- --------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ------- --------- ------ --------- ------ ------ ------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 7566 JONES MANAGER 7839 02-APR-81 2975 20 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 7782 CLARK MANAGER 7839 09-JUN-81 2450 10 7788 SCOTT ANALYST 7566 19-APR-87 3000 20 7839 KING PRESIDENT 17-NOV-81 5000 10 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 7876 ADAMS CLERK 7788 23-MAY-87 1100 20 7900 JAMES CLERK 7698 03-DEC-81 950 30 7902 FORD ANALYST 7566 03-DEC-81 3000 20 7934 MILLER CLERK 7782 23-JAN-82 1300 10 SQL*Plus demo demobld.sql ix

Oracle Oracle8i Oracle8i Java Oracle8i JDBC Oracle8i Oracle8i SQLJ Oracle8i SQL Oracle8i PL/SQL Oracle8i SQL*Plus The Java Programming Language Arnold & Gosling, Addison-Wesley 1998 Java Java Thinking in Java Bruce Eckel, Prentice Hall 1998 Java Java Core Java Cornell & Horstmann, Prentice-Hall 1996 Java Java in a Nutshell Flanagan O'Reilly 1997 Java Java Software Solutions Lewis & Loftus Addison-Wesley 1998 Java x

Java Web Sun Microsystems Java http://www.sun.com Java Web http://www.gamelan.com Java API http://www.javasoft.com/products Java comp.lang.java.programmer comp.lang.java.misc JServer http://www.oracle.com/java JDBC SQLJ Java FAQ xi

xii

1 Oracle JServer Java Oracle RDBMS Java RDBMS JServer JVM 1-1

Java RDBMS Java RDBMS Oracle RDBMS Java Java Java JavaBean Java RDBMS Java Java RDBMS 1-1 2 / PL/SQL Java PL/SQL Oracle8i 4 Net8 Connection Manager RDBMS 1-1 2 / Oracle NC OCI Java Pro* JDBC ODBC Net8 Net8 Net8 Connection Manager Net8 Oracle / Oracle Net8 Java PL/SQL 1-2 Oracle8i Java

SQL Oracle Java Java Java SQL Java Java Java 1-2 1-2 hire_emp(...); Oracle. hire_emp(...) hire_emp(...); hire_emp(...); GUI JServer Java 3 1-3

void Java PL/SQL SQL CREATE FUNCTION CREATE PROCEDURE CREATE PACKAGE Java SQL DML INSERT UPDATE DELETE SELECT SQL CALL PL/SQL DML Oracle 3 DML CALL Java SQL CREATE TRIGGER RDBMS DML 1-4 Oracle8i Java

SQL Java SQL CREATE... OBJECT VARRAY NESTED TABLE 1-5

SQL OLTP SQL RDBMS SQL SQL Java IDE JDBC CORBA EJB Java SQLJ OCI Pro*C/C++ JDeveloper Java 1-6 Oracle8i Java

MTS Oracle8i 10,000 Net8 Connection Manager Net8 RDBMS Java Java PL/SQL Java Oracle PL/SQL Java PL/SQL Java SQL PL/SQL Java Java Oracle RDBMS Java PL/SQL Java JDBC PL/SQL PL/SQL Java Oracle Oracle8i 1-7

Oracle JServer Java Java 2 Java 2 untrusted EXECUTE Oracle JServer Oracle8i Java 1-8 Oracle8i Java

JServer JVM JServer JVM JServer Java JVM Java 2 Java JServer JVM RDBMS JServer JVM Java Java java.lang java.io java.net java.math java.util Java 1-3 1-3 JServer JVM JServer JVM SQL IIOP loadjava RDBMS RDBMS CREATE JAVA JServer JVM Java RDBMS Java Oracle Java JVM RDBMS Java JServer Java 1-9

JServer JVM JServer JVM JVM JServer JVM JVM main() Java main() 1 Java GUI GUI GUI JServer JVM JDK Abstract Windowing Toolkit AWT GUI AWT Java GUI AWT IDE JServer JVM Java IDE RDBMS Java IDE Java Java IDE Java Java Oracle8i Java Net8 MTS RDBMS OS 1-10 Oracle8i Java

JServer JVM JServer JVM 1 Oracle8i Java Java Java RDBMS JServer JVM JServer JVM Java Oracle loadjava SQL CREATE JAVA CREATE JAVA {SOURCE CLASS RESOURCE} Java Java JServer JVM Java 1 Java 1-11

JServer JVM JServer JVM Java 2 JDK 1.2 Java CREATE JAVA SOURCE Java Java 1 Java Java Java JServer JVM Java 2 Java Java Java / : JServer JVM Java ORB SQLJ JDBC 1-13 JServer Java Java Java Java Java " " Java Oracle Java 1-12 Oracle8i Java

JServer JVM JDBC JDBC Java Sun Microsystems ODBC Open Database Connectivity X/Open SQL CLI Call Level Interface JDBC LONG JDBC RDBMS Java Oracle JDBC Sun Microsystems JDBC RDBMS Oracle NLS JDBC API SQLJ SQLJ SQL Java JDBC Java SQLJ SQLJ Java SQLJ SQL Java Java SQLJ RDBMS JDBC Oracle SQLJ DML DDL SQLJ API JServer JServer Java JServer Java C C C JServer JVM Just-In-Time JIT JServer OS JServer JVM Java ORB SQLJ JDBC 1-13

JServer JVM Java JDK Oracle 1-4 10 1-4 JServer Java Java Java Java JServer = X C C = 2X 10X R8.1.6 1-14 Oracle8i Java

Java 5 Java Java 5 1: Java Java IDE Oracle Java Java JServer JVM Symantec Visual Café Oracle JDeveloper Borland JBuilder Java IDE Oscar Oscar Wilde quote() public class Oscar { // return a quotation from Oscar Wilde public static String quote() { return "I can resist everything except temptation."; } } Sun Microsystems JDK Java Oscar javac Oscar.java Java Oscar.class 2: Java loadjava Java Oracle Java loadjava JDBC OCI loadjava Oscar scott > loadjava -user scott/tiger Oscar.class 1-15

quote() String Java SYS 2 3: Java SQL Java Oracle Oracle JDeveloper SQL*Plus quote() SQL> connect scott/tiger SQL> CREATE FUNCTION oscar_quote RETURN VARCHAR2 2 AS LANGUAGE JAVA 3 NAME 'Oscar.quote() return java.lang.string'; 3 4: Java SQL DML PL/SQL PL/SQL SQL CALL SQL*Plus SQL*Plus SQL> VARIABLE thequote VARCHAR2(50); oscar_quote() SQL> CALL oscar_quote() INTO :thequote; SQL> PRINT thequote; THEQUOTE -------------------------------------------------- I can resist everything except temptation. 4 1-16 Oracle8i Java

5: Java JDK jdb Java JServer Java DebugProxy Java sun.tools.debug.agent Oracle8i Java 1-17

1-18 Oracle8i Java

2 Java Java Oracle SQL Java Java Java loadjava Java SQL CREATE JAVA {SOURCE CLASS RESOURCE} Java Oracle Java OS Java IDE : Java CREATE JAVA SQL*Plus CREATE JAVA CLASS Java BFILE LOB Oracle Oracle8i SQL Java Java loadjava dropjava Java 2-1

Java Java Java JServer JVM Oracle 2-1 loadjava JVM Java loadjava Java -encoding Java 2-7 2-1 Java Oracle.java.class.class file.jar.jar file loadjava RDBMS Java Java Java Java Java 2-2 Oracle8i Java

Java Java Handle oracle.aurora.rdbms.handle Java oracle/aurora/rdbms/handle Oracle RDBMS Java 4000 Java 30 30 30 RDBMS Java 2-3

Java Java Java loadjava dropjava Java IDE Java Java loadjava Oracle dropjava Java Java Java loadjava Oracle Java JServer JVM loadjava Java JAR ZIP JAR ZIP loadjava 1 2 A.java X X B.java B.java X A.java X A.java B.java Java 1 JDK Java loadjava -resolve loadjava SQL ALTER JAVA CLASS... RESOLVE Java Oracle SQL ALTER JAVA 2-4 Oracle8i Java

Java Java ClassNotFound CLASSPATH Java Sun Microsystem JDK CLASSPATH JServer JVM SQL JVM Java Java X X loadjava 3 : -resolve loadjava : -andresolve loadjava : -resolve -andresolve loadjava JVM Java 2-5

Java Java loadjava -resolver loadjava -oracleresolver 1 "((name_spec schema_spec) [(name_spec schema_spec)]...)" Java import Java "*" test/util/* test.util "*" "-" "-" "-" JServer GUI SCOTT PUBLIC -resolver "((* SCOTT) (* PUBLIC))" utils.gui utils.gui -resolver "((* SCOTT) (* PUBLIC) (utils/gui/* -))" SCOTT PUBLIC -resolver "((* SCOTT) (* PUBLIC) (* -))" 2-6 Oracle8i Java

Java loadjava JAVA$CLASS$MD5$TABLE " " Java MD5 RSA Data Security MD5 loadjava Java dropjava -force loadjava loadjava Make loadjava Java loadjava loadjava -verbose loadjava Java loadjava -resolve -andresolve loadjava USER_ERRORS Oracle8i 2 loadjava -resolve -andresolve JAVA$OPTIONS " " loadjava Java 2-7

Java encoding online SQLJ loadjava encoding = latin1 online = true Oracle8i SQLJ DBMS_JAVA FUNCTION get_compiler_option ( name VARCHAR2, option VARCHAR2) RETURNS VARCHAR2; PROCEDURE set_compiler_option ( name VARCHAR2, option VARCHAR2, value VARCHAR2); PROCEDURE reset_compiler_option ( name VARCHAR2, option VARCHAR2); name Java name name dbms_java.set_compiler_option SQL> dbms_java.set_compiler_option('x.sqlj', 'online', 'false'); DBMS_JAVA Oracle8i Java 2-8 Oracle8i Java

loadjava loadjava LOADLOBS loadjava CREATE$JAVA$LOB$TABLE BLOB Java SQL CREATE JAVA Java Oracle JServerPermission.loadLibraryInClass JVM CREATE PROCEDURE CREATE TABLE Oracle8i Java Java SQLJ JAR ZIP loadjava {-user -u} username/password[@database] [-option_name -option_name...] file_name file_name... option_name { {a andresolve} debug {d definer} {e encoding} encoding_scheme_name {f force} {g grant} username[,username]... {o oci8} {h help} oracleresolver noverify {r resolve} {R resolver} "resolver_spec" {S schema} schema_name {s synonym} {t thin} {v verbose} } -force, -resolve, -thin // -force -resolve -thin // SCOTT, UTIL, BLAKE // SCOTT,UTIL,BLAKE // Java 2-9

loadjava 2-1 loadjava 2 -user file_name 2-1 loadjava andresolve debug definer encoding force grant -resolve -resolve loadjava 2-21 JAVA$OPTIONS -encoding JDK latin1 Java EXECUTE EXECUTE EXECUTE -grant SQL REVOKE CREATE PROCEDURE WITH GRANT EXECUTE 2-10 Oracle8i Java

loadjava 2-1 loadjava help oci8 noverify oracleresolver resolve resolver schema synonym loadjava loadjava JDBC OCI -thin JServerPermission.Verifier -resolve "((* definer's_schema) (* public))" -resolver -andresolve -force -oracleresolver Java CREATE ANY PROCEDURE CREATE ANY TABLE Java CREATE PUBLIC SYNONYM Java 2-11

loadjava 2-1 loadjava thin verbose loadjava JDBC Thin -oci8 loadjava -user username/password[@database] -oci8 database database TNS Net8 -thin database @host:lport:sid host lport Net8 SID SID lport 1521 SID ORCL Java SQLJ JAR ZIP JAR ZIP loadjava loadjava JAR ZIP JAR ZIP JDK JAR ZIP loadjava 2-12 Oracle8i Java

loadjava loadjava loadjava loadjava JAR ZIP loadjava Java JAR ZIP CLASSPATH loadjava loadjava alpha/beta/x.properties /home/scott/javastuff/alpha/beta/x.properties 1 loadjava 2 alpha/beta/x.properties ROOT/home/scott/javastuff/alpha/beta/x.properties loadjava 2 ROOT / b.properties /a/b.properties loadjava getresource() getresourceasstring() JAR > cd /home/scott/javastuff > jar -cf alpharesources.jar alpha/*.properties > loadjava... alpharesources.jar Java 2-13

loadjava JAR JAR > loadjava... alpha.jar > loadjava... /home/scott/javastuff/alpha.jar loadjava JDBC Thin 2 > loadjava -user scott/tiger@dbhost:1521:orcl -thin -resolve Agent.class Alerter.class loadjava JDBC OCI JAR BLAKE > loadjava -user scott/tiger -resolve -schema BLAKE serverobjs.jar loadjava NILES FORD Manager.class > loadjava -user scott/tiger@localhost:1521:orcl -thin -grant NILES,FORD Manager.class 2 loadjava -andresolve -grant -resolve loadjava -force -grant EXECUTE SQL DROP JAVA Java loadjava -force 2-14 Oracle8i Java

loadjava loadjava DBMS_JAVA loadjava loadjava PROCEDURE loadjava (options VARCHAR2); PROCEDURE loadjava (options VARCHAR2, resolver VARCHAR2); -user -oci8 -thin loadjava -resolver -R loadjava 2 2 CALL dbms_java.loadjava('-r Agent.class', '-R "((* SCOTT) (* -))"'); ORACLE_HOME stderr USER_OBJECTS SCOTT SQL*Plus Java SET SERVEROUTPUT ON SET VERIFY OFF PROMPT A)ll or J)ava only? ACCEPT x CHAR PROMPT 'Choice: ' DECLARE choice CHAR(1) := UPPER('&x'); printable BOOLEAN; bad_choice EXCEPTION; BEGIN IF choice NOT IN ('A', 'J') THEN RAISE bad_choice; END IF; DBMS_OUTPUT.PUT_LINE(CHR(0)); DBMS_OUTPUT.PUT_LINE('Object Name ' 'Object Type Status Timestamp'); DBMS_OUTPUT.PUT_LINE('------------------------------ ' '------------- ------- ----------------'); FOR i IN (SELECT object_name, object_type, status, timestamp FROM user_objects ORDER BY object_type, object_name) LOOP /* Exclude objects generated for loadjava and dropjava. */ printable := i.object_name NOT LIKE 'SYS_%' Java 2-15

loadjava AND i.object_name NOT LIKE 'CREATE$%' AND i.object_name NOT LIKE 'JAVA$%' AND i.object_name NOT LIKE 'LOADLOB%'; IF choice = 'J' THEN printable := i.object_type LIKE 'JAVA %'; END IF; IF printable THEN DBMS_OUTPUT.PUT_LINE(RPAD(i.object_name,31) RPAD(i.object_type,14) RPAD(i.status,8) SUBSTR(i.timestamp,1,16)); END IF; END LOOP; EXCEPTION WHEN bad_choice THEN DBMS_OUTPUT.PUT_LINE('Bad choice'); END; / Java SQL> @usr_obj A)ll or J)ava only? Choice: a Object Name Object Type Status Timestamp ----------------------------- ------------- ------- ---------------- Alerter JAVA CLASS VALID 1998-10-08:13:42 POManager JAVA CLASS VALID 1998-10-08:17:14 Alerter JAVA SOURCE VALID 1998-10-08:13:42 POManager JAVA SOURCE VALID 1998-10-08:17:11 BONUS TABLE VALID 1998-10-08:14:02 DEPT TABLE VALID 1998-10-08:14:02 EMP TABLE VALID 1998-10-08:14:02 SALGRADE TABLE VALID 1998-10-08:14:02 SQL> @usr_obj A)ll or J)ava only? Choice: j Object Name Object Type Status Timestamp ----------------------------- ------------- ------- ---------------- Alerter JAVA CLASS VALID 1998-10-08:13:42 POManager JAVA CLASS VALID 1998-10-08:17:14 Alerter JAVA SOURCE VALID 1998-10-08:13:42 POManager JAVA SOURCE VALID 1998-10-08:17:11 2-16 Oracle8i Java

loadjava object_name Java 30 DBMS_JAVA longname SQL> SELECT dbms_java.longname(object_name) FROM user_objects 2 WHERE object_type = 'JAVA SOURCE'; Java status Java VALID INVALID VALID VALID VALID 2-2 USER_OBJECTS 2-2 USER_OBJECTS OBJECT_NAME VARCHAR2(128) SUBOBJECT_NAME VARCHAR2(30) OBJECT_ID NUMBER DATA_OBJECT_ID NUMBER OBJECT_TYPE VARCHAR2(15) TABLE INDEX CREATED DATE LAST_DDL_TIME DATE DDL TIMESTAMP VARCHAR2(19) STATUS VARCHAR2(7) VALID INVALID TEMPORARY VARCHAR2(1) y n GENERATED VARCHAR2(1) SECONDARY VARCHAR2(1) Java 2-17

dropjava dropjava dropjava dropjava loadjava Java SQLJ JAR ZIP dropjava {-user -u} username/password[@database] [-option_name -option_name...] file_name obj_name file_name... option_name { {h help} {o oci8} {S schema} schema_name {s synonym} {t thin} {v verbose} }.java.class.sqlj.ser.properties.jar.zip dropjava 2-3 dropjava 2 -user file_name 2-3 dropjava help oci8 schema synonym dropjava dropjava JDBC OCI -thin Java DROP ANY PROCEDURE loadjava 2-18 Oracle8i Java

dropjava 2-3 dropjava thin verbose dropjava JDBC Thin -oci8 dropjava -user username/password[@database] -oci8 database database TNS Net8 -thin database @host:lport:sid host lport Net8 SID SID lport 1521 SID ORCL dropjava loadjava dropjava SQLJ dropjava JAR ZIP dropjava.java.class.sqlj.ser.properties.jar.zip dropjava ROOT dropjava Java 2-19

dropjava Java SQLJ JAR JAR dropjava JDBC OCI serverobjs.jar BLAKE > dropjava -user scott/tiger -schema BLAKE serverobjs.jar dropjava JDBC Thin > dropjava -u scott/tiger@dbhost:1521:orcl -t Agent.class images.dat dropjava DBMS_JAVA dropjava dropjava PROCEDURE dropjava (options VARCHAR2); -user -oci8 -thin dropjava CALL dbms_java.dropjava('-s JONES serverobjs.jar'); ORACLE_HOME stderr 2-20 Oracle8i Java

Java 1 analyze sales analyze IR: Invoker Rights 2-2 sales 2-2 WEST HQ EAST analyze (IR) sales sales Java 2-21

analyze payroll analyze payroll 2-3 analyze DR: Definer Rights calccomm payroll 2-3 WEST HQ EAST analyze (IR) sales calc_comm (DR) sales payroll loadjava -definer UNIX setuid -definer -definer 2-22 Oracle8i Java

3 Java SQL Java Oracle Java Java SQL Java Java SQL Java 3-1

Java Java SQL CREATE FUNCTION CREATE PROCEDURE PL/SQL SQL Java void Java LANGUAGE JAVA Java 3-1 Java Oracle Java 3-1 Java Oracle Java 3-2 Oracle8i Java

Java Java PUBLIC PL/SQL PL/SQL SQL Java Oracle public static 1 SQL Java SQL PL/SQL OUT IN OUT Java 1 Java IN OUT Java NUMBER OUT float[] p Java p[0] : OUT IN OUT SQL DML Java 3-3

SQL Java 3-1 Oracle SQL Java 3-1 SQL CHAR NCHAR LONG VARCHAR2 NVARCHAR2 DATE NUMBER RAW LONG RAW ROWID BFILE BLOB CLOB NCLOB Java oracle.sql.char java.lang.string java.sql.date java.sql.time java.sql.timestamp java.lang.byte java.lang.short java.lang.integer java.lang.long java.lang.float java.lang.double java.math.bigdecimal byte short int long float double oracle.sql.date java.sql.date java.sql.time java.sql.timestamp java.lang.string oracle.sql.number java.lang.byte java.lang.short java.lang.integer java.lang.long java.lang.float java.lang.double java.math.bigdecimal byte short int long float double oracle.sql.raw byte[] oracle.sql.char oracle.sql.rowid java.lang.string oracle.sql.bfile oracle.sql.blob oracle.jdbc2.blob oracle.sql.clob oracle.jdbc2.clob 3-4 Oracle8i Java

3-1 SQL OBJECT REF TABLE VARRAY SQL : Java oracle.sql.struct oracle.sqljdata oracle.jdbc2.struct oracle.sql.ref oracle.jdbc2.ref oracle.sql.array oracle.jdbc2.array oracle.sql.customdatum oracle.sql.datum 1. UROWID NUMBER INTEGER REAL 2. LONG LONG RAW 32KB Java 3. Java java.lang.byte java.lang.short SQL NULL 4. oracle.sql.customdatum public static oracle.sql.customdatumfactory.getfactory(); 5. oracle.sql.datum oracle.sql.datum SQL Java oracle.sql.datum SQL Java 6. oracle.sql SQL Java 7. oracle.jdbc2 oracle.sql Oracle8i JDBC Java 3-5

JDBC JDBC JDBC DriverManager getconnection getconnection Connection SQL JDBC SQL Connection Connection conn = DriverManager.getConnection("jdbc:default:connection:"); IN 1 SQL Statement createstatement Connection Statement String sql = "DROP " + object_type + " " + object_name; Statement stmt = conn.createstatement(); stmt.executeupdate(sql); IN 2 SQL PreparedStatement SQL 1 SQL? preparestatement Connection SQL PreparedStatement String sql = "DELETE FROM dept WHERE deptno =?"; PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setint(1, deptid); pstmt.executeupdate(); ResultSet SQL next getxxx String sql = "SELECT COUNT(*) FROM " + tabname; int rows = 0; Statement stmt = conn.createstatement(); ResultSet rset = stmt.executequery(sql); while (rset.next()) {rows = rset.getint(1);} 3-6 Oracle8i Java

CallableStatement 1 IN OUT INOUT 3 // parameterless stored procedure CallableStatement cstmt = conn.preparecall("{call proc}"); // stored procedure CallableStatement cstmt = conn.preparecall("{call proc(?,?)}"); // stored function CallableStatement cstmt = conn.preparecall("{? = CALL func(?,?)}"); JDBC JDBC SQL Java Oracle OPEN_CURSORS JDBC JDBC Java JDBC Thin JDBC Thin JDBC OCI JDBC close() getconnection() Oracle8i JDBC Java 3-7

SQLJ SQLJ #sql SQL Java SQLJ SELECT CALL Java TodaysDate SQLJ import java.sql.*; class TodaysDate { public static void main (String[] args) { try { Date today; #sql {SELECT SYSDATE INTO :today FROM dual}; putline("today is " + today); } catch (Exception e) {putline("run-time error: " + e);} } static void putline(string s) { try { #sql {CALL DBMS_OUTPUT.PUT_LINE(:s)}; } catch (SQLException e) {} } } SQLJ // parameterless stored procedure #sql {CALL procedure_name()}; // stored procedure #sql {CALL procedure_name(parameter, parameter,...)}; // stored function #sql result = {VALUES(function_name(parameter, parameter,...))}; parameter {literal :[{IN OUT INOUT}] host_variable_name} host_variable_name : max.salary 3-8 Oracle8i Java

SQLJ SQLJ SQLJ SQLJ SQLJ #sql SQLJ JDBC Java JDBC Thin JDBC Thin JDBC OCI SQLJ Java SQLJ JAVA$OPTIONS DBMS_JAVA SQLJ -ser2class SQLJ Oracle8i SQLJ Java 3-9

SQL*Plus CREATE [OR REPLACE] { PROCEDURE procedure_name [(param[, param]...)] FUNCTION function_name [(param[, param]...)] RETURN sql_type} [AUTHID {DEFINER CURRENT_USER}] [PARALLEL_ENABLE] [DETERMINISTIC] {IS AS} LANGUAGE JAVA NAME 'method_fullname (java_type_fullname[, java_type_fullname]...) [return java_type_fullname]'; param parameter_name [IN OUT IN OUT] sql_type AUTHID DEFINER CURRENT_USER loadjava -definer PARALLEL_ENABLE DML static DETERMINISTIC DETERMINISTIC Oracle8i SQL CREATE INDEX CREATE MATERIALIZED VIEW NAME Java Java 1 1 main 3-12 2 Java Java 3-10 Oracle8i Java

Java artificialintelligence.neuralnetworks.patternclassification. RadarSignatureClassifier.computeRange() 1 Java Oracle import java.sql.*; import java.io.*; import oracle.jdbc.driver.*; public class GenericDrop { public static void dropit (String object_type, String object_name) throws SQLException { // Connect to Oracle using JDBC driver Connection conn = DriverManager.getConnection("jdbc:default:connection:"); // Build SQL statement String sql = "DROP " + object_type + " " + object_name; try { Statement stmt = conn.createstatement(); stmt.executeupdate(sql); stmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } } GenericDrop dropit 1 'table' 'emp' dropit emp CREATE OR REPLACE PROCEDURE drop_it ( obj_type VARCHAR2, obj_name VARCHAR2) AS LANGUAGE JAVA NAME 'GenericDrop.dropIt(java.lang.String, java.lang.string)'; String java.lang Java Java 3-11

2 Java 1 1 main String[] CHAR VARCHAR2 main public class EchoInput { public static void main (String[] args) { for (int i = 0; i < args.length; i++) System.out.println(args[i]); } } main CREATE OR REPLACE PROCEDURE echo_input ( s1 VARCHAR2, s2 VARCHAR2, s3 VARCHAR2) AS LANGUAGE JAVA NAME 'EchoInput.main(java.lang.String[])'; NOT NULL VARCHAR2 VARCHAR2 DECLARE last_name VARCHAR2(20); -- size constraint required 3 rowcount import java.sql.*; import java.io.*; import oracle.jdbc.driver.*; public class RowCounter { public static int rowcount (String tabname) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "SELECT COUNT(*) FROM " + tabname; int rows = 0; 3-12 Oracle8i Java

try { Statement stmt = conn.createstatement(); ResultSet rset = stmt.executequery(sql); while (rset.next()) {rows = rset.getint(1);} rset.close(); stmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} return rows; } } NUMBER INTEGER NUMBER INTEGER REAL POSITIVE CREATE FUNCTION row_count (tab_name VARCHAR2) RETURN NUMBER AS LANGUAGE JAVA NAME 'RowCounter.rowCount(java.lang.String) return int'; 4 swap Java public class Swapper { public static void swap (int[] x, int[] y) { int hold = x[0]; x[0] = y[0]; y[0] = hold; } } Java swap swap IN OUT OUT IN OUT Java CREATE PROCEDURE swap (x IN OUT NUMBER, y IN OUT NUMBER) AS LANGUAGE JAVA NAME 'Swapper.swap(int[], int[])'; Java Java 3-13

PL/SQL 2 Oracle8i PL/SQL SQL*Plus PL/SQL CREATE [OR REPLACE] PACKAGE package_name [AUTHID {CURRENT_USER DEFINER}] {IS AS} [type_definition [type_definition]...] [cursor_spec [cursor_spec]...] [item_declaration [item_declaration]...] [{subprogram_spec call_spec} [{subprogram_spec call_spec}]...] END [package_name]; [CREATE [OR REPLACE] PACKAGE BODY package_name {IS AS} [type_definition [type_definition]...] [cursor_body [cursor_body]...] [item_declaration [item_declaration]...] [{subprogram_spec call_spec} [{subprogram_spec call_spec}]...] [BEGIN sequence_of_statements] END [package_name];] 1 AUTHID 3-14 Oracle8i Java

DeptManager adddept CREATE SEQUENCE 3 PL/SQL import java.sql.*; import java.io.*; import oracle.jdbc.driver.*; public class DeptManager { public static void adddept (String deptname, String deptloc) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "SELECT deptnos.nextval FROM dual"; String sql2 = "INSERT INTO dept VALUES (?,?,?)"; int deptid = 0; try { PreparedStatement pstmt = conn.preparestatement(sql); ResultSet rset = pstmt.executequery(); while (rset.next()) {deptid = rset.getint(1);} pstmt = conn.preparestatement(sql2); pstmt.setint(1, deptid); pstmt.setstring(2, deptname); pstmt.setstring(3, deptloc); pstmt.executeupdate(); rset.close(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } public static void dropdept (int deptid) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "DELETE FROM dept WHERE deptno =?"; try { PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setint(1, deptid); pstmt.executeupdate(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } Java 3-15

public static void changeloc (int deptid, String newloc) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "UPDATE dept SET loc =? WHERE deptno =?"; try { PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setstring(1, newloc); pstmt.setint(2, deptid); pstmt.executeupdate(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } } adddept dropdept changeloc CREATE OR REPLACE PACKAGE dept_mgmt AS PROCEDURE add_dept (dept_name VARCHAR2, dept_loc VARCHAR2); PROCEDURE drop_dept (dept_id NUMBER); PROCEDURE change_loc (dept_id NUMBER, new_loc VARCHAR2); END dept_mgmt; Java CREATE OR REPLACE PACKAGE BODY dept_mgmt AS PROCEDURE add_dept (dept_name VARCHAR2, dept_loc VARCHAR2) AS LANGUAGE JAVA NAME 'DeptManager.addDept(java.lang.String, java.lang.string)'; PROCEDURE drop_dept (dept_id NUMBER) AS LANGUAGE JAVA NAME 'DeptManager.dropDept(int)'; PROCEDURE change_loc (dept_id NUMBER, new_loc VARCHAR2) AS LANGUAGE JAVA NAME 'DeptManager.changeLoc(int, java.lang.string)'; END dept_mgmt; dept_mgmt CALL dept_mgmt.add_dept('publicity', 'DALLAS'); 3-16 Oracle8i Java

SQL Java 2 PL/SQL Oracle8i PL/SQL Java SQL*Plus SQL CREATE [OR REPLACE] TYPE type_name [AUTHID {CURRENT_USER DEFINER}] {IS AS} OBJECT ( attribute_name datatype[, attribute_name datatype]... [{MAP ORDER} MEMBER {function_spec call_spec},] [{MEMBER STATIC} {subprogram_spec call_spec} [, {MEMBER STATIC} {subprogram_spec call_spec}]...] ); [CREATE [OR REPLACE] TYPE BODY type_name {IS AS} { {MAP ORDER} MEMBER function_body; {MEMBER STATIC} {subprogram_body call_spec};} [{MEMBER STATIC} {subprogram_body call_spec};]... END;] AUTHID Java 3-17

1 1000 Java LONG LONG RAW NCHAR NVARCHAR2 NCLOB ROWID UROWID SQL DEFAULT NOT NULL MEMBER SELF MEMBER SELF MEMBER instance_expression.method() STATIC SELF object_type_name.method() static Java MEMBER static Java STATIC 3-18 Oracle8i Java

CHAR SQL SQL SQL x > y DISTINCT GROUP BY ORDER BY 1 DATE NUMBER VARCHAR2 1 2 SQL 2 SELF o1 o2 o1 > o2 SELF 1 SQL PL/SQL SQL 2 Oracle SQL : Java SQL static SQL STATIC Java 3-19

2 SQL Department CREATE TYPE Department AS OBJECT ( deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13) ); Employee deptno REF Department ref ref ref REF ref CREATE TYPE Employee AS OBJECT ( empno NUMBER(4), ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno REF Department ); Department Employee Department depts dept CREATE TABLE depts OF Department AS SELECT Department(deptno, dname, loc) FROM dept; 3-20 Oracle8i Java

Employee emps emps Employee Department REF REF CREATE TABLE emps OF Employee AS SELECT Employee(e.empno, e.ename, e.job, e.mgr, e.hiredate, e.sal, e.comm, (SELECT REF(d) FROM depts d WHERE d.deptno = e.deptno)) FROM emp e; ref Oracle oracle.sql.ref oracle.sql.datum JDBC oracle.jdbc2.ref Oracle8i JDBC oracle.sql.struct Java Paymaster 1 oracle.sql.struct getattributes() JDBC NUMBER BigDecimal import java.sql.*; import java.io.*; import oracle.sql.*; import oracle.jdbc.driver.*; import oracle.oracore.*; import oracle.jdbc2.*; import java.math.*; public class Paymaster { public static BigDecimal wages(struct e) throws java.sql.sqlexception { // Get the attributes of the Employee object. Object[] attribs = e.getattributes(); // Must use numeric indexes into the array of attributes. BigDecimal sal = (BigDecimal)(attribs[5]); // [5] = sal BigDecimal comm = (BigDecimal)(attribs[6]); // [6] = comm BigDecimal pay = sal; if (comm!= null) pay = pay.add(comm); return pay; } } Java 3-21

wages CREATE OR REPLACE FUNCTION wages (e Employee) RETURN NUMBER AS LANGUAGE JAVA NAME 'Paymaster.wages(oracle.sql.STRUCT) return BigDecimal'; SQLData SQLData Java Java SQLData readsql() writesql() JDBC readsql() Java Oracle8i JDBC Paymaster raisesal() import java.sql.*; import java.io.*; import oracle.sql.*; import oracle.jdbc.driver.*; import oracle.oracore.*; import oracle.jdbc2.*; import java.math.*; public class Paymaster implements SQLData { // Implement the attributes and operations for this type. private BigDecimal empno; private String ename; private String job; private BigDecimal mgr; private Date hiredate; private BigDecimal sal; private BigDecimal comm; private Ref dept; public static BigDecimal wages(paymaster e) { BigDecimal pay = e.sal; if (e.comm!= null) pay = pay.add(e.comm); return pay; } 3-22 Oracle8i Java

public static void raisesal(paymaster[] e, BigDecimal amount) { e[0].sal = // IN OUT passes [0] e[0].sal.add(amount); // increase salary by given amount } // Implement SQLData interface. private String sql_type; public String getsqltypename() throws SQLException { return sql_type; } public void readsql(sqlinput stream, String typename) throws SQLException { sql_type = typename; empno = stream.readbigdecimal(); ename = stream.readstring(); job = stream.readstring(); mgr = stream.readbigdecimal(); hiredate = stream.readdate(); sal = stream.readbigdecimal(); comm = stream.readbigdecimal(); dept = stream.readref(); } public void writesql(sqloutput stream) throws SQLException { stream.writebigdecimal(empno); stream.writestring(ename); stream.writestring(job); stream.writebigdecimal(mgr); stream.writedate(hiredate); stream.writebigdecimal(sal); stream.writebigdecimal(comm); stream.writeref(dept); } } oralce.sql.struct Paymaster wages CREATE OR REPLACE FUNCTION wages (e Employee) RETURN NUMBER AS LANGUAGE JAVA NAME 'Paymaster.wages(Paymaster) return BigDecimal'; Java 3-23

raisesal void CREATE OR REPLACE PROCEDURE raise_sal (e IN OUT Employee, r NUMBER) AS LANGUAGE JAVA NAME 'Paymaster.raiseSal(Paymaster[], java.math.bigdecimal)'; wages raise_sal Employee CREATE TYPE Employee AS OBJECT ( empno NUMBER(4), ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno REF Department MEMBER FUNCTION wages RETURN NUMBER AS LANGUAGE JAVA NAME 'Paymaster.wages() return java.math.bigdecimal', MEMBER PROCEDURE raise_sal (r NUMBER) AS LANGUAGE JAVA NAME 'Paymaster.raiseSal(java.math.BigDecimal)' ); Paymaster SQL SELF Java this SELF IN OUT raisesal import java.sql.*; import java.io.*; import oracle.sql.*; import oracle.jdbc.driver.*; import oracle.oracore.*; import oracle.jdbc2.*; import java.math.*; 3-24 Oracle8i Java

public class Paymaster implements SQLData { // Implement the attributes and operations for this type. private BigDecimal empno; private String ename; private String job; private BigDecimal mgr; private Date hiredate; private BigDecimal sal; private BigDecimal comm; private Ref dept; public BigDecimal wages() { BigDecimal pay = sal; if (comm!= null) pay = pay.add(comm); return pay; } public void raisesal(bigdecimal amount) { // For SELF/this, even when IN OUT, no array is needed. sal = sal.add(amount); } // Implement SQLData interface. String sql_type; public String getsqltypename() throws SQLException { return sql_type; } public void readsql(sqlinput stream, String typename) throws SQLException { sql_type = typename; empno = stream.readbigdecimal(); ename = stream.readstring(); job = stream.readstring(); mgr = stream.readbigdecimal(); hiredate = stream.readdate(); sal = stream.readbigdecimal(); comm = stream.readbigdecimal(); dept = stream.readref(); } Java 3-25

public void writesql(sqloutput stream) throws SQLException { stream.writebigdecimal(empno); stream.writestring(ename); stream.writestring(job); stream.writebigdecimal(mgr); stream.writedate(hiredate); stream.writebigdecimal(sal); stream.writebigdecimal(comm); stream.writeref(dept); } } 3-26 Oracle8i Java

4 Java Java SQL DML PL/SQL SQL Java Java SQL DML Java PL/SQL Java Java PL/SQL JVM 4-1

Java Java SQL CALL Java PL/SQL SQL SQL*Plus CALL CALL [schema_name.][{package_name object_type_name}][@dblink_name] { procedure_name ([param[, param]...]) function_name ([param[, param]...]) INTO :host_variable}; param {literal :host_variable} CALL 2 CALL swap(:x, :x); -- illegal, duplicate host variables CALL balance() INTO :current_balance; -- () required System.out System.err SQL*Plus DBMS_JAVA set_output() SQL> SET SERVEROUTPUT ON SQL> CALL dbms_java.set_output(2000); 2,000 1,000,000 5,000 SQL> SET SERVEROUTPUT ON SIZE 5000 SQL> CALL dbms_java.set_output(5000); SQL*Plus Oracle8i SQL*Plus 4-2 Oracle8i Java

Java 1 main 'emp' WHERE 'sal > 1500' import java.sql.*; import oracle.jdbc.driver.*; public class Deleter { public static void main (String[] args) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "DELETE FROM " + args[0]; if (args.length > 1) sql += " WHERE " + args[1]; try { Statement stmt = conn.createstatement(); stmt.executeupdate(sql); stmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } } main 1 2 DEFAULT PL/SQL 2 CREATE OR REPLACE PACKAGE pkg AS PROCEDURE delete_rows (table_name VARCHAR2); PROCEDURE delete_rows (table_name VARCHAR2, condition VARCHAR2); END; CREATE OR REPLACE PACKAGE BODY pkg AS PROCEDURE delete_rows (table_name VARCHAR2) AS LANGUAGE JAVA NAME 'Deleter.main(java.lang.String[])'; PROCEDURE delete_rows (table_name VARCHAR2, condition VARCHAR2) AS LANGUAGE JAVA NAME 'Deleter.main(java.lang.String[])'; END; 4-3

Java delete_rows SQL> CALL pkg.delete_rows('emp', 'sal > 1500'); Call completed. SQL> SELECT ename, sal FROM emp; ENAME SAL --------- -------- SMITH 800 WARD 1250 MARTIN 1250 TURNER 1500 ADAMS 1100 JAMES 950 MILLER 1300 7 rows selected. 2 Java Oracle public class Fibonacci { public static int fib (int n) { if (n == 1 n == 2) return 1; else return fib(n - 1) + fib(n - 2); } } Fibonacci fib 1 n 1 1 2 3 5 8 13 21... 2 2 fib CREATE OR REPLACE FUNCTION fib (n NUMBER) RETURN NUMBER AS LANGUAGE JAVA NAME 'Fibonacci.fib(int) return int'; 4-4 Oracle8i Java

Java 2 SQL*Plus SQL> VARIABLE n NUMBER SQL> VARIABLE f NUMBER SQL> EXECUTE :n := 7; PL/SQL procedure successfully completed. fib CALL SQL> CALL fib(:n) INTO :f; Call completed. SQL> PRINT f F ---------- 13 4-5

Java Java Oracle DML 3 DML PL/SQL CALL 1 1 new old CALL :new :old SQL CREATE TRIGGER Oracle8i SQL Oracle8i 1 Java import java.sql.*; import java.io.*; import oracle.jdbc.driver.*; public class DBTrigger { public static void logsal (int empid, float oldsal, float newsal) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "INSERT INTO sal_audit VALUES (?,?,?)"; try { PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setint(1, empid); pstmt.setfloat(2, oldsal); pstmt.setfloat(3, newsal); pstmt.executeupdate(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } } 4-6 Oracle8i Java

Java DBTrigger sal_audit 1 logsal void CREATE OR REPLACE PROCEDURE log_sal ( emp_id NUMBER, old_sal NUMBER, new_sal NUMBER) AS LANGUAGE JAVA NAME 'DBTrigger.logSal(int, float, float)'; sal_audit CREATE TABLE sal_audit ( empno NUMBER, oldsal NUMBER, newsal NUMBER); 20 CREATE OR REPLACE TRIGGER sal_trig AFTER UPDATE OF sal ON emp FOR EACH ROW WHEN (new.sal > 1.2 * old.sal) CALL log_sal(:new.empno, :old.sal, :new.sal); UPDATE emp WHEN Java sal_audit SQL> UPDATE emp SET sal = sal + 300; SQL> SELECT * FROM sal_audit; EMPNO OLDSAL NEWSAL ---------- ---------- ---------- 7369 800 1100 7521 1250 1550 7654 1250 1550 7876 1100 1400 7900 950 1250 7934 1300 1600 6 rows selected. 4-7

Java 2 CREATE VIEW emps AS SELECT empno, ename, 'Sales' AS dname FROM sales UNION ALL SELECT empno, ename, 'Marketing' AS dname FROM mktg; sales mktg CREATE TABLE sales (empno NUMBER(4), ename VARCHAR2(10)); CREATE TABLE mktg (empno NUMBER(4), ename VARCHAR2(10)); UNION ALL INSTEAD OF Java DBTrigger public static void addemp ( int empno, String empname, String deptname) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String tabname = (deptname.equals("sales")? "sales" : "mktg"); String sql = "INSERT INTO " + tabname + " VALUES (?,?)"; try { PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setint(1, empno); pstmt.setstring(2, empname); pstmt.executeupdate(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } addemp deptname sales mktg CREATE OR REPLACE PROCEDURE add_emp ( emp_no NUMBER, emp_name VARCHAR2, dept_name VARCHAR2) AS LANGUAGE JAVA NAME 'DBTrigger.addEmp(int, java.lang.string, java.lang.string)'; 4-8 Oracle8i Java

Java INSTEAD OF CREATE OR REPLACE TRIGGER emps_trig INSTEAD OF INSERT ON emps FOR EACH ROW CALL add_emp(:new.empno, :new.ename, :new.dname); INSERT Java SQL> INSERT INTO emps VALUES (8001, 'Chand', 'Sales'); SQL> INSERT INTO emps VALUES (8002, 'Van Horn', 'Sales'); SQL> INSERT INTO emps VALUES (8003, 'Waters', 'Sales'); SQL> INSERT INTO emps VALUES (8004, 'Bellock', 'Marketing'); SQL> INSERT INTO emps VALUES (8005, 'Perez', 'Marketing'); SQL> INSERT INTO emps VALUES (8006, 'Foucault', 'Marketing'); SQL> SELECT * FROM sales; EMPNO ENAME ---------- ---------- 8001 Chand 8002 Van Horn 8003 Waters SQL> SELECT * FROM mktg; EMPNO ENAME ---------- ---------- 8004 Bellock 8005 Perez 8006 Foucault SQL> SELECT * FROM emps; EMPNO ENAME DNAME ---------- ---------- --------- 8001 Chand Sales 8002 Van Horn Sales 8003 Waters Sales 8004 Bellock Marketing 8005 Perez Marketing 8006 Foucault Marketing 4-9

SQL DML Java SQL DML Java Java SQL SELECT INSERT UPDATE DELETE Java Oracle public class Formatter { public static String formatemp (String empname, String jobtitle) { empname = empname.substring(0,1).touppercase() + empname.substring(1).tolowercase(); jobtitle = jobtitle.tolowercase(); if (jobtitle.equals("analyst")) return (new String(empName + " is an exempt analyst")); else return (new String(empName + " is a non-exempt " + jobtitle)); } } Formatter formatemp 1 CREATE OR REPLACE FUNCTION format_emp (ename VARCHAR2, job VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'Formatter.formatEmp (java.lang.string, java.lang.string) return java.lang.string'; format_emp SQL> SELECT format_emp(ename, job) AS "Employees" FROM emp 2 WHERE job NOT IN ('MANAGER', 'PRESIDENT') ORDER BY ename; Employees -------------------------------------------- Adams is a non-exempt clerk Allen is a non-exempt salesman Ford is an exempt analyst James is a non-exempt clerk Martin is a non-exempt salesman Miller is a non-exempt clerk Scott is an exempt analyst Smith is a non-exempt clerk Turner is a non-exempt salesman Ward is a non-exempt salesman 4-10 Oracle8i Java

SQL DML Java SQL DML Java " " SELECT INSERT UPDATE DELETE INSERT UPDATE DELETE SELECT INSERT UPDATE DELETE SQL COMMIT SET ROLE ALTER SYSTEM DDL DDL CREATE SQL 4-11

PL/SQL Java PL/SQL Java PL/SQL Java Java Oracle import java.sql.*; import oracle.jdbc.driver.*; public class Adjuster { public static void raisesalary (int empno, float percent) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "UPDATE emp SET sal = sal *? WHERE empno =?"; try { PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setfloat(1, (1 + percent / 100)); pstmt.setint(2, empno); pstmt.executeupdate(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } } Adjuster 1 raisesalary void CREATE OR REPLACE PROCEDURE raise_salary (empno NUMBER, pct NUMBER) AS LANGUAGE JAVA NAME 'Adjuster.raiseSalary(int, float)'; PL/SQL raise_salary DECLARE emp_id NUMBER; percent NUMBER; BEGIN -- get values for emp_id and percent raise_salary(emp_id, percent);... END; 4-12 Oracle8i Java

PL/SQL Java PL/SQL row_count 3-12 3 CREATE PROCEDURE calc_bonus (emp_id NUMBER, bonus OUT NUMBER) AS emp_count NUMBER;... BEGIN emp_count := row_count('emp');... END; PL/SQL Employee 3-24 raise_sal DECLARE emp_id NUMBER(4); v emp_type; BEGIN -- assign a value to emp_id SELECT VALUE(e) INTO v FROM emps e WHERE empno = emp_id; v.raise_sal(500); UPDATE emps e SET e = v WHERE empno = emp_id;... END; 4-13

Java PL/SQL Java PL/SQL JDBC SQLJ PL/SQL FUNCTION balance (acct_id NUMBER) RETURN NUMBER IS acct_bal NUMBER; BEGIN SELECT bal INTO acct_bal FROM accts WHERE acct_no = acct_id; RETURN acct_bal; END; JDBC balance CallableStatement cstmt = conn.preparecall("{? = CALL balance(?)}"); cstmt.registeroutparameter(1, Types.FLOAT); cstmt.setint(2, acctno); cstmt.executeupdate(); float acctbal = cstmt.getfloat(1); SQLJ #sql acctbal = {VALUES(balance(:IN acctno))}; JDBC Oracle8i JDBC SQLJ Oracle8i SQLJ 4-14 Oracle8i Java

JVM JVM Java Java Java tostring() Java SQL java.sql.sqlexception geterrorcode() getmessage() Oracle SQL PL/SQL Java catch ORA-29532 Java Java : string string catch SQL 4-15

JVM 4-16 Oracle8i Java

5 Java Java Java Java Java 5-1

5-1 E-R 5-1 E-R 1 A 1 B A 1 A 1 B A 1 A 1 B A 1 A 1 B B B B 1 1 1 A 1 A 0 B A 1 A 1 B C A 1 A 1 B 1 C A B B B C B C 5-2 Oracle8i Java

5-2 5-2 E-R p_o_number customer_number customer_name street city state zip_code phone_number customer_number order_date ship_date to_street to_city to_state to_zip_code line_item_number p_o_number stock_item_number quantity discount stock_item_number description price 5-3

1 1 1 1 1 1 1 1 1 1 1 5-4 Oracle8i Java

E-R Customers Orders LineItems StockItems Customers 5-6 5-3 E-R LineItems PONo Orders LineItems.PONo Orders.PONo 5-5

5-6 Oracle8i Java 5-3 Orders PONo NUMBER PK FK CustNo NUMBER OrderDate DATE ShipDate DATE ToStreet VARCHAR2 ToCity VARCHAR2 ToState CHAR ToZip VARCHAR2 StockItems StockNo NUMBER PK Description VARCHAR2 Price NUMBER Customers CustNo NUMBER PK CustName VARCHAR2 Street VARCHAR2 City VARCHAR2 State CHAR Zip VARCHAR2 Phone VARCHAR2 LineItems LineNo NUMBER PK PK, FK PONo NUMBER StockNo NUMBER Quantity NUMBER Discount NUMBER FK

Customers CREATE TABLE Customers ( CustNo NUMBER(3) NOT NULL, CustName VARCHAR2(30) NOT NULL, Street VARCHAR2(20) NOT NULL, City VARCHAR2(20) NOT NULL, State CHAR(2) NOT NULL, Zip VARCHAR2(10) NOT NULL, Phone VARCHAR2(12), PRIMARY KEY (CustNo) ); Customers NOT NULL Customers Orders CREATE TABLE Orders ( PONo NUMBER(5), Custno NUMBER(3) REFERENCES Customers, OrderDate DATE, ShipDate DATE, ToStreet VARCHAR2(20), ToCity VARCHAR2(20), ToState CHAR(2), ToZip VARCHAR2(10), PRIMARY KEY (PONo) ); 5-2 E-R LineItems LineItems FK StockNo StockItems PK StockNo CREATE TABLE StockItems ( StockNo NUMBER(4) PRIMARY KEY, Description VARCHAR2(20), Price NUMBER(6,2)) ); 5-7

Orders FK CustNo FK Customers PK CustNo Orders LineItems CREATE TABLE LineItems ( LineNo NUMBER(2), PONo NUMBER(5) REFERENCES Orders, StockNo NUMBER(4) REFERENCES StockItems, Quantity NUMBER(2), Discount NUMBER(4,2), PRIMARY KEY (LineNo, PONo) ); 5-8 Oracle8i Java

Java Java Java Java POManager import java.sql.*; import java.io.*; import oracle.jdbc.driver.*; public class POManager { public static void addcustomer (int custno, String custname, String street, String city, String state, String zipcode, String phoneno) throws SQLException { String sql = "INSERT INTO Customers VALUES (?,?,?,?,?,?,?)"; try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setint(1, custno); pstmt.setstring(2, custname); pstmt.setstring(3, street); pstmt.setstring(4, city); pstmt.setstring(5, state); pstmt.setstring(6, zipcode); pstmt.setstring(7, phoneno); pstmt.executeupdate(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } 5-9

Java public static void addstockitem (int stockno, String description, float price) throws SQLException { String sql = "INSERT INTO StockItems VALUES (?,?,?)"; try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setint(1, stockno); pstmt.setstring(2, description); pstmt.setfloat(3, price); pstmt.executeupdate(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } public static void enterorder (int orderno, int custno, String orderdate, String shipdate, String tostreet, String tocity, String tostate, String tozipcode) throws SQLException { String sql = "INSERT INTO Orders VALUES (?,?,?,?,?,?,?,?)"; try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setint(1, orderno); pstmt.setint(2, custno); pstmt.setstring(3, orderdate); pstmt.setstring(4, shipdate); pstmt.setstring(5, tostreet); pstmt.setstring(6, tocity); pstmt.setstring(7, tostate); pstmt.setstring(8, tozipcode); pstmt.executeupdate(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } 5-10 Oracle8i Java

Java public static void addlineitem (int lineno, int orderno, int stockno, int quantity, float discount) throws SQLException { String sql = "INSERT INTO LineItems VALUES (?,?,?,?,?)"; try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setint(1, lineno); pstmt.setint(2, orderno); pstmt.setint(3, stockno); pstmt.setint(4, quantity); pstmt.setfloat(5, discount); pstmt.executeupdate(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } public static void totalorders () throws SQLException { String sql = "SELECT O.PONo, ROUND(SUM(S.Price * L.Quantity)) AS TOTAL " + "FROM Orders O, LineItems L, StockItems S " + "WHERE O.PONo = L.PONo AND L.StockNo = S.StockNo " + "GROUP BY O.PONo"; try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); PreparedStatement pstmt = conn.preparestatement(sql); ResultSet rset = pstmt.executequery(); printresults(rset); rset.close(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } 5-11

Java static void printresults (ResultSet rset) throws SQLException { String buffer = ""; try { ResultSetMetaData meta = rset.getmetadata(); int cols = meta.getcolumncount(), rows = 0; for (int i = 1; i <= cols; i++) { int size = meta.getprecision(i); String label = meta.getcolumnlabel(i); if (label.length() > size) size = label.length(); while (label.length() < size) label += " "; buffer = buffer + label + " "; } buffer = buffer + " n"; while (rset.next()) { rows++; for (int i = 1; i <= cols; i++) { int size = meta.getprecision(i); String label = meta.getcolumnlabel(i); String value = rset.getstring(i); if (label.length() > size) size = label.length(); while (value.length() < size) value += " "; buffer = buffer + value + " "; } buffer = buffer + " n"; } if (rows == 0) buffer = "No data found! n"; System.out.println(buffer); } catch (SQLException e) {System.err.println(e.getMessage());} } 5-12 Oracle8i Java

Java public static void checkstockitem (int stockno) throws SQLException { String sql = "SELECT O.PONo, O.CustNo, L.StockNo, " + "L.LineNo, L.Quantity, L.Discount " + "FROM Orders O, LineItems L " + "WHERE O.PONo = L.PONo AND L.StockNo =?"; try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setint(1, stockno); ResultSet rset = pstmt.executequery(); printresults(rset); rset.close(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } public static void changequantity (int newqty, int orderno, int stockno) throws SQLException { String sql = "UPDATE LineItems SET Quantity =? " + "WHERE PONo =? AND StockNo =?"; try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setint(1, newqty); pstmt.setint(2, orderno); pstmt.setint(3, stockno); pstmt.executeupdate(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } 5-13

Java public static void deleteorder (int orderno) throws SQLException { String sql = "DELETE FROM LineItems WHERE PONo =?"; try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); PreparedStatement pstmt = conn.preparestatement(sql); pstmt.setint(1, orderno); pstmt.executeupdate(); sql = "DELETE FROM Orders WHERE PONo =?"; pstmt = conn.preparestatement(sql); pstmt.setint(1, orderno); pstmt.executeupdate(); pstmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} } } 5-14 Oracle8i Java

Java Java loadjava Java Oracle > loadjava -u scott/tiger@mypc:1521:orcl -v -r -t POManager.java initialization complete loading : POManager creating : POManager resolver : resolver ( ("*" scott) ("*" public) ("*" -)) resolving: POManager -v -r Java -t loadjava JDBC Thin 5-15

Java Java Java Oracle Java SQL Java POManager PL/SQL CREATE OR REPLACE PACKAGE po_mgr AS PROCEDURE add_customer (cust_no NUMBER, cust_name VARCHAR2, street VARCHAR2, city VARCHAR2, state CHAR, zip_code VARCHAR2, phone_no VARCHAR2); PROCEDURE add_stock_item (stock_no NUMBER, description VARCHAR2, price NUMBER); PROCEDURE enter_order (order_no NUMBER, cust_no NUMBER, order_date VARCHAR2, ship_date VARCHAR2, to_street VARCHAR2, to_city VARCHAR2, to_state CHAR, to_zip_code VARCHAR2); PROCEDURE add_line_item (line_no NUMBER, order_no NUMBER, stock_no NUMBER, quantity NUMBER, discount NUMBER); PROCEDURE total_orders; PROCEDURE check_stock_item (stock_no NUMBER); PROCEDURE change_quantity (new_qty NUMBER, order_no NUMBER, stock_no NUMBER); PROCEDURE delete_order (order_no NUMBER); END po_mgr; Java CREATE OR REPLACE PACKAGE BODY po_mgr AS PROCEDURE add_customer (cust_no NUMBER, cust_name VARCHAR2, street VARCHAR2, city VARCHAR2, state CHAR, zip_code VARCHAR2, phone_no VARCHAR2) AS LANGUAGE JAVA NAME 'POManager.addCustomer(int, java.lang.string, java.lang.string, java.lang.string, java.lang.string, java.lang.string, java.lang.string)'; PROCEDURE add_stock_item (stock_no NUMBER, description VARCHAR2, price NUMBER) AS LANGUAGE JAVA NAME 'POManager.addStockItem(int, java.lang.string, float)'; 5-16 Oracle8i Java