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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top