Java gespeicherte Prozedur
-
24-10-2019 - |
Frage
Ich habe das folgende Java -gespeicherte Verfahren:
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "RetreiveLdap" AS
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
public class RetreiveLdap {
// LDAP CONFIG
public static String CONTEXT = "com.sun.jndi.ldap.LdapCtxFactory";
public static String HOST = "ldap://192.168.30.12:389";
public static String USER = "cn=root,dc=company";
public static String PASSWORD = "pa55w0rd";
public static String BASE = "dc=company";
// Reads from LDAP
public static void readConfig() throws NamingException, SQLException {
try {
addUser("tmp", "tmp");
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, CONTEXT);
env.put(Context.PROVIDER_URL, HOST);
env.put(Context.SECURITY_PRINCIPAL, USER);
env.put(Context.SECURITY_CREDENTIALS, PASSWORD);
DirContext ctx = new InitialDirContext(env);
SearchControls sc = new SearchControls();
sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
String filter = "(objectClass=person)";
NamingEnumeration items = ctx.search(BASE, filter, sc);
System.out.println("STARTING...");
while (items != null && items.hasMore()) {
SearchResult sr = (SearchResult) items.next();
String cn = (String) sr.getAttributes().get("cn").get();
String sn = (String) sr.getAttributes().get("sn").get();
System.out.println("WORKING...");
// save to table
addUser(cn, sn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// Add LDAP user to DB.
public static void addUser(String cn, String sn) {
try {
Connection conn = DriverManager
.getConnection("jdbc:default:connection:");
String sql = "INSERT INTO ldapuser " + "(cn,sn) " + "VALUES(?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, cn);
pstmt.setString(2, sn);
pstmt.executeUpdate();
pstmt.close();
} catch (SQLException e) {
System.err.println("ERROR: " + e.getMessage());
}
}
}
/
Und ich erstelle eine Prozedur, die das oben genannte ausführt.
CREATE OR REPLACE PROCEDURE read_ldap
AS LANGUAGE JAVA
NAME 'RetreiveLdap.readConfig()';
/
Wenn ich diese Klasse normalerweise aus Java ausführe, funktioniert sie gut, ruft sie die Liste des LDAP -Benutzers ab und speichert sie in die DB (natürlich ohne das Erstellen oder Ersetzen ...)
Wenn ich es jedoch als Prozedur in Oracle ausführe, werden die Benutzer LDAP nicht zur Tabelle hinzugefügt. Ich habe das hinzugefügt addUser("tmp", "tmp");
Nur um zu sehen, ob meine Codes gut ausgeführt werden, und mit dieser Zeile wird ein Benutzer eingefügt, aber keine in der while -Schleife
Gibt es eine Möglichkeit, einige Fehler zu erkennen, wenn ich diese Prozedur ausführe?
Lösung
Ich habe in sqlplus Folgendes hinzugefügt
SQL> SET SERVEROUTPUT ON
SQL> CALL dbms_java.set_output(2000);
Und ich bin jetzt in der Lage, die Fehler zu erkennen, es war mit der Erlaubnis meines DB -Benutzers zugeordnet, auf Sockets zuzugreifen.