Это имеет отношение к непрерывной памяти.
Вот некоторая информация, которую я нашел онлайн для кого-то просящего что прежде, предположительно, от "бога VM":
причина нам нужен непрерывный регион памяти для "кучи", то, что у нас есть набор структур данных стороны, которые индексируются (масштабированными) смещениями от запуска "кучи". Например, мы отслеживаем объектные ссылочные обновления с "массивом метки карты", который имеет один байт для каждого 512 байтов "кучи". Когда мы храним ссылку в "куче", мы должны отметить соответствующий байт в массиве метки карты. Мы исправляемся, смещают адрес назначения хранилища и использования, которые для индексации карты отмечают массив. Забава обращаясь к арифметическим играм, которые Вы не можете сделать в Java, до которого Вы добираетесь (имеют к :-) игра в C++.
Обычно мы не испытываем затруднения при получении скромных непрерывных регионов (приблизительно до 1.5 ГБ на Windohs, приблизительно до 3.8 ГБ на Солярисе. YMMV.). На Windohs проблема состоит главным образом в том, что существуют некоторые библиотеки, которые загружаются, прежде чем JVM запускает, которые разбивают адресное пространство. Используя/3GB переключатель не будет повторно основывать те библиотеки, таким образом, они будут все еще проблемой для нас.
Мы знаем, как сделать разделенную на блоки "кучу", но были бы немного служебные к использованию их. У нас есть больше запросов на более быстрое управление хранением, чем мы делаем для большей "кучи" в 32-разрядной JVM. Если Вы действительно хотите большую "кучу", переключаетесь на 64-разрядную JVM. Нам все еще нужна непрерывная память, но намного легче войти в 64-разрядное адресное пространство.
Вы можете добавить префикс к именам параметров и переменных с помощью имени процедуры следующим образом:
SQL> declare
2 procedure p (empno number) is
3 ename varchar2(10);
4 begin
5 select ename
6 into p.ename
7 from emp
8 where empno = p.empno;
9 dbms_output.put_line(p.ename);
10 end;
11 begin
12 p (7839);
13 end;
14 /
KING
PL/SQL procedure successfully completed.
Я нашел решение. он работает с полной квалификацией параметра:
procedure P_IssueUpdate
(
Id in integer,
ModifiedDate in date,
Solution in varchar2
) AS
BEGIN
update T_Issue
Set
ModifiedDate = P_IssueUpdate.ModifiedDate,
Solution = P_IssueUpdate.Solution
where id = P_IssueUpdate.id;
END P_IssueUpdate;
то, что вы описали, называется затенением переменных . Это может произойти на любом языке. Вам предложили хорошие обходные пути, но наиболее распространенным решением является разработка схемы именования, чтобы этого никогда не было.
Например, назовите свои столбцы без префикса, а переменные с префиксом, который зависит от их области действия ( P_
для параметров, L_
для локальных переменных, G_
для глобальных переменных пакета и т. Д.). Это даст дополнительное преимущество, так как сделает код более читабельным, предоставив вам дополнительную информацию.
RE Ответ Винсента о добавлении префикса - это решение работает до тех пор, пока кто-нибудь не изменит таблицу и не добавит столбец, имя которого не совпадает с именем параметра. Не все просматривают каждую строчку кода, чтобы убедиться, что модификации их таблиц не конфликтуют с именами переменных или параметров. Oracle рекомендует уточнять каждый параметр или имя переменной в запросе SQL.
Если вы работаете с анонимным блоком (вне процедуры), вы можете назвать блок и квалифицировать переменные таким образом:
<<MY_BLOCK>>
declare
X sys.USER_TABLES%rowtype;
Y sys.USER_TABLES.TABLE_NAME%type := 'some_table_name';
begin
select UT.*
into MY_BLOCK.X
from sys.USER_TABLES UT
where UT.TABLE_NAME = MY_BLOCK.Y;
end MY_BLOCK;