В C ++ 14 вы можете использовать следующий шаблон для печати любого объекта, который имеет T :: print (std :: ostream & amp;) const; член.
template<class T>
auto operator<<(std::ostream& os, const T& t) -> decltype(t.print(os), os)
{
t.print(os);
return os;
}
В PL / SQL глобальная переменная может существовать только в пакете. Это потому, что PL / SQL инициализирует переменные уровня процедуры каждый раз, когда вызывается процедура. Только пакет позволяет нам определять переменную вне области действия процедуры.
Этот пакет игрушек будет сохранять значение n
при нескольких вызовах на gvar_test.incr()
.
create or replace package gvar_test as
procedure incr (p_in in number, p_out out number);
end gvar_test;
/
create or replace package body gvar_test as
n pls_integer;
procedure incr (p_in in number, p_out out number) is
begin
n := n + p_in;
p_out := n;
end incr;
begin
-- initialise variable first time package is called
n := 0;
end gvar_test;
/
Глобальные переменные - сложная вещь. Многие люди считают их использование плохой практикой, в первую очередь потому, что очень легко потерять след из состояния. Это особенно верно, когда мы работаем с веб-приложениями, проходящими через пул соединений. Переменные PL / SQL хранятся в памяти сеанса, поэтому бесполезны для сохранения состояния между вызовами в среде, где каждый вызов может быть передан случайному сеансу. В этом случае вы должны использовать глобальные контексты приложения для хранения значения. Они доступны через сеансы базы данных (поэтому вам нужно быть осторожным с идентификаторами). Узнайте больше .
Кроме того, подумайте, являются ли переменные в памяти (будь то PL / SQL или прикладной контекст) безопасным подходом. Если вы отслеживаете какой-либо рабочий процесс или состояние процесса, обычно лучше сохранить его в таблице, хотя бы только для целей восстановления.
У вас есть база данных вокруг вашей процедуры - если вам действительно нужно что-то вроде количества выполнений какого-либо блока внутри процедуры, просто создайте выделенную таблицу и обновляйте ее при каждом выполнении.
Реализация будет немного отличаться, если вы продолжите выполнение в рамках отдельной транзакции, в рамках сеанса или это общее число выполнений ...