#sql #oracle #function #stored-procedures
#sql #Oracle #функция #хранимые процедуры
Вопрос:
Я не могу запустить этот простой оператор if / then в базе данных oracle. (я думаю, что это 10.x, но не уверен, похоже, это проблема моего навыка sql, а не версии db).
Можете ли вы помочь мне понять, как запустить эту простую процедуру — email_table_copy () — для отправки csv-копии таблицы, только если в таблице есть данные?
Я должен использовать ‘call’ с процедурой email_table_copy, и, похоже, именно здесь возникает проблема.
Я был бы очень признателен за вашу помощь.
DECLARE
ncount NUMBER(10);
v_sql LONG;
BEGIN
SELECT
COUNT(person_id)
INTO ncount
FROM
test_conditional;
IF ( ncount > 0 ) THEN
v_sql := 'call email_table_function(''owner'', ''test_conditional'', ''csv'', ''email@email.com''
);';
EXECUTE IMMEDIATE v_sql;
END IF;
END;
Комментарии:
1. Совет дня: не используйте ДЛИННЫЙ тип данных, используйте VARCHAR2 (32767) или CLOB, если это необходимо. Как указано в документации Oracle : не создавайте таблицы с ДЛИННЫМИ столбцами. Вместо этого используйте LOB-столбцы (CLOB, NCLOB, BLOB). ДЛИННЫЕ столбцы поддерживаются только для обратной совместимости. (выделение мое) Неплохо бы также использовать их в коде, с ними чрезвычайно сложно работать, если вам когда-нибудь понадобится.
Ответ №1:
Просто удалите ;
из вашего v_sql
:
DECLARE
ncount NUMBER(10);
v_sql LONG;
BEGIN
SELECT
COUNT(person_id)
INTO ncount
FROM
test_conditional;
IF ( ncount > 0 ) THEN
v_sql := q'[
call email_table_function('owner', 'test_conditional', 'csv', 'tyler.hahn@wpr.org')
]';
EXECUTE IMMEDIATE v_sql;
END IF;
END;
Также, как вы можете видеть, я немного изменил ваш литерал на q-литерал, чтобы сделать его более читаемым.
Простой пример:
begin
execute immediate q'[
call dbms_output.put_line('Test string')
]';
end;
/
Комментарии:
1. Спасибо, Саян — это исправлено! Я удивлен, что это оказалась неуместная точка с запятой. И я благодарен за то, что узнал о q-literal, это такой хороший оператор / инструмент, который есть в моем наборе инструментов. Я все еще новичок в SQL и благодарен за ваше руководство.