1

我正在尝试执行具有序列号列但无法确定返回值的插入语句。

当我在没有绑定 seqvalue 的情况下执行以下语句时,出现错误。当我将 seqvalue 初始化为 0 并将其绑定时,输出为 0。

代码

    col2 = 'test'
    qry=insert into table1 (col1,col2) value (seq1.nextval,:col2) returning col1 into :seqvalue

   cur.excute(qry,:col2)

请提供您的意见。

4

2 回答 2

1

您可以尝试使用绑定变量和准备语句,它们将使用与 SEQ.nextval 相同的 oracle 方法。脚步 :

  1. 使用 cx_Oracle 建立数据库连接。

  2. 从数据库连接中获取游标。

  3. 声明变量:将被推送到 Oracle 插入语句中。例如下面:

var_CHANGES = '测试更改' var_COMMENTS = '测试'

  1. 使用下一行字符创建一个语句,如下例所示:

statement = "INSERT"                    + "\n" + \
       "INTO   CHANGE_LOG"    + "\n" + \
       "( CHANGE_LOG_ID"      + "\n" + \
       ", CHANGE_TYPE"             + "\n" + \
       ", CHANGE_DATE"            + "\n" + \
       ", COMMENTS )"              + "\n" + \
       "VALUES"                    + "\n" + \
       "( CHANGE_LOG_SEQ.nextval" + "\n" + \
       ", :bCHANGE_TYPE"               + "\n" + \
       ", sysdate"              + "\n" + \
       ", :bCOMMENTS )"

然后,使用正则表达式替换格式查询:

stmt = re.sub('\s+',' ',stmt.replace('\n',' ').replace('\r',''))

  1. 使用 cursor.execute 执行查询。按照上面的例子:

cursor.execute(statement, bCHANGE_TYPE=var_CHANGES     \
                        , bCOMMENTS = var_COMMENTS )

  1. 执行提交语句

因此,在这里您可以像在普通 SQL 查询中一样使用 SQL nextval() 和 sysdate。这应该为您完成这项工作。

于 2017-04-12T20:18:06.693 回答
0
  1. 在数据库中创建序列:创建序列 my_seq minvalue 1 maxvalue 99999999999999 以 1 为增量 start with 1 nocache noorder nocycle;

  2. 创建Oracle函数生成数据库中的序列号: 创建或替换函数 gen_seq 返回数字为Seq_value数字;开始

      Select my_seq.nextval into seq_value from dual;
      Return seq_value;
    

    结尾;

  3. self.emp_id = cur.callfunc('gen_seq', int)

  4. 使用 self.emp_id 作为绑定变量,以便插入到您的数据库中。

任何疑问。请随时询问。

于 2020-06-03T17:49:51.600 回答