Я пытаюсь использовать библиотеку оракула NPM и обновить некоторые таблицы значениями BLOB, созданными из файлов на моем компьютере. В документации Oracle говорится, что для получения значения, которое примет база данных, используйте функцию createLob(), как показано ниже:
conn.createLob(oracledb.BLOB, function(err, templob) {
if (err) { . . . }
// ... else use templob
});
Но я понятия не имею, что означает "использовать templob"...
Как передать данные в эти объекты oracledb.BLOB?
Обновлено: пример обновления, которое я пытаюсь:
const queryString = `UPDATE TABLENAME SET BLOB = :blob WHERE ID = 1234;`;
this.oracleConnection.execute(queryString,
{blob: await fs.readFileSync('/path/to/image.jpg')}
)
Файлы с моего компьютера, как указано. Файлы имеют переменный размер, но на данный момент все они должны быть меньше 1 МБ.
Исходя из вашего варианта использования (небольшие файлы и ограниченный параллелизм), я думаю, что буферные API будут лучшим выбором, поскольку они очень просты. Из документ:
Учитывая таблицу:
CREATE TABLE mylobs (id NUMBER, c CLOB, b BLOB);
пример INSERT:
var fs = require('fs');
var str = fs.readFileSync('example.txt', 'utf8');
. . .
conn.execute(
`INSERT INTO mylobs (id, myclobcol) VALUES (:idbv, :cbv)`,
{ idbv: 1,
cbv: str }, // type and direction are optional for IN binds
function(err, result) {
if (err)
console.error(err.message);
else
console.info('CLOB inserted from example.txt');
. . .
Кроме того, на случай, если вам это когда-нибудь понадобится, я завершаю мини-сериал по этой теме, но он больше посвящен загрузкам на веб-сервер: https://jsao.io/2019/06/uploading-and-downloading-files-with-node-js-and-oracle-database/
Это все еще дает мне ошибку недопустимого символа по смещению, которое находится внутри буфера. Имеет ли значение, что столбец, который я обновляю, является BLOB, а не CLOB?
Обновленный пост с примером
Неважно, CLOB это или BLOB, драйвер поддерживает оба. Не могли бы вы указать точную ошибку, которую вы получаете? Как правило, такие вещи всегда легче решить с помощью воспроизводимого тестового примера. Кроме того, вам не нужно ждать вызова readFileSync, поскольку это метод синхронизации.
[Ошибка: ORA-00911: недопустимый символ] errorNum: 911, смещение: 64
Примечание: в моей строке 64-е смещение — это точка с запятой.
Ах, с операторами SQL вы не ставите точку с запятой в конце. Просто удалите его и повторите попытку.
Не могли бы вы предоставить более подробную информацию о том, что вы делаете? Откуда берутся BLOB-объекты (файлы на сервере, веб-сервере и т. д.)? Насколько велики BLOB?