【问题标题】:Java stored procedureJava 存储过程
【发布时间】:2010-06-08 07:54:55
【问题描述】:

我有以下 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());
        }
    }
}
/

我创建了一个程序,将像上面一样运行;

CREATE OR REPLACE PROCEDURE read_ldap
  AS LANGUAGE JAVA
  NAME 'RetreiveLdap.readConfig()';
/

现在,当我从 java 正常运行这个类时,它工作正常,它检索 LDAP 用户列表并将它们保存到数据库中,(当然没有创建或替换...)

但是当我在 Oracle 中将其作为过程运行时,LDAP 中的用户不会被添加到表中。我添加了 addUser("tmp", "tmp"); 只是为了查看我的代码是否执行良好,并且通过这一行确实插入了用户,但在 while 循环中没有插入

当我运行这个程序时,有没有办法查看一些错误?

【问题讨论】:

    标签: java oracle java-stored-procedures


    【解决方案1】:

    我在 SQLPLUS 中添加了以下内容

    SQL> SET SERVEROUTPUT ON
    SQL> CALL dbms_java.set_output(2000);
    

    我现在可以看到错误,这与我的 db 用户访问套接字的权限有关。

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      相关资源
      最近更新 更多