java.sql.SQLException: ORA-28112: failed to execute policy function代码 String sql = "select region from rec_servnumber_region t where ? between beginnum and endnum";
ResultSet rs = null;
String region = "";
ps = conn.prepareStatement(sql);
ps.setString(1, SERVNUMBER); rs = ps.executeQuery();错误指在rs = ps.executeQuery();这一行。

解决方案 »

  1.   

    你把你的sql语句 带个参数 
    复制到数据库中查查看看有没有问题!
      

  2.   

    oracle数据库?
    oracle数据库有个类型varchar2  注意 这个2是不能去掉的  如果去掉就会报这个failed to execute policy function
      

  3.   

    赋值了,public String getRegionFormServNum(String SERVNUMBER, Connection conn) throws Exception{
    PreparedStatement ps = null;
    String sql = "select region from rec_servnumber_region t where ? between beginnum and endnum";
    ResultSet rs = null;
    String region = "";
    ps = conn.prepareStatement(sql);
    ps.setString(1, SERVNUMBER); rs = ps.executeQuery();
    while (rs.next()) {
    region = rs.getString("region");
    }
    if (region == null || region.equals("")) {
    region = "";
    throw new SQLException("手机号码"+SERVNUMBER+"在表rec_servnumber_region中没有对应的region信息");
    }
    try {
    if (ps != null) {
    ps.close();
    }
    } catch (SQLException e1) {
    e1.printStackTrace();
    }
    return region;
    }
      

  4.   

    你的Connection 对象打开了吗?
      

  5.   

    select region from rec_servnumber_region t where ? between beginnum and endnum你这sql能执行???beginnum、endnum这2个参数应该要给他赋值吧!
      

  6.   

    between and 中间不能用列名吧,必须是确定的值才行
      

  7.   

    java.sql.SQLException: ORA-28112: failed to execute policy function
            at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
            at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
            at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)
            at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)
            at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:830)
            at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2391)
            at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2672)
            at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)
            at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:527)
            at com.huawei.guo.services.ExcelIntoDbBean.getRegionFormServNum(ExcelIntoDbBean.java:151)
            at com.huawei.guo.services.ExcelIntoDbService.insertCheck_gift(ExcelIntoDbService.java:189)
            at com.huawei.guo.services.ExcelIntoDbService.insertCheck(ExcelIntoDbService.java:106)
            at com.huawei.guo.process.ExcelToDB.main(ExcelToDB.java:106)
    请大家帮忙!
      

  8.   

    你先别用预编译 直接用SQL 执行试试 有可能是字符加上了点引号select region from rec_servnumber_region t where SERVNUMBER between beginnum and endnum
    这种写法是没问题的
      

  9.   

    网上很多 搜下  oracle错误码
      

  10.   

    首先数据库问题 确认连接是否成功 然后复制sql代码 运行试试 然后在看传递参数格式是否正确就差不多了
      

  11.   


    他说的非常对,你应该先在数据库命令行下面 输入   "select region from rec_servnumber_region t where 15922222222  between beginnum and endnum";(假设你找的是159222222这个号码)。。你看会不会报错,能不能得到结果。。总 觉得你的这句话  String sql = "select region from rec_servnumber_region t where ? between beginnum and endnum";  怪怪的! 我估计是这一行出错了。
     在使用 betweetn and 的时候,应该 这样吧:  列名 betweetn 参数1 and 参数2
    你怎么这样弄、
    建议你把你的数据库  rec_servnumber_region 贴出来大家看看 就知道你的错误在哪了。。
      

  12.   

    String sql = "select region from rec_servnumber_region t where ? between beginnum and endnum";你把这个?用到的参数直接用字符串拼出来,不能这么写的。String sql = "select region from rec_servnumber_region t where "+SERVNUMBER+" between beginnum and endnum";
      

  13.   

    同意楼上的 我刚实现了类似的这个程序,不过我用的是mysql数据库
      

  14.   

    String sql = "select region from rec_servnumber_region t where ? between beginnum and endnum";where后面要跟字段名,你传参数是什么意思
    1.如果是传列名的话,直接拼sql吧 "select region from rec_servnumber_region t where " +SERVNUMBER+"……"
    2.如果是传值,那么你这个sql写的就有问题了
    3.如果beginnum  和 endnum 是列,该这么写:
    String sql = "select region from rec_servnumber_region t where ? > beginnum and ?<endnum"
      

  15.   

    public class test { public static void main(String[] args) {
    Connection conn = null;
    PreparedStatement ps = null;
    String sql = "select region from rec_servnumber_region t where ? between beginnum and endnum";
    ResultSet rs = null;
    String region = "";
    try {
    conn = DBConnect.getConnection1();
    ps = conn.prepareStatement(sql);
    String SERVNUMBER = "13561440001";
    ps.setString(1, SERVNUMBER);
    rs = ps.executeQuery();
    while (rs.next()) {
    region = rs.getString("region");
    }
    if (region == null || region.equals("")) {
    region = "";
    throw new SQLException("手机号码" + SERVNUMBER
    + "在表rec_servnumber_region中没有对应的region信息");
    }
    System.out.println("region = " + region); } catch (SQLException e) {

    e.printStackTrace();
    }
    }}
      

  16.   

    没问题可以打印出region的结果。
      

  17.   

    public class test { public static void main(String[] args) {
    Connection conn = null;
    PreparedStatement ps = null;
    String SERVNUMBER = "13561440001";
    String sql = "select region from rec_servnumber_region t where '"+SERVNUMBER+"'> beginnum and '"+SERVNUMBER+"'< endnum";
    ResultSet rs = null;
    String region = "";
    try {
    conn = DBConnect.getConnection1();
    ps = conn.prepareStatement(sql);

    //ps.setString(1, SERVNUMBER);
    rs = ps.executeQuery();
    while (rs.next()) {
    region = rs.getString("region");
    }
    if (region == null || region.equals("")) {
    region = "";
    throw new SQLException("手机号码" + SERVNUMBER
    + "在表rec_servnumber_region中没有对应的region信息");
    }
    System.out.println("region = " + region); } catch (SQLException e) {

    e.printStackTrace();
    }
    }
    }这个也行,都是一样的。不知道为什么测试的就给我说报错呢。
      

  18.   

    难道是你的Oracle的驱动包有问题?这样的写法的确是可以的,刚刚测试了一下。
      

  19.   

    贴上测试代码:
    /**
     * 
     */
    package com.jonathan.jdbc;import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;/**
     * @author Jonathan Shengwq
     *
     */
    public class JDBCDemo { /**
     * 
     */
    public JDBCDemo() {
    } public static void testORA28112OnOracle9i() {
    try {
    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
    // orcl为数据库的SID  
    String url = "jdbc:oracle:thin:@192.168.1.26:1521:orcl"; 
    String user = "trackao_nbyz_0518";  
    String password = "trackao_nbyz_0518";
    String resultIdString = "";

    Connection connection = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;

    connection = DriverManager.getConnection(url, user, password);
    String sql = "select * from SINGLE_DATA t where t.operation_id = ? and ? between t.value1 and t.value2"; stmt = connection.prepareStatement(sql);

    stmt.setString(1, "CS110009855");
    stmt.setString(2, "62");

    rs = stmt.executeQuery();
    while (rs.next()) {
    resultIdString = rs.getString("id");
    System.out.println(resultIdString);
    }

    stmt.close();
    connection.close();

    System.out.println("Successed!!!");
    } catch (InstantiationException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (SQLException e) {
    e.printStackTrace();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
    testORA28112OnOracle9i();
    }}
      

  20.   

    这是由于prepareStatement的机制造成的,很显然,你想通过赋值的方式动态改变表中的字段,但是你通过这种方式来实现是行不通的。具体分析如下:
    1 String sql = "select region from rec_servnumber_region t where ? between beginnum 2 and endnum";
    3 ResultSet rs = null;
    4 String region = "";
    5 ps = conn.prepareStatement(sql);
    6 ps.setString(1, SERVNUMBER);7 rs = ps.executeQuery();错误肯定是在第7行,你想得到的sql语句是这样:
    select region from rec_servnumber_region t where SERVNUMBER between beginnum 2 and endnum
    然而你通过第6行:ps.setString(1, SERVNUMBER);这种方式得到的sql语句是这样的:select region from rec_servnumber_region t where "SERVNUMBER" between beginnum 2 and endnum
    所以,当你执行ps.executeQuery()的时候就有问题了,问题是找不到"SERVNUMBER"这个字段。
    解决方案:动态改变表名或字段名时,采用拼接字符串的形式。
    具体代码如下:
    String sql = "select region from rec_servnumber_region t where " + 字段变量名 + " between beginnum 2 and endnum";
    ResultSet rs = null;
    String region = "";
    ps = conn.prepareStatement(sql);rs = ps.executeQuery();
      

  21.   

    between...and...
    提示function没有授权...
    ?oracle不知道是什么类型...
      

  22.   

    先把sql语句简化下看看,把
    String sql = "select * from SINGLE_DATA t where t.operation_id = ? and ? between t.value1 and t.value2";简化成
    String sql = "select * from SINGLE_DATA t where t.operation_id = ?";
    后面的相关代码也跟着改变或注销下有可能是你的jdbc驱动部分,不支持between这个sql 关键词
      

  23.   

    jdbc的参数传递确实是从1开始计数的.....正在看29楼的解决思路.
      

  24.   

    你这个不是number类型吗?
    setString or setInt自己考虑吧。使用ps.setInt(1, SERVICENUMBER)
      

  25.   

    String sql = "select region from rec_servnumber_region t where beginnum<=? and ?<=endnum";
    ResultSet rs = null;
    String region = null;
    ps = conn.prepareStatement(sql);
    ps.setString(1, SERVNUMBER); // setString or setInt
    ps.setString(2, SERVNUMBER);rs = ps.executeQuery();
      

  26.   

    恩,我也觉得。
    可以用把sql语句的字符串分段试试。
    同时注意between语法。
      

  27.   

    说 再说是 1和0的问题 我操死你  基础这个么 差 回答个鸡巴 问题啊 直接告诉 你 如果用问号绝对不行  
    只有这样select region from rec_servnumber_region t where “+SERVNUMBER+” between beginnum and endnum"
    第二点确保  SERVNUMBER传进来的实际参数在 rec_servnumber_region中有值
    ps.setString(index, value); 好好理解一下  是设置 第一个参数对应的值是value 连参数都没有如何设置
    相当于  key-value形式  不要做 无用功 直接这样就搞定 
    select region from rec_servnumber_region t where “+SERVNUMBER+” between beginnum and endnum"
    好好看下 API 
      

  28.   

    应该是这个问题,表名,字段名只能自己替换,用?是来替换value的
      

  29.   

    那我坑下声,我这样写没有错,不信的可以jdbc试试,优化了一下程序获得连接的代码,就没事了。