Вопрос о вложении нескольких функций внутри функции в Snowflake - PullRequest
1 голос
/ 21 октября 2019

(Отправка от имени пользователя Snowflake ...)


ВОПРОС:

Возможно ли вложить несколько функций внутри функции ипередать все необходимые параметры?

например ...

CREATE OR REPLACE FUNCTION "udf_InteractionIndicator"("ROH_RENEWAL_SYSTEM_STATUS1" VARCHAR(100), "GOLS_OPPORTUNITY_LINE_STATUS" VARCHAR(100)

                            , "ROH_CLIENT_CURRENT_TEMPERATURE1" VARCHAR(100)

                            , "ROH_PO_ATTACHED" VARCHAR(100)

                            , "ROH_PO_NUMBER" VARCHAR(100)

                            , "RT_PAID_OVERRIDE" VARCHAR(100), "ROH_RENEWAL_OPPORTUNITY_STATUS1" VARCHAR(100)

                            , "ROH_RENEWAL_CONVERSATION_DATE" DATE, "ROH_APPROVAL_RECEIVED_DATE" DATETIME)

 RETURNS NUMBER(1,0)

 AS

 $$

  CASE WHEN ("udf_RenewalNoticeSentIndicator"("ROH_RENEWAL_SYSTEM_STATUS1", "ROH_CLIENT_CURRENT_TEMPERATURE1"

                              , "GOLS_OPPORTUNITY_LINE_STATUS"

                              , "ROH_PO_ATTACHED", "RT_PAID_OVERRIDE"

                              , "ROH_RENEWAL_OPPORTUNITY_STATUS1")) = 1

      AND (ROH_RENEWAL_CONVERSATION_DATE IS NOT NULL

        OR ("udf_AuthorizedIndicator"(ROH_APPROVAL_RECEIVED_DATE, "ROH_PO_ATTACHED", "ROH_PO_NUMBER")) = 1

        OR ("udf_PaidIndicator"("GOLS_OPPORTUNITY_LINE_STATUS")) = 1

        OR ("udf_ChurnIndicator"("GOLS_OPPORTUNITY_LINE_STATUS")) = 1

        )

   THEN 1 ELSE 0 END

 $$

 ;

Я получил рекомендацию:

... создать SQL UDFили JavaScript UDF. UDF JavaScript может содержать только код JavaScript, а UDF SQL может содержать только один оператор SQL (без DML и DDL). В случае вложенности SQL UDF может вызывать другую UDF SQL или UDF JavaScript, но это не так с UDF JavaScript (он содержит только код JavaScript).

   CREATE OR REPLACE FUNCTION udf_InteractionIndicator_nested(ID DOUBLE)
     RETURNS DOUBLE
     AS
     $$
      SELECT ID
     $$;




create or replace function js_factorial(d double)
  returns double
  language javascript
  strict
  as '
  if (D <= 0) {
    return 1;
  } else {
    var result = 1;
    for (var i = 2; i <= D; i++) {
      result = result * i;
    }
    return result;
  }
  ';

CREATE OR REPLACE FUNCTION udf_InteractionIndicator(ID DOUBLE)
 RETURNS double
 AS
 $$
  select udf_InteractionIndicator_nested(ID) + js_factorial(ID)
 $$;

 select udf_InteractionIndicator(4);
+-----------------------------+
| UDF_INTERACTIONINDICATOR(4) |
|-----------------------------|
|                          28 |
+-----------------------------+

ОДНАКО, яЯ пытаюсь сделать это с помощью SQL UDF. Имеет смысл, что вложенная функция может быть создана, если они используют один и тот же параметр. Я хотел бы создать функцию, которая принимает скажем 8 параметров, и базовые функции могут ссылаться на все, некоторые или ни на один из параметров родительской функции. Вот где я сталкиваюсь с проблемой ... МЫСЛИ?

1 Ответ

1 голос
/ 21 октября 2019

(Консультант в нашем сообществе предложил следующий ответ ...)


С UDF JavaScript дизайн будет намного более компактным и обслуживаемым, если вы используете этот вариант использованияв том, что есть функция «main», которая разбивает работу на подфункции, которые будут вызываться только из main.

Затем вы просто определяете все базовые функции внутри функции main, что возможно в JavaScript, но не вSQL UDF, и тогда вы можете использовать основные параметры везде.

CREATE OR REPLACE FUNCTION MAIN_JS(P1 STRING, P2 FLOAT)
RETURNS FLOAT
LANGUAGE JAVASCRIPT
AS '
    function helper_1(p) { return p * 2;  }
    function helper_2(p) { return p == "triple" ? P2 * 3 : P2; }

    return helper_1(P2) + helper_2(P1);
';

SELECT MAIN_JS('triple', 4);  -- => 20
...