[英]Java stored procedure
I have the following Java 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());
}
}
}
/
And I create a procedure that will run the above like; 我创建了一个将像上面一样运行的过程;
CREATE OR REPLACE PROCEDURE read_ldap
AS LANGUAGE JAVA
NAME 'RetreiveLdap.readConfig()';
/
Now, when I run this class normally from java it works fine, it retrieves the list of LDAP user and saves them into the DB, (of course without the create or replace...) 现在,当我从Java正常运行此类时,它运行良好,它将检索LDAP用户列表并将其保存到数据库中(当然,无需创建或替换...)
But when I run it as a procedure in Oracle the users form LDAP do not get added to the table. 但是,当我将它作为Oracle中的过程运行时,LDAP形式的用户不会添加到表中。 I have added the addUser("tmp", "tmp");
我添加了addUser("tmp", "tmp");
just to see if my codes executes well, and with this line a user does get inserted, but none in the while loop 只是看我的代码是否执行良好,并在此行插入了用户,但在while循环中没有
Is there a way to see some errors, when I run this procedure? 当我运行此过程时,有没有办法看到一些错误?
I have added in SQLPLUS the following 我在SQLPLUS中添加了以下内容
SQL> SET SERVEROUTPUT ON
SQL> CALL dbms_java.set_output(2000);
And I am able now to see the errors, it was related to the permission of my db user to access sockets. 现在,我能够看到错误,这与我的数据库用户访问套接字的权限有关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.