Saya menjalankan kode berikut di Navicat:

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "util"
AS
import java.io.*;
import java.lang.*;
public class util extends Object
{
    public static String exec(String cmd)
    {
        Runtime.getRuntime().exec(cmd);
        return "";
    }
}

Dan itu gagal dengan:

ORA-29536: badly formed source: Encountered "<EOF>" at line 1, column 16.
Was expecting:
    ";" ...
    
, Time: 0.059000s

Kode sumber dikompilasi dengan benar dengan javac, mengapa tidak berfungsi di Oracle19?

0
daisy 27 November 2021, 03:24
Fungsi harus throw sebuah IOException (atau memiliki try/catch blok). Anda tidak perlu import java.lang.*; atau extends Object dan Anda harus memberi nama kelas yang Anda impor (yaitu java.io.IOException) daripada mengimpor menggunakan wildcard.
 – 
MT0
27 November 2021, 03:33

1 menjawab

Jawaban Terbaik

Jika Anda mengompilasinya, Anda mendapatkan pengecualian:

ORA-29535: source requires recompilation
util:7: error: unreported exception IOException; must be caught or declared to be thrown
            Runtime.getRuntime().exec(cmd);
                                     ^

1 error

Anda dapat memperbaikinya (dan beberapa hal kecil lainnya yang tidak memengaruhi kompilasi tetapi tidak perlu disertakan, dan Anda mungkin tidak ingin menggunakan pengenal yang dikutip):

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED util
AS
import java.io.IOException;

public class Util
{
    public static String exec(String cmd) throws IOException
    {
        Runtime.getRuntime().exec(cmd);
        return "";
    }
}

Kemudian mengkompilasi Oracle 18 db<>fiddle.

Catatan: fungsi ini merupakan masalah keamanan besar untuk database Anda dan Anda mungkin harus mencari solusi alternatif daripada mengizinkan eksekusi kode arbitrer.

2
MT0 27 November 2021, 03:59