Страницы

Поиск по вопросам

вторник, 13 ноября 2018 г.

Динамическое подключение к другой Oracle БД из PL/SQL или SQL

Надо организовать динамическое подключение к любой из удаленных БД, данные о которых есть в таблице средствами PL/SQL кода.
Можно ли имея таблицу с настроечными параметрами (имя, пароль, TNS), в зависимости от переданного в процедуру параметра (ключа этой таблицы), в коде менять подключение и использовать один и тот же запрос для выборки из одинаковых структур то одной, то другой удаленной БД?


Ответ

TL;DR: Нельзя. Подключение к БД (connect) невозможно выполнить динамически:
exec execute immediate 'connect user/pass@localhost/oradb'; --ORA-00900: invalid SQL statement
так, как это недействительное SQL выражение.

Для выполнения запросов или хранимых функций на удалённой БД используются линки (database links). Например, для задачи как в вопросе:
create database link loopback1 connect to user identified by pass using 'localhost/pdb1'; create database link loopback2 connect to user identified by pass using 'localhost/pdb1'; create database link loopback3 connect to user identified by pass using 'localhost/pdb1';
set serveroutput on size unlimited declare function printRemoteData (dbLink varchar2) return varchar2 is dummy char (1); begin execute immediate 'select dummy from dual@'||dbLink into dummy; -- do something with remote data return 'remote connection using @'||dbLink; end; begin for r in ( select * from user_db_links where regexp_like (db_link, 'loopback\d', 'i')) loop dbms_output.put_line (printRemoteData (r.db_link)); end loop; end; /
Вывод:
remote connection using @LOOPBACK1 remote connection using @LOOPBACK3 remote connection using @LOOPBACK2
Пример решения более реальной задачи см. также по ссылке спроси Тома любезно предоставленной @MaxU.

Не получается сложить JS


$("#bonus").text(sum + 20); так получается сложить, а так $("#bonus").text(sum + bonus ); а так не получается ?


Ответ

$("#bonus").text(sum + bonus);
$("#bonus").text(sum + +bonus);

Хотя лучше вместо этого править здесь:
var bonus = $('#sum_bonus').val();
var bonus = +$('#sum_bonus').val();

Как сделать button в виде треугольника в WPF?

Нашел множество примеров как сделать круглые кнопки, но не одного решения о том как сделать в виде треугольника. Возможно ли это, или лучше использовать изображение для этой цели?


Ответ

Чтобы кнопка была действительно треугольной, необходимо переопределить ее шаблон.
Чтобы не писать шаблон с нуля полностью, я возьму за основу стандартный, для этого в Visual Studio в дизайнере щелкаем правой по кнопке и выбираем Edit Template-Edit a Copy... и вводим желаемое название шаблона и выбираем место его расположения (можно просто нажать OK и переместить/переименовать позже вручную).
Студия добавит стандартный шаблон кнопки, редактируем его: ищем у меня там такой шаблон:

В другой ОС он может отличаться, правим его:

Кнопка будет простая и не будет уметь содержать контент, поэтому одного Path достаточно.
Смотрим теперь те места, что подчеркнуты синим, наименования свойств у Border и Path отличаются, поэтому надо эти места поправить, кисть для границы называется Stroke (вместо BorderBrush), а кисть для заливки — Fill (вместо Background). Контента нет, поэтому строчку удаляю полностью.
Триггеры поправлены, синих подчеркиваний не должно остаться, дизайнер должен заработать, можно запустить и проект. Кнопка, в принципе, уже функционирует нормально, но если с помощью клавиши Tab установить на нее фокус, то мы увидим, что он прямоугольный. За фокус отвечает свойство FocusVisualStyle, видим в стиле, что он устанавливается так: , т.е. необходимо отредактировать также ресурс FocusVisual, там сейчас находится Rectangle, мы возьмем наш уже готовый Path, но без заливки и с прерывистой границей (как и было у Rectangle):

Видим, что геометрия Path повторяется дважды, чтобы избежать дублирования, вынесем ее отдельным ресурсом:
M12,24 L36,0 L36,48 Z
Тогда в Path достаточно будет указать Data="{StaticResource Geometry}"
Ну и напоследок можно поудалять ненужные сеттеры из стиля, которые касаются контента.
Еще, для того, чтобы иметь возможность получить кнопки со стрелками еще и вниз/вверх/вправо, добавим в ресурсы следующие трансформации:

В итоге весь пример целиком выглядит следующим образом:
M12,24 L36,0 L36,48 Z

Получить значение по ключу из JSON строки

Есть поле, которое хранит json текст. Внутри есть переменная id {"Id":25680,"Code":.... Нужно из json взять Id объекта и поместить значение в поле. Как вырезать значение Id? Кол-во цифр разное.


Ответ

Воспользуйтесь JSON_VALUE(...) (доступна начиная с SQL Server 2016):
SELECT JSON_VALUE(field_name, '$.Id') FROM table_name

CLion не воспринимает запись вида `T const& a` при описании функции

Есть некоторый класс Vector2 с перегруженным оператором (возможно аналогичное поведение и с обычными ф-циями, но из-за непредсказуемого поведения (об этом позже) достоверно проверить не удалось):
template class Vector2 { ... template // объявляем дружественную ф-цию шаблонной friend Vector2 operator +(Vector2 const& l_v, Vector2 const& r_v); ... }
Обращу внимание на форму записи константной ссылки - T const& a, а не const T& val. Потом это будет играть важную роль.
Но при попытке описать эту ф-цию, а именно:
template Vector2 operator +(Vector2 const& l_v, Vector2 const& r_v) { ... }
начинается самое интересное, а именно абсолютно непредсказуемое поведение анализа кода "на лету", от подобных генераций кода при попытке автоматической реализации объявленной ф-ции:
template Vector2 operator+(Vector2 < T >
const & l_v,
Vector2 const& r_v
) { return Vector2(); } // да-да, именно в таком виде, со всеми отступами
до категоричного отказа анализировать код, подчёркивая каждое второе слово красным цветом.
В целом, иногда (очень редко), CLion воспринимает всё правильно, но через время снова начинает деградировать.
А теперь к T const& a. Дело в том, что если поменять именно в описании ф-ции запись на const T& a, то всё будет работать более чем нормально. Вид записи в объявлении ф-ции никак не влияет.

Безусловно, можно было бы просто перейти на запись вида const T& a, да и код-то компилируется, и это лишь визуальная помощь от данной IDE, но я бы не стал писать этот вопрос, если бы не хотел решить эту проблему, поэтому хотелось бы понять, как это возможно сделать.

P.S. CLion версии 2018.1, но также проверялось на 2018.1.6, на другом устройстве, где результат был таким же.


Ответ

Так как в функции и левый операнд и правый имеют тип класса, то такую функцию другом обьявить бессмысленно.
Во вторых, если работа ыункции никак не связана с состоянием обьекта, и результатом функции является совершенно другой обьект, то вообше лучше избавить интерфейс класса от этой функции и определить ее отдельно (но в одном модуле). Например:
class Integer { int k; public: Integer(int n = 0) : k(n){} //модификаторы //т.е. мы изменяем состояние обьекта *this Integer& operator +=(const Integer& r_v) { k += r_v.k; return *this; } //... //селекторы int get_data() const { return k; } // функция выдает состояние обьекта }; // operator+ (и подобные методы) определяем вне класса inline Integer operator +(const Integer& l_v, const Integer& r_v) { Integer t(l_v); t += r_v; return t; }
Такой подход избавляет класс от лишнего интерфейса и наиболее логичен. И если этот подход применить в написании вашего класса, то все становится гораздо проще...
template class Vector2 { //... public: Vector2& operator +=(Vector2 const& r_v);
}; template inline Vector2 operator +(Vector2 const& l_v, Vector2 const& r_v) {...}

Посчитать статистику

Есть таблицы articles(id, section_id) и sections(id) связанные соответственно связью один ко многим (одна секция имеет много статей). Я хочу узнать сколько минимально, в среднем и максимально статей во всех секциях. Не доводилось делать таких агрегирующих запросов с MIN, MAX, AVG... Помогите пожалуйста составить запрос!


Ответ

В первую очередь придётся посчитать статьи:
SELECT COUNT(a.id) FROM Articles a GROUP BY a.section_id
Из этого можно получить агрегаты:
SELECT min(agg.cnt) mincnt, max(agg.cnt) maxcnt, avg(agg.cnt) avgcnt FROM ( SELECT COUNT(a.id) cnt FROM Articles a GROUP BY a.section_id ) agg

Не работает jquery tabs

Есть такой код для навигации .При нажати на service должно открыватся нужное окно.Есть задача использовать только jquery код.Активные кнопки справляются с задачей хорошо а вот с блоками проблема.Помогите разобратся.Заранее спасибо
Вот код
$(document).ready(function() { $(".tabtext").click(function() { $(".tabtext").removeClass("active"); $(this).addClass("active"); }); }); $(document).ready(function() { $(".tabtext").click(function() { $(".content").hasClass("visible"); $(".content").removeClass("visible"); $(".content").addClass("visible"); }); }); .tabs { width: 30em; height: auto; display: inline-block; text-align: center; margin: 0 auto; box-sizing: border-box; padding: 1em; background-color: silver; } .tabtext { display: inline; font-size: 1em; padding: 1em; margin: 0 0.2em 0 0.2em; } .active { color: red; } .content { width: 30em; display: block; text-align: center; margin: 0 auto; box-sizing: border-box; background-color: gray; } .context { width: 100%; height: auto; padding: 2em; display: none; text-align: center; box-sizing: border-box; } .context>h1 { font-size: 1em; } .visible { display: block; }

Service 1

Service 2

Service 3

Text 1

Text 2

Text 3



Ответ

$(document).ready(function() { $(".tabs .tabtext").click(function() { $(".tabs .tabtext").removeClass("active"); $(this).addClass("active"); $(".content .context").removeClass("visible"); $(".content .context").eq($(this).index()).addClass("visible"); }); }); .tabs { width: 30em; height: auto; display: inline-block; text-align: center; margin: 0 auto; box-sizing: border-box; padding: 1em; background-color: silver; } .tabtext { display: inline; font-size: 1em; padding: 1em; margin: 0 0.2em 0 0.2em; } .active { color: red; } .content { width: 30em; display: block; text-align: center; margin: 0 auto; box-sizing: border-box; background-color: gray; } .context { width: 100%; height: auto; padding: 2em; display: none; text-align: center; box-sizing: border-box; } .context>h1 { font-size: 1em; } .visible { display: block; }

Service 1

Service 2

Service 3

Text 1

Text 2

Text 3