хранимая процедура pl/sql: название параметра то же как имя столбца

Это имеет отношение к непрерывной памяти.

Вот некоторая информация, которую я нашел онлайн для кого-то просящего что прежде, предположительно, от "бога VM":

причина нам нужен непрерывный регион памяти для "кучи", то, что у нас есть набор структур данных стороны, которые индексируются (масштабированными) смещениями от запуска "кучи". Например, мы отслеживаем объектные ссылочные обновления с "массивом метки карты", который имеет один байт для каждого 512 байтов "кучи". Когда мы храним ссылку в "куче", мы должны отметить соответствующий байт в массиве метки карты. Мы исправляемся, смещают адрес назначения хранилища и использования, которые для индексации карты отмечают массив. Забава обращаясь к арифметическим играм, которые Вы не можете сделать в Java, до которого Вы добираетесь (имеют к :-) игра в C++.

Обычно мы не испытываем затруднения при получении скромных непрерывных регионов (приблизительно до 1.5 ГБ на Windohs, приблизительно до 3.8 ГБ на Солярисе. YMMV.). На Windohs проблема состоит главным образом в том, что существуют некоторые библиотеки, которые загружаются, прежде чем JVM запускает, которые разбивают адресное пространство. Используя/3GB переключатель не будет повторно основывать те библиотеки, таким образом, они будут все еще проблемой для нас.

Мы знаем, как сделать разделенную на блоки "кучу", но были бы немного служебные к использованию их. У нас есть больше запросов на более быстрое управление хранением, чем мы делаем для большей "кучи" в 32-разрядной JVM. Если Вы действительно хотите большую "кучу", переключаетесь на 64-разрядную JVM. Нам все еще нужна непрерывная память, но намного легче войти в 64-разрядное адресное пространство.

24
задан Michael Eakins 17 July 2012 в 19:39
поделиться

4 ответа

Вы можете добавить префикс к именам параметров и переменных с помощью имени процедуры следующим образом:

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.
43
ответ дан 28 November 2019 в 22:53
поделиться

Я нашел решение. он работает с полной квалификацией параметра:

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;
5
ответ дан 28 November 2019 в 22:53
поделиться

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

Например, назовите свои столбцы без префикса, а переменные с префиксом, который зависит от их области действия ( P_ для параметров, L_ для локальных переменных, G_ для глобальных переменных пакета и т. Д.). Это даст дополнительное преимущество, так как сделает код более читабельным, предоставив вам дополнительную информацию.

6
ответ дан 28 November 2019 в 22:53
поделиться

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;
3
ответ дан 28 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: