Java JDBC存储过程语法

Java JDBC存储过程语法,java,jdbc,mariadb,Java,Jdbc,Mariadb,我是使用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 n

我是使用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();
    }
}

注意空间:

String str=“创建过程作者@auth\u id varchar(15)、@auth\u fname varchar(20)输出、@auth\u lname varchar(20)输出”
+“作为”
+“选择@auth\u fname=auth\u fname,@auth\u lname=auth\u lname”//此处缺少空格
+“来自作者”//和此处
+“其中auth_id=@auth_id”;

auth\u lnameFROM
authorswhere
是问题所在

使用以下方法创建存储过程:

String str=“创建过程作者(p\u auth\u id varchar(15)、OUT p\u auth\u fname varchar(20)、OUT p\u auth\u lname varchar(20))\n”+
“开始\n”+
从auth\u id=p\u auth\u id的作者中选择auth\u fname,auth\u lname到p\u auth\u fname,p\u auth\u lname;\n+
“结束;”;
我所作的改动如下:

  • 不要用
    @
    作为过程参数名称的前缀。我在参数名中添加了
    p
    前缀,这样它们就不会与列名冲突
  • 您需要将过程参数列表用括号括起来
  • 通过在参数名称之前指定
    OUT
    ,而不是在参数名称之后指定
    Output
    来识别输出参数
  • 您不能像在其他数据库中那样编写
    选择variable1=column1,variable2=column2,…
    。而是写
    选择column1,column2。。。分为变量1、变量2、…
  • 程序主体已包装在
    BEGIN
    中<代码>结束
在我做了这些更改之后,我可以使用您的Java类来创建存储过程,然后从MariaDB控制台调用它

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


另请参见。

我不认为这是您要问的具体问题,但是您通过连接字符串创建的SQL在
auth\u lname
from
之间以及
作者之间和
where
之间需要空格。那么如何正确编写它呢sir@NisaYathu-保存格式要容易得多。然而,很少有个人和团队开始使用Java15。对于低于15的版本,避免此类问题的最佳方法是首先键入
,然后在双引号之间复制并粘贴字符串,IDE会自动将字符串分成多行,保留空格,并转义字符,如
\
、双引号等。
authors@auth\u id varchar(15)、@auth\u fname varchar(20).
应该在括号内。检查语法在我尝试了代码,但相同的错误我更新了代码,请看仍然有问题