当前位置: 首页 > 知识库问答 >
问题:

JDBC存储过程语法

缪茂勋
2023-03-14

我是使用JDBC和MariaDB创建存储过程的初学者。当我创建过程时,我得到一个错误。我从昨天开始就遇到了这个问题:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '@auth_id varchar(15),@auth_fname varchar(20) output,@auth_lname varchar(20) o...' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.Util.getInstance(Util.java:408)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)

到目前为止,我尝试了以下代码。我不知道是什么原因造成了这个错误。

public class Jdbcc {
    
    Connection con;
    PreparedStatement pst;
    
    public Jdbcc()
    {
        Connect();
       }
    public void Connect()
    {
      try 
      {
   Class.forName("com.mysql.jdbc.Driver");
       con = DriverManager.getConnection("jdbc:mysql://localhost/abclibrary", "root","");     
       String str = "CREATE PROCEDURE authors @auth_id varchar(15), @auth_fname varchar(20) output, @auth_lname varchar(20) output AS SELECT @auth_fname=auth_fname,@auth_lname= auth_lname FROM authors where auth_id=@auth_id";

                          Statement stmt = con.createStatement();
                          int k = stmt.executeUpdate(str);
                          System.out.println("Created.......");

    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    }

    public static void main(String args[])
    {
        Jdbcc jk = new Jdbcc();
    }
}

共有2个答案

施越彬
2023-03-14

注意空间:

String str = "CREATE PROCEDURE authors @auth_id varchar(15), @auth_fname varchar(20) output, @auth_lname varchar(20) output "
                           +"AS "
                           +"SELECT @auth_fname=auth_fname,@auth_lname= auth_lname " //you missed space here
                           + "FROM authors " //and here
                           +"where auth_id=@auth_id";

auth\u lnameFROMauthorswhere是问题所在

董联
2023-03-14

使用以下内容创建存储过程:

       String str = "CREATE PROCEDURE authors (p_auth_id varchar(15), OUT p_auth_fname varchar(20), OUT p_auth_lname varchar(20))\n" +
                    "BEGIN\n" +
                    "  SELECT auth_fname, auth_lname INTO p_auth_fname, p_auth_lname FROM authors where auth_id = p_auth_id;\n" +
                    "END;";

我所作的改动如下:

  • 不要用@作为过程参数名称的前缀。我在参数名中添加p前缀,这样它们就不会与列名冲突
  • 您需要将过程参数列表用括号括起来
  • 通过在参数名称之前指定OUT,而不是在参数名称之后指定Output来识别输出参数
  • 您不能写入选择variable1=column1,variable2=column2 在其他数据库中也可以这样做。而是写选择column1,column2。。。分为变量1,变量2
  • 程序主体已包装在BEGIN中<代码>结束

在我进行这些更改之后,我可以使用您的Java类来创建存储过程,然后从MariaDB控制台调用它。

顺便说一句,如果存储过程已经存在,您可以使用CREATE或REPLACE-procedure 而不是创建过程 ,它将替换现有存储过程。

另请参阅MariaDB留档CREATE PROCEDURE

 类似资料:
  • 主要内容:创建CallableStatement对象,关闭CallableStatement对象,JDBC SQL转义语法在讨论JDBC Statement教程文章时,我们已经学习了如何在JDBC中使用存储过程。 本教程文章与该部分类似,但它将讲解演示有关JDBC SQL转义语法的其他信息。 就像对象创建和对象一样,它可使用同样的方式创建对象,该对象将用于执行对数据库存储过程的调用。 创建CallableStatement对象 假设需要执行以下Oracle存储过程 - 注意:上面的存储过程是为O

  • 我创建了一个存储过程,如下所示: //mysql中的存储过程 并且我正在调用Java中的存储过程,如下所示: //使用JDBC调用存储过程 但它显示了一个编译时异常,如下所示: CAN在参数中为存储的函数调用的返回值设置。

  • 这件事困扰了我很久,所以我想在这里得到一些帮助:) 我正在使用JDBC连接到一个老旧的Sybase Adaptive server 6(!!!)我甚至在网上找不到它的JDBC驱动程序,所以我从安装目录中复制了它们:) 现在,插入和查询以及所有其余的db操作都工作得很好,但是我在调用存储过程时遇到了问题。让我们首先从一段代码开始: 提前道谢!/IVO

  • 我有一个非常复杂的oracle存储过程,它搜索和检索一些数据。该过程返回一个输出参数-oracle游标。我通过JDBC执行过程: 问题是,查询有时会花费相当长的时间(几分钟),我希望用户能够通过单击按钮随时取消查询。我引用了stmt对象,但不幸的是(从其他线程)调用stmt.cancel()没有效果。 另一方面,当我将CallableStatement sql更改为以下查询时: 在调用stmt.c

  • 我正在使用准备好的语句jdbc模板运行一个存储过程: 我的存储过程基本上是一个存储过程调用另外两个存储过程。 我遇到的问题是,如果在存储过程的第一条语句之后有一个异常,那么该异常不会返回到jdbc模板,所以看起来我的存储过程对我的Java代码起作用,即使它没有,这显然是有问题的。 有没有一种方法可以手动检查存储过程的输出或者使所有可能的异常冒泡到Java?

  • 数据访问层支持存储过程调用,调用数据库存储过程使用下面的方法: $resultSet = Db::query('call procedure_name'); foreach ($resultSet as $result) { } 存储过程返回的是一个数据集,如果你的存储过程不需要返回任何的数据,那么也可以使用execute方法: Db::execute('call procedure_name'