OJVM
Overview
The main purpose of this page is to ensure your Oracle OJVM is working and ready to execute custom internal Java. The Oracle user\schema x15 is used in these examples. Change to match your environment.
TOC
Prerequisites
- Your database has the OJVM installed.
OJVM Status Checks
OJVM Status
Good health check post OJVM PSU.
COL DBMS_JAVA.LONGNAME('OK') FORMAT a9 SELECT dbms_java.longname('OK') FROM dual; -- OK Example Output DBMS_JAVA --------- OK -- Not OK Example Output ORA-29548: Java system class reported: release of Java system classes in the database (12.1.0.2.181016 1.6) does not match that of the oracle executable (12.1.0.2.180717 1.6)
For RAC run on each node.
Component Status
COL comp_name FORMAT a35 COL version FORMAT a15 SELECT comp_name, version, status from dba_registry WHERE upper(comp_name) LIKE '%JAVA%%'; COMP_NAME VERSION STATUS ----------------------------------- --------------- ----------- JServer JAVA Virtual Machine 12.1.0.2.0 VALID Oracle Database Java Packages 12.1.0.2.0 VALID
Registry Banners
SELECT * FROM all_registry_banners; JServer JAVA Virtual Machine Release 12.1.0.2.0 - Production Oracle Database Packages and Types Release 12.1.0.2.0 - Production
OJVMSYS Total Objects
COL owner FORMAT a15 COL status FORMAT a15 SELECT owner, status, count(*) FROM all_objects WHERE object_type LIKE '%JAVA%' GROUP BY owner, status; OWNER STATUS COUNT(*) -------------------- --------------- ---------- OJVMSYS VALID 4
Java v$option
COL parameter FORMAT a10 COL value FORMAT a10 SELECT * from v$option WHERE parameter = 'Java'; PARAMETER VALUE CON_ID ---------- ---------- ---------- Java TRUE 0
Java Roles
SELECT role FROM dba_roles WHERE role LIKE '%JAVA%'; ROLE ------------- JAVAUSERPRIV JAVAIDPRIV JAVASYSPRIV JAVADEBUGPRIV JAVA_ADMIN JAVA_DEPLOY 6 rows selected.
Usage
EXEC DBMS_FEATURE_USAGE_INTERNAL.exec_db_usage_sampling(SYSDATE); COL currently_used FORMAT a15 SELECT currently_used, name FROM dba_feature_usage_statistics WHERE name LIKE '%Java%'; CURRENTLY_USED NAME --------------- ------------------------------------ TRUE Oracle Java Virtual Machine (user) TRUE Oracle Java Virtual Machine (system)
- DBMS_FEATURE_USAGE_INTERNAL...(SYSDATE) updates usage as of now as opposed to default (weekly).
- FALSE is not necessarily bad. It just may not have been used during sampling.
Create and Test Java Program
Set CLASSPATH
export CLASSPATH=/home/oracle
Set this to the path where your java source files will be.
Create Java Source
- cd $CLASSPATH
- vi Hello.java
public class Hello { public static String world() { return "Hello world"; } }
Compile Your Source
$ORACLE_HOME/jdk/bin/javac Hello.java
Creates Hello.class
Load Java Program Into Database
OS> loadjava -user x15/x15 Hello.class
Create Function to Call Java Class
sqlplus x15/x15@oradb
CREATE OR REPLACE FUNCTION helloworld RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'Hello.world () return java.lang.String';
/
Function created.
Test Java
sqlplus x15/x15@oradb SQLPLUS> VARIABLE myString VARCHAR2(20); SQLPLUS> CALL helloworld() INTO :myString; Call completed. SQLPLUS> PRINT myString; MYSTRING -------------------------------- Hello world
DROP Java Schema Object
DROP JAVA {CLASS | RESOURCE | SOURCE} [schema.]object_name
DROP JAVA CLASS x15.Hello; DROP JAVA SOURCE X15.Hello; DROP FUNCTION x15.helloworld;
Make sure to use the exact case of object. You may need to use double-quotes around schema and object names ("SCHEMA"."MyObjName").
APPENDIX
Unset CLASSPATH
Long term it is better to use a dedicated OS app account rather than the oracle user. So remark out the CLASSPATH if you added it. This way it will not interfere with future patching and other operations.
vi .bashrc
#export CLASSPATH=/home/oracle