Вы пытаетесь присвоить функцию переменной, которая ожидает 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))
Вот рабочий пример решения для вложенной таблицы, с помощью таблицы 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
Простой метод решения "в лоб":
WHERE ','||GET_OFFICE_IDS||',' LIKE '%,'||OFFICE_ID||',%'
Это было бы лучше для изменения GET_OFFICE_IDS, чтобы возвратить вложенную таблицу и использовать что-то как:
OFFICE_ID IN (SELECT * FROM TABLE(GET_OFFICE_IDS))
Можно, вероятно, сделать это с 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));
Обычно конвейерная функция работает очень хорошо. Однако подзапрос с БОЛЬШИМ КОЛИЧЕСТВОМ записей работает не всегда очень хороший.
Я не нахожусь на оракуле SQL, но Вы не могу просто вставить другой избранный оператор В Пункте для возврата идентификаторов?
ВЫБЕРИТЕ * ОТ СОТРУДНИКОВ, ГДЕ OFFICE_ID В (ВЫБИРАЮТ идентификатор ИЗ tbl_X ГДЕ x=y);
... или Вы надеялись сделать что-то немного более сложное?
Править: Я нарушил кардинальное правило Так, я не ответил на 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. Оптимизатор не является компилятором. Это не может Встроить Вашу функцию. Только можно помочь оптимизатору получить лучший план.