Функция или Процедура В пункте

Вы пытаетесь присвоить функцию переменной, которая ожидает PDFAction. Замените строку, которая выдает ошибку, следующим:

resetButton.action = PDFActionGoTo(destination: PDFDestination(page: page, at: .zero))

Это передает PDFDestination со страницей, которую вы инициализировали ранее, инициализатору PDFActionGoTo(destination:).

Если вы хотите изменить точку назначения, измените параметр at инициализатора PDFDestination на другое значение CGPoint:

let point = CGPoint(x: 50, y: 100)
resetButton.action = PDFActionGoTo(destination: PDFDestination(page: page, at: point))
5
задан Tony Andrews 22 November 2018 в 17:23
поделиться

5 ответов

Вот рабочий пример решения для вложенной таблицы, с помощью таблицы EMP:

create type t_ids is table of integer
/

create or replace function get_office_ids return t_ids
is
   l_ids t_ids := t_ids();
   l_idx integer := 0;
begin
   for r in (select empno from emp where deptno=10)
   loop
      l_ids.extend;
      l_idx := l_idx+1;
      l_ids(l_idx) := r.empno;
   end loop;
   return l_ids;
end;
/

select ename from emp where empno in (select * from table(get_office_ids));


ENAME
----------
CLARK
KING
TEST
MILLER
BINNSY
FARMER
6
ответ дан 18 December 2019 в 14:52
поделиться

Простой метод решения "в лоб":

WHERE ','||GET_OFFICE_IDS||',' LIKE '%,'||OFFICE_ID||',%'

Это было бы лучше для изменения GET_OFFICE_IDS, чтобы возвратить вложенную таблицу и использовать что-то как:

OFFICE_ID IN (SELECT * FROM TABLE(GET_OFFICE_IDS))
3
ответ дан 18 December 2019 в 14:52
поделиться

Можно, вероятно, сделать это с ref_cursor (касательно курсора c: = 'выберите' ||....),

Но конвейерная функция работает очень хорошо. используйте его как это:

create or replace type type_varchar2 as table of varchar2(100);

create or replace function GET_OFFICE_IDS return TYPE_varchar2 PIPELINED
is
  retval VARCHAR2(100);
begin
  -- put some sql here which results in statements as below
 retval := '135';
 PIPE ROW (retval);
 retval := '110';
 PIPE ROW (retval);
end GET_OFFICE_IDS;


select *
from entries
where id in (SELECT COLUMN_VALUE FROM TABLE(GET_OFFICE_IDS));

Обычно конвейерная функция работает очень хорошо. Однако подзапрос с БОЛЬШИМ КОЛИЧЕСТВОМ записей работает не всегда очень хороший.

1
ответ дан 18 December 2019 в 14:52
поделиться

Я не нахожусь на оракуле SQL, но Вы не могу просто вставить другой избранный оператор В Пункте для возврата идентификаторов?

ВЫБЕРИТЕ * ОТ СОТРУДНИКОВ, ГДЕ OFFICE_ID В (ВЫБИРАЮТ идентификатор ИЗ tbl_X ГДЕ x=y);

... или Вы надеялись сделать что-то немного более сложное?

2
ответ дан 18 December 2019 в 14:52
поделиться

Править: Я нарушил кардинальное правило Так, я не ответил на OP. Так как уже существует принятый ответ, я чувствовал это благоразумный предупредить.

Как правило, это - очень плохая идея смешать SQL и МН / SQL. Существует 2 отдельных механизма для кода. Существует механизм SQL и МН механизм / механизм SQL. Принуждение тысяч переключателей назад и вперед абсолютно уничтожит производительность.

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

Даже что-то настолько глупое.

create or replace function my_Date (p_Date in date)
return varchar
as
begin

    return to_char(p_Date, 'yyyy/mm/dd');

end;

Уничтожит Ваше время выполнения.

Поворот включает автотрассировку

затем выполните их.

select to_char(created, 'yyyy/mm/dd'), to_char(last_ddl_time, 'yyyy/mm/dd')  from all_objects


select my_date(created), my_Date(last_DDL_TIME) From all_objects

Второй занимает дважды время для выполнения. Я заставляю ответ запросить 1 за 1 секунду и 2 за 2 секунды.

И это - AN ЧРЕЗВЫЧАЙНО простой случай... все, что я делаю, бросает значения. Вообразите, необходимо ли соединить с ним как Вы, хотят. Это - действительно худший случай.

Теперь думайте о том, что оптимизатор абсолютно не может сделать при сокрытии вещей в функции.

Когда Вы делаете В, иногда что намного быстрее сделать как соединение. Если определенные условия будут верны, то оптимизатор сделает это для Вас. Это преобразует В в СОЕДИНЕНИЕ. Но потому что Вы замаскировали выбор в функции, он больше не может определять, готовы ли условия. Вы ВЫНУДИЛИ оптимизатор сделать что-то субоптимальным образом.

Одна ключевая статистическая величина, на которую полагается оптимизатор, является rowcount. Это - одна строка или 1 миллиард. Это знает из статистики на таблицах и индексах. На Вашей функции нет никакой статистики.

Можно ли поместить их там, это возможный подсказать кардинальность, я не говорю, что Вы не можете, но почему? Почему Вы хотели бы? По-видимому Вы используете функцию, потому что Вы - прилежный программист, которому сказали его целую жизнь для факторинга избыточного кода в функции.

Те правила в Вашей голове, почти ни один не относится к SQL. Оптимизатор не является компилятором. Это не может Встроить Вашу функцию. Только можно помочь оптимизатору получить лучший план.

1
ответ дан 18 December 2019 в 14:52
поделиться
Другие вопросы по тегам:

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