zoukankan      html  css  js  c++  java
  • Create function through MySQLdb

    http://stackoverflow.com/questions/745538/create-function-through-mysqldb

    How can I define a multi-statement function or procedure in using the MySQLdb lib in python?

    Example:

    import MySQLdb
    
    db = MySQLdb.connect(db='service')
    
    c = db.cursor()
    
    c.execute("""DELIMITER //
    CREATE FUNCTION trivial_func (radius float) 
        RETURNS FLOAT
    
        BEGIN
        IF radius > 1 THEN
            RETURN 0.0;
        ELSE
            RETURN 1.0;
        END IF;
    END //
    
    DELIMITER ;""")

    Which creates the following traceback:

    Traceback (most recent call last):
      File "proof.py", line 21, in <module>
        DELIMITER ;""")
      File "build/bdist.macosx-10.5-i386/egg/MySQLdb/cursors.py", line 173, in execute
      File "build/bdist.macosx-10.5-i386/egg/MySQLdb/connections.py", line 35, in defaulterrorhandler
    _mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER //
    CREATE FUNCTION trivial_func (radius float) 
        RETURNS FLOAT
    
       ' at line 1")

    If I copy the same SQL directly into a mysql shell client, it works as expected

     
     

    3 Answers

    The DELIMITER command is a MySQL shell client builtin, and it's recognized only by that program (and MySQL Query Browser). It's not necessary to use DELIMITER if you execute SQL statements directly through an API.

    The purpose of DELIMITER is to help you avoid ambiguity about the termination of the CREATE FUNCTION statement, when the statement itself can contain semicolon characters. This is important in the shell client, where by default a semicolon terminates an SQL statement. You need to set the statement terminator to some other character in order to submit the body of a function (or trigger or procedure).

    CREATE FUNCTION trivial_func (radius float) 
        RETURNS FLOAT
    
        BEGIN
        IF radius > 1 THEN
            RETURN 0.0; <-- does this semicolon terminate RETURN or CREATE FUNCTION?
        ELSE
            RETURN 1.0;
        END IF;
    END

    Since the API typically allows you to submit one SQL statement at a time, there's no ambiguity -- the interface knows that any semicolons inside the body of your function definition don't terminate the whole CREATE FUNCTION statement. So there's no need to change the statement terminator with DELIMITER.

  • 相关阅读:
    Retrofit2.0+OkHttp设置统一的请求头(request headers)
    Retrofit、Okhttp使用小记(cookie,accesstoken,POST
    quartz持久化部署实现
    支付宝支付-常用支付API详解(查询、退款、提现等)
    支付宝支付-提现到个人支付宝
    Git 版本还原命令
    CEF JS实现获取剪贴板图片的DataURL
    CEF 自定义用户协议(scheme)实现以二进制流的方式显示图片、视频、音频
    CEF C++调用前端js方法展示传递过来的图片数据
    C++读写图片数据转成Base64格式
  • 原文地址:https://www.cnblogs.com/kungfupanda/p/5965828.html
Copyright © 2011-2022 走看看