stored procedure Java
-
24-10-2019 - |
Domanda
Ho il seguente stored procedure Java:
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());
}
}
}
/
E creo una procedura che verrà eseguito quanto sopra simili;
CREATE OR REPLACE PROCEDURE read_ldap
AS LANGUAGE JAVA
NAME 'RetreiveLdap.readConfig()';
/
Ora, quando si esegue questa classe normalmente da java funziona benissimo, si recupera l'elenco degli utenti LDAP e li salva nel DB, (ovviamente senza il creare o sostituire ...)
Ma quando l'eseguo come una procedura in Oracle forma utenti LDAP non vengono aggiunti alla tabella. Ho aggiunto il addUser("tmp", "tmp");
solo per vedere se i miei codici esegue bene, e con questa linea venga inserito un utente, ma nessuno nel ciclo while
C'è un modo di vedere alcuni errori, quando si esegue questa procedura?
Soluzione
Ho aggiunto nel SQLPLUS seguente
SQL> SET SERVEROUTPUT ON
SQL> CALL dbms_java.set_output(2000);
E sono in grado adesso di vedere gli errori, è stato collegato con il permesso del mio utente db a prese di accesso.