Как вызвать DBMS_CRYPTO.HASH при вставке CLOB в Oracle с Python? - PullRequest
0 голосов
/ 09 июня 2018

Я храню CLOB в Oracle.Чтобы ускорить поиск идентичных объектов CLOB, я хотел бы ввести значение хеш-функции объектов CLOB.До сих пор я пробовал:

  1. ВСТАВИТЬ КЛОБ
  2. ОБНОВИТЬ значение хеш-функции, основанное на сохраненном буфере.

Как это можно сделать за один раз?операция вместо двух?

#!/usr/local/bin/python3
import cx_Oracle

con = cx_Oracle.connect('scott/tiger@localhost:1512/ORCLPDB1', encoding="UTF-8")
cursor = con.cursor()
cursor.execute("CREATE TABLE t (id NUMBER, script CLOB, script_hash RAW(32))")  

my_text = '$'*2**10

statement = "INSERT INTO t (id, script) VALUES (:my_id, :my_clob)"
cursor.execute(statement, (1, my_text))

statement = """
    UPDATE t 
       SET script_hash = DBMS_CRYPTO.HASH(script, 2) 
     WHERE id = :my_id"""
cursor.execute(statement, {'my_id': 1})

con.commit()    
con.close()

Это не работает:

statement = """
   INSERT INTO t (id, script, script_hash) 
   VALUES (:my_id, :my_clob, DBMS_CRYPTO.HASH(:my_clob, 2))"""
cursor.execute(statement, (2, my_text, my_text))

# cx_Oracle.DatabaseError: ORA-01465: invalid hex number

(Oracle 12.2 с использованием Python и cx_Oracle 6.3)

1 Ответ

0 голосов
/ 09 июня 2018

Это работает для меня, по общему признанию с Oracle 11g XE (и cx_Oracle 6.3.1):

statement = """
   DECLARE
      l_clob         CLOB   := :my_clob;
   BEGIN
     INSERT INTO t (id, script, script_hash) 
       VALUES (:my_id, l_clob, DBMS_CRYPTO.HASH(l_clob, 2));
   END;"""

cursor.execute(statement, (my_text, 2))

Я не смог воспроизвести вашу ошибку ORA-01465: invalid hex number с вашим нерабочим кодом: мой11g XE база данных выдала мне ошибку ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column.

...