oracle如何检查sql语法错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle如何检查sql语法错误相关的知识,希望对你有一定的参考价值。

MSSQL可以通过
set NOEXEC ON 或是set NOEXEC off 来检查sql语法错误,oracle有类似函数吗?

如果只是处于检查语法,可以在sql的where中拼上 and 1=2
或者用DBMS_SQL.PARSE追问

可以在sql的where中拼上 and 1=2
这个检查查询语句可以,其他的必行了吧,要的是所有语句
DBMS_SQL.PARSE 怎么用的,能写个例子不?
谢啦

追答


create or replace function test return varchar2 as

v_cursor number;

v_string varchar2(200);

v_row number;

begin

v_cursor:=dbms_sql.open_cursor;

--v_string:=\'update fnd_user a set a.description=\'\'fred\'\' where a.user_id=1055\';

v_string:=\'create table testdb (text varchar2(200))\';

dbms_sql.parse(v_cursor,v_string,dbms_sql.native);

v_row:=dbms_sql.execute(v_cursor);

dbms_sql.close_cursor(v_cursor);

return (\'成功执行\');

exception

when others then

dbms_sql.close_cursor(v_cursor);

return (\'执行失败!\'||sqlcode||sqlerrm);

raise;
end;

追问

DBMS_SQL.PARSE 这个是执行动态的sql吧,mssql中也有类似的
想问下oracle中有类似mssql中的set NOEXEC ON 或是set NOEXEC off 来检查sql语法错误的方法吗?

追答

这个貌似没有,我才疏学浅了

参考技术A Oracle请使用PL/SQL Developer软件调试SQL语句,该软件检查功能还是不错的!追问

oracle有类似函数吗?
工具自然知道有,能用的还很多,要问的是有类似函数吗?

追答

查错函数我没见过

我如何解决以下sql语法错误

【中文标题】我如何解决以下sql语法错误【英文标题】:How do i solve the following sql syntax error 【发布时间】:2020-12-19 19:14:39 【问题描述】:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ':Username, :passw, :addrss, :DOB, :emil, :ag)' 附近使用正确的语法

代码:

def submit():
    
    my_cursor = mydb.cursor()

    #INSERT INTO TABLE

    my_cursor.execute("INSERT INTO madhav VALUES (:Username, :passw, :addrss, :DOB, :emil, :ag)",
        
            'Username': Username.get(),
            'passw'   : passw.get(),
            'addrss'  : addrss.get(),
            'DOB'     : DOB.get(),
            'emil'    : emil.get(),
            'ag'      : ag.get()
        )


    mydb.commit()
    mydb.close()


    # Clear The Text Boxes
    Username.delete(0,END)
    passw.delete(0,END)
    addrss.delete(0,END)
    DOB.delete(0,END)
    emil.delete(0,END)
    ag.delete(0,END)

上述函数用于使用 GUI 将值插入数据库

【问题讨论】:

显示“CREATE TABLE”SQL 并解释从Username.get() 等返回的数据类型是什么。 ...顺便说一句,您为什么要留下信件? passw 的输入并不比password 容易,而且后者更清晰。 emilemail 同上。事实上,完整的单词可能更容易输入,因为它们是你可能有肌肉记忆的真实单词。清晰度很重要。在源代码的此处或此处保存一个字节没有任何好处。 my_cursor.execute("CREATE TABLE madhav (name VARCHAR(255), password VARCHAR(255), address VARCHAR(255), DT DATE, email VARCHAR(255), age INTEGER(10), user_id INTEGER AUTO_INCREMENT Primary key)") 这是创建表sql 【参考方案1】:

这不是您在 mydb 中使用命名参数的方式。这种参数的正确语法是%(name)s。所以,在你的情况下:

my_cursor.execute("INSERT INTO madhav VALUES (%(Username)s, %(passw)s, %(addrss)s, %(DOB)s, %(emil)s, %(ag)s)",
    
        'Username': Username.get(),
        'passw'   : passw.get(),
        'addrss'  : addrss.get(),
        'DOB'     : DOB.get(),
        'emil'    : emil.get(),
        'ag'      : ag.get()
    )

【讨论】:

感谢您的代码,但弹出另一个错误说 mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '' 附近使用正确的语法......如果错误/怀疑是愚蠢的,我对此很抱歉 @tyzion 我错过了values 子句末尾的结尾),我深表歉意。已编辑和修复。 @Mureinik 为什么%s ..如果您可以在答案中添加它,它将帮助很多像我这样的路人.. 谢谢。 @AbhishekRai 正如我所指出的,这是 mydb 用于命名参数的语法。不太清楚如何进一步澄清这一点...... @Mureinik 好吧,您的这条评论将帮助路人。 :)【参考方案2】:

这些值采用变量类型,如字符串、整数等。 所以你的代码会变成

stmt= ( “INSERT INTO madhav(用户名、密码、地址、出生日期、emil、ag)” “值(%s、%s、%s、%s、%s、%s)” )

因为所有字段都是字符串类型,所以有 %s 否则对于整数它将是 %i 接下来,您可以将此 stmt 与要执行的数据绑定。

data = (Username.get(), passw.get(), addrss.get(), DOB.get(),emil.get(),ag.get()) my_cursor.execute(stmt, data)

查看这些文档了解更多信息 https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html

【讨论】:

以上是关于oracle如何检查sql语法错误的主要内容,如果未能解决你的问题,请参考以下文章

我如何解决以下sql语法错误

如何在 SQL Developer 中检查语法 Oracle 存储过程?

SQL 语法错误:您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册

如何调试“您的 SQL 语法有错误”

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 对应的手册

SQL 错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法