Вызов процедуры с функцией ‘call’ из P / L SQL Script Oracle

#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 и благодарен за ваше руководство.