在OracleDatabase上调用函数而不是返回查询时出现问题

iyfamqjs  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(132)

我试着从python上的其他脚本调用一个函数,该函数必须返回一个查询,而不是在数据库中执行,但它给了我一个错误,因为它看起来像python可以使用“;",我试图消除查询中的每一个”;”,在执行查询后,再次出现错误“oracledb.DatabaseError:ORA-00900:invalid SQL statement”

#This is the function
def queryUpdate0():
    return f"""declare 
                cursor conver_0 is  
                    SELECT a.rowid row_id,  
                    a.PERIODO,a.MSISDN,a.PROCESO,a.PROCESO_2
                    FROM DGB_Fct_Unfcd_Ocp_Hst a
                Begin
                    For c in conver_0 Loop
                        Update DGB_Fct_Unfcd_Ocp_Hst
                        set PROCESO = null,
                            PROCESO_2 = null
                        Where rowid = c.row_id
                        and PERIODO = '{currentDate}'
                    End Loop
                    Commit
                End"""

#This is how I execute the query in the other script
query6 = queries.queryUpdate0()
cursor.execute(query6)

字符串
(The游标已定义)
我已经尝试了其他查询不同的语句,他们没有错误。

yx2lnoni

yx2lnoni1#

  • 不要使用字符串连接(或模板字符串)构建查询,因为这会引入SQL注入漏洞。请使用绑定变量。
  • 您不需要使用游标、循环或PL/SQL,可以在一个UPDATE查询中完成所有这些操作。

就像这样:

cursor.execute(
   """Update DGB_Fct_Unfcd_Ocp_Hst
set    PROCESO = null,
       PROCESO_2 = null
Where  PERIODO = :dt""",
   [currentDate]
)

字符串
如果currentDate总是今天的日期,那么就使用SYSDATE

cursor.execute(
   """Update DGB_Fct_Unfcd_Ocp_Hst
set    PROCESO = null,
       PROCESO_2 = null
Where  PERIODO >= TRUNC(SYSDATE)
AND    PERIODO <  TRUNC(SYSDATE) + 1"""
)


如果你想修复你的代码,然后把;放回去(你只想删除语句终止符,对于PL/SQL来说是尾部的/,而不是;,这是SQL语句的终止符):

def queryUpdate0():
    return f"""declare
                cursor conver_0 is  
                    SELECT a.rowid row_id,  
                    a.PERIODO,a.MSISDN,a.PROCESO,a.PROCESO_2
                    FROM DGB_Fct_Unfcd_Ocp_Hst a;
                Begin
                    For c in conver_0 Loop
                        Update DGB_Fct_Unfcd_Ocp_Hst
                        set PROCESO = null,
                            PROCESO_2 = null
                        Where rowid = c.row_id
                        and PERIODO = :dt;
                    End Loop;
                    Commit;
                End;"""

query6 = queries.queryUpdate0()
cursor.execute(query6, [currentDate])


但这将非常低效。

相关问题