Это ничего не делает с самим курсором и все зависит от того, как вы строите свою динамическую строку SQL.
При создании динамического SQL в хранимой процедуре Netezza вы можете использовать вспомогательные функции quote_ident и quote_literal, чтобы система могла знать, передаете ли вы литерал или передаете ли вы его идентификатор. Существует пример в online documentation here. По сути, все, что они делают, - это то, что нужно использовать сэкономленные цитаты.
Так как вы пытаетесь поставить значения, хранящиеся в столбцах вашей P_REC записи в VALUES часть оператора вставки, можно использовать quote_literal так:
CREATE OR REPLACE PROCEDURE SP_NEW_PROCEDURE1()
RETURNS REFTABLE(employees)
LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE
l_conditions varchar(1000);
p_rec RECORD;
BEGIN
FOR P_REC IN select empid, mgrid, empname, salary from employees where mgrid = 7
LOOP
l_conditions := 'insert into ' ||
REFTABLENAME ||
' VALUES (' ||
quote_literal(P_REC.EMPID) ||
',' ||
quote_literal(P_REC.MGRID) ||
',' ||
quote_literal(P_REC.EMPNAME) ||
',' ||
quote_literal(P_REC.SALARY) ||
' ) ; ' ;
execute immediate l_conditions;
l_conditions := ' ';
END LOOP;
RETURN REFTABLE;
END;
END_PROC;
Это, как говорится, с помощью курсора зацикливать записи, чтобы вставить строку по одному, ужасно неэффективна в базе данных MPP, такой как Netezza. Предполагая, что этот вопрос является продолжением вашего вопроса об альтернативе рекурсивному CTE для изучения иерархий, нет ничего плохого в петле в целом, но старайтесь избегать записи по записи. Вот версия, которая будет использовать характер MPP системы. Для записи, если вы собираетесь вернуть свой набор результатов в REFTABLE, тогда ваш единственный выбор - Dynamic SQL.
CREATE OR REPLACE PROCEDURE SP_NEW_PROCEDURE1()
RETURNS REFTABLE(employees)
LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE
l_conditions varchar(1000);
p_rec RECORD;
BEGIN
-- FOR P_REC IN select empid, mgrid, empname, salary from employees where mgrid = 7
-- LOOP
l_conditions := 'insert into ' ||
REFTABLENAME ||
' select empid, mgrid, empname, salary from employees where mgrid = 7 ; ' ;
execute immediate l_conditions;
l_conditions := ' ';
-- END LOOP;
RETURN REFTABLE;
END;
END_PROC;
Спасибо за вашу помощь –
Если это решение сработало для вас, отметьте свой вопрос как можно скорее. Благодаря! – ScottMcG