Size: a a a

NodeUA - JavaScript and Node.js in Ukraine

2020 November 25

ES

Elena Sharovar in NodeUA - JavaScript and Node.js in Ukraine
эх, я не оракловод ) как все там сложно однако, пишут что нужно еще селект делать?? https://stackoverflow.com/a/34925514/1768553
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
Ну пока не получается так как там. Но пороюсь в этом направлении. Спасибо
источник

DK

Dmytro Kucheryavy in NodeUA - JavaScript and Node.js in Ukraine
Тёмыч
Ну пока не получается так как там. Но пороюсь в этом направлении. Спасибо
Спробуйте так
DECLARE p_key VARCHAR2(255);
BEGIN
insert into TOYS (TOY_ID, TOY_NAME, COLOUR) VALUES (17, 'Test3', 'Red') RETURNING TOY_ID INTO :p_key;
END;
В документації є відповідний розділ і приклад
https://oracle.github.io/node-oracledb/doc/api.html#-213-dml-returning-bind-parameters
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
[2020-11-25 15:13:27] PLS-00308: эта конструкция недопустима в качестве исходного значения
источник

DK

Dmytro Kucheryavy in NodeUA - JavaScript and Node.js in Ukraine
Тёмыч
[2020-11-25 15:13:27] PLS-00308: эта конструкция недопустима в качестве исходного значения
змініть тип p_key на NUMBER і покажіть також JS
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
Dmytro Kucheryavy
змініть тип p_key на NUMBER і покажіть також JS
Ну це ж кейс абстрактний, там все що завгодно може бути. А про зміну типу цікаво, спробую додати CAST. JS там поки немає, є тільки sql
источник

DK

Dmytro Kucheryavy in NodeUA - JavaScript and Node.js in Ukraine
кастувати не потрібно, краще виставити правильний тип. Але скоріш за все неявне перетворення виконається. Якщо тільки pl/sql, то має працювати без знака привязки змінної -  Ваш перший варіант.  Але шоб скористатись p_key його повернути потрібно, або зберегти в іншу таблицю.
Щоб вивести можна додати DBMS_OUTPUT.PUT_LINE - аналог console.log , але це тільки для візуального перегляду - для отримання результату в ноду лінк вище.
источник

С

Сергей in NodeUA - JavaScript and Node.js in Ukraine
Тёмыч
господа, ща будет тупой вопрос...
Есть запрос, к примеру такой

DECLARE p_key VARCHAR2(255);
BEGIN
insert into TOYS (TOY_ID, TOY_NAME, COLOUR) VALUES (17, 'Test3', 'Red') RETURNING TOY_ID INTO p_key;
END;

но при выполнении p_key не возвращается. Его как-то нужно запросом просить?
Так вот же у тебя в доке наисано http://knexjs.org/#Builder-returning
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
Та написано то написано, но не работает
источник

С

Сергей in NodeUA - JavaScript and Node.js in Ukraine
Ну скинь, как ты инсерт с ретурном делаешь через кнекс.
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
Сергей
Ну скинь, как ты инсерт с ретурном делаешь через кнекс.
я хз куда его там можно причеинить, что бы работало, если допустим сделать так (ну конкатенации в не будет, но тут это я думаю не принципиально)
const result = await knex.transaction(trx => {
                 knex.raw(
                   insert INTO ${tableName}  (${keys}) VALUES (${values}))
                   .transacting(trx)
                   .then(trx.commit)
                   .catch(trx.rollback)
               }).catch(e => {
                 reject(e);
               });
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
если делать knex(tableName).returning(field).insert(...); то запись не добавляется, т.к. оракл ждет commit
источник

С

Сергей in NodeUA - JavaScript and Node.js in Ukraine
Тёмыч
если делать knex(tableName).returning(field).insert(...); то запись не добавляется, т.к. оракл ждет commit
в доке по ссыдке чуть ниже пример с транзакцией
var Promise = require('bluebird');
knex.transaction(function(trx) {
 knex('books').transacting(trx).insert({name: 'Old Books'})
   .then(function(resp) {
     var id = resp[0];
     return someExternalMethod(id, trx);
   })
   .then(trx.commit)
   .catch(trx.rollback);
})
.then(function(resp) {
 console.log('Transaction complete.');
})
.catch(function(err) {
 console.error(err);
});
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
я видел, у меня он не работает
источник

С

Сергей in NodeUA - JavaScript and Node.js in Ukraine
Только перед инсертом еще ретурнинг добавить,  не?
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
Сергей
Только перед инсертом еще ретурнинг добавить,  не?
не-а
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
ну я вот нагуглил что... http://www.dba-oracle.com/t_select_last_100_rows.htm

что нужно добавить sequance, который будет или давать строкам нумерацию, или цеплять к ним дату создания. Но в моем кейсе я не могу добавять к БД свои sequance. Поэтому я сделал немного иначе. Если я вижу, что поле генерируется автоматически, то значит там есть sequance. я его могу получить и он будет выглядеть типа: "ADMIN"."ISEQ$$_41978".nextval
Потом, после транзакции в этой сессии я могу запросить:
SELECT "ADMIN"."ISEQ$$_41978".currval FROM имя_таблицы;
источник

С

Сергей in NodeUA - JavaScript and Node.js in Ukraine
Ну тогда вариант.  Вместо блока pl/sql, кот. ты скинул, и у которого своя область видимости,  поэтому ниче не возвращается,  сделать хранимую функцию,  внутри нее делать комит,  а возращать переменную из ретернинге инсерта явно через ретурн храгимой функции.  Саму функцию дергать через селект обычного запроса.
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
и получить последнее сгенерированное значение этим sequance для этого поля. А потом по значению поля я уже могу достать саму строку
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
Если сгенерированных автоматически полей нет, то при создании мне придет с фронтенда primaryKey, по которому я снова таки смогу достать строчку после добавления. Ну если она добавилась конечно.
А если primary ключей нет, то сорян
источник