(代表雪花用户提交...)
问题:
是否可以在一个函数中嵌套多个函数并传递所需的所有参数?
例如...
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。 JavaScript UDF只能 包含JavaScript代码,并且一个SQL UDF只能包含一个SQL 语句(无DML和DDL)。在嵌套的情况下,SQL UDF可以调用 另一个SQL UDF或JavaScript UDF,但事实并非如此。 JavaScript UDF(仅包含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个参数的函数,而基础函数可以引用全部,部分或不引用任何父函数参数。那是我遇到的问题...思考?
答案 0 :(得分:1)
(我们社区的一名顾问提供了以下答案...)
如果您的用例是有一个“主”功能将工作分解为子功能,而子功能只能从main调用,那么使用JavaScript UDF的设计将更加紧凑和易于维护。
然后,您只需在main函数中定义所有基础函数,这可以通过JavaScript而不是SQL UDF来实现,然后您可以在任何地方自由使用main参数。
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