Update Function GENERATE_DBML_V2
This commit is contained in:
@@ -1 +1,227 @@
|
||||
牄禗袬蒨@\蚕謨@^@
|
||||
SET PATH *LIBL ;
|
||||
|
||||
CREATE OR REPLACE FUNCTION RESTAPI.GENERATE_DBML_V2 (
|
||||
INAPPVER VARCHAR(10) ,
|
||||
INAPPNAME VARCHAR(128) )
|
||||
RETURNS CLOB(2147483647)
|
||||
LANGUAGE SQL
|
||||
SPECIFIC RESTAPI.GENERATE_DBML_V2
|
||||
NOT DETERMINISTIC
|
||||
READS SQL DATA
|
||||
CALLED ON NULL INPUT
|
||||
SET OPTION ALWBLK = *ALLREAD ,
|
||||
ALWCPYDTA = *OPTIMIZE ,
|
||||
COMMIT = *NONE ,
|
||||
DBGVIEW = *SOURCE ,
|
||||
DECRESULT = (31, 31, 00) ,
|
||||
DYNDFTCOL = *NO ,
|
||||
DYNUSRPRF = *OWNER ,
|
||||
SRTSEQ = *HEX
|
||||
BEGIN
|
||||
DECLARE V_RESULT CLOB ( 2 G ) ;
|
||||
WITH EP AS (
|
||||
SELECT *
|
||||
FROM RESTAPI . API_ENDPOINTS
|
||||
WHERE APPVER = INAPPVER
|
||||
AND APPNAME = INAPPNAME
|
||||
AND ENABLED = 'Y'
|
||||
) ,
|
||||
P AS ( -- discovered placeholders from your SQL text
|
||||
SELECT P . APPVER , P . APPNAME , P . APPFUNC , P . APPPARAM , P . PARAMPOS
|
||||
FROM TABLE (
|
||||
RESTAPI . GET_PARAM_PLACEHOLDERS (
|
||||
INAPPVER , INAPPNAME , NULL )
|
||||
) P
|
||||
) ,
|
||||
-- single best rule per param (by priority)
|
||||
RULE_PICK AS (
|
||||
SELECT P . APPVER , P . APPNAME , P . APPFUNC , P . APPPARAM ,
|
||||
(
|
||||
SELECT R . RESTNAME
|
||||
FROM RESTAPI . API_PARAM_RULES R
|
||||
WHERE ( R . APPNAME IS NULL
|
||||
OR UPPER ( R . APPNAME ) = UPPER ( P . APPNAME ) )
|
||||
AND ( R . APPFUNC IS NULL
|
||||
OR UPPER ( R . APPFUNC ) = UPPER ( P . APPFUNC ) )
|
||||
AND REGEXP_LIKE ( P . APPPARAM , R . PATTERN ,
|
||||
'i' )
|
||||
ORDER BY R . PRIORITY
|
||||
FETCH FIRST 1 ROW ONLY ) AS R_RESTNAME ,
|
||||
(
|
||||
SELECT R . LOCATION
|
||||
FROM RESTAPI . API_PARAM_RULES R
|
||||
WHERE ( R . APPNAME IS NULL
|
||||
OR UPPER ( R . APPNAME ) = UPPER ( P . APPNAME ) )
|
||||
AND ( R . APPFUNC IS NULL
|
||||
OR UPPER ( R . APPFUNC ) = UPPER ( P . APPFUNC ) )
|
||||
AND REGEXP_LIKE ( P . APPPARAM , R . PATTERN ,
|
||||
'i' )
|
||||
ORDER BY R . PRIORITY
|
||||
FETCH FIRST 1 ROW ONLY ) AS R_LOCATION ,
|
||||
(
|
||||
SELECT R . TYPE_NAME
|
||||
FROM RESTAPI . API_PARAM_RULES R
|
||||
WHERE ( R . APPNAME IS NULL
|
||||
OR UPPER ( R . APPNAME ) = UPPER ( P . APPNAME ) )
|
||||
AND ( R . APPFUNC IS NULL
|
||||
OR UPPER ( R . APPFUNC ) = UPPER ( P . APPFUNC ) )
|
||||
AND REGEXP_LIKE ( P . APPPARAM , R . PATTERN ,
|
||||
'i' )
|
||||
ORDER BY R . PRIORITY
|
||||
FETCH FIRST 1 ROW ONLY ) AS R_TYPE ,
|
||||
(
|
||||
SELECT R . NULLABLE
|
||||
FROM RESTAPI . API_PARAM_RULES R
|
||||
WHERE ( R . APPNAME IS NULL
|
||||
OR UPPER ( R . APPNAME ) = UPPER ( P . APPNAME ) )
|
||||
AND ( R . APPFUNC IS NULL
|
||||
OR UPPER ( R . APPFUNC ) = UPPER ( P . APPFUNC ) )
|
||||
AND REGEXP_LIKE ( P . APPPARAM , R . PATTERN ,
|
||||
'i' )
|
||||
ORDER BY R . PRIORITY
|
||||
FETCH FIRST 1 ROW ONLY ) AS R_NULLABLE ,
|
||||
(
|
||||
SELECT R . PRECISION
|
||||
FROM RESTAPI . API_PARAM_RULES R
|
||||
WHERE ( R . APPNAME IS NULL
|
||||
OR UPPER ( R . APPNAME ) = UPPER ( P . APPNAME ) )
|
||||
AND ( R . APPFUNC IS NULL
|
||||
OR UPPER ( R . APPFUNC ) = UPPER ( P . APPFUNC ) )
|
||||
AND REGEXP_LIKE ( P . APPPARAM , R . PATTERN ,
|
||||
'i' )
|
||||
ORDER BY R . PRIORITY
|
||||
FETCH FIRST 1 ROW ONLY ) AS R_PREC ,
|
||||
(
|
||||
SELECT R . CCSID
|
||||
FROM RESTAPI . API_PARAM_RULES R
|
||||
WHERE ( R . APPNAME IS NULL
|
||||
OR UPPER ( R . APPNAME ) = UPPER ( P . APPNAME ) )
|
||||
AND ( R . APPFUNC IS NULL
|
||||
OR UPPER ( R . APPFUNC ) = UPPER ( P . APPFUNC ) )
|
||||
AND REGEXP_LIKE ( P . APPPARAM , R . PATTERN ,
|
||||
'i' )
|
||||
ORDER BY R . PRIORITY
|
||||
FETCH FIRST 1 ROW ONLY ) AS R_CCSID
|
||||
FROM P P
|
||||
) ,
|
||||
-- resolve final mapping (override > rule > path auto-detect > defaults)
|
||||
PL AS (
|
||||
SELECT P . APPVER , P . APPNAME , P . APPFUNC , P . PARAMPOS , P . APPPARAM ,
|
||||
COALESCE ( O . RESTNAME , RP . R_RESTNAME , P . APPPARAM )
|
||||
AS RESTNAME ,
|
||||
/* location precedence:
|
||||
1) explicit override
|
||||
2) rule
|
||||
3) path auto-detect if {RESTNAME} appears in template
|
||||
4) query for known cases (inEnvList) or default FORM
|
||||
*/
|
||||
COALESCE (
|
||||
O . LOCATION , RP . R_LOCATION ,
|
||||
CASE
|
||||
WHEN
|
||||
LOCATE (
|
||||
'{' ||
|
||||
UPPER (
|
||||
COALESCE (
|
||||
O . RESTNAME , RP . R_RESTNAME ,
|
||||
P . APPPARAM ) ) || '}' , UPPER (
|
||||
E . PATH_TEMPLATE ) ) > 0 THEN 'PATH'
|
||||
END ,
|
||||
CASE
|
||||
WHEN UPPER ( P . APPPARAM ) = 'INENVLIST' THEN 'QUERY'
|
||||
END , 'FORM' ) AS LOCATION ,
|
||||
COALESCE ( O . TYPE_NAME , RP . R_TYPE , 'CLOB' ) AS TYPE_NAME ,
|
||||
COALESCE ( O . NULLABLE , RP . R_NULLABLE , 'Y' ) AS NULLABLE ,
|
||||
COALESCE ( O . PRECISION , RP . R_PREC , 2147483647 )
|
||||
AS PRECISION ,
|
||||
COALESCE ( O . CCSID , RP . R_CCSID , 1208 ) AS CCSID
|
||||
FROM P P
|
||||
JOIN EP E
|
||||
ON E . APPVER = P . APPVER
|
||||
AND E . APPNAME = P . APPNAME
|
||||
AND E . APPFUNC = P . APPFUNC
|
||||
LEFT JOIN RESTAPI . API_PARAM_OVERRIDES O
|
||||
ON O . APPVER = P . APPVER
|
||||
AND O . APPNAME = P . APPNAME
|
||||
AND O . APPFUNC = P . APPFUNC
|
||||
AND UPPER ( O . APPPARAM ) = UPPER ( P . APPPARAM )
|
||||
LEFT JOIN RULE_PICK RP
|
||||
ON RP . APPVER = P . APPVER
|
||||
AND RP . APPNAME = P . APPNAME
|
||||
AND RP . APPFUNC = P . APPFUNC
|
||||
AND RP . APPPARAM = P . APPPARAM
|
||||
) ,
|
||||
PARAM_STR AS (
|
||||
SELECT P . APPVER , P . APPNAME , P . APPFUNC ,
|
||||
LISTAGG (
|
||||
'''' || P . APPPARAM || ''':' || '?' , ', ' )
|
||||
WITHIN GROUP ( ORDER BY P . PARAMPOS ) AS PARAMS_TXT
|
||||
FROM P P
|
||||
GROUP BY P . APPVER , P . APPNAME , P . APPFUNC
|
||||
) ,
|
||||
DATA_XML AS (
|
||||
SELECT PL . APPVER , PL . APPNAME , PL . APPFUNC ,
|
||||
XMLAGG ( XMLELEMENT ( NAME "data" , XMLATTRIBUTES ( CHAR (
|
||||
PL . CCSID ) AS "ccsid" , PL . APPPARAM AS "name" ,
|
||||
CASE
|
||||
WHEN PL . NULLABLE = 'Y' THEN 'true'
|
||||
ELSE 'false'
|
||||
END AS "nullable" , CHAR ( PL . PRECISION ) AS "precision" ,
|
||||
CASE
|
||||
WHEN PL . LOCATION = 'PATH' THEN PL . RESTNAME
|
||||
END AS "restInPathParam" ,
|
||||
CASE
|
||||
WHEN PL . LOCATION = 'QUERY' THEN PL . RESTNAME
|
||||
END AS "restInQueryParam" ,
|
||||
CASE
|
||||
WHEN PL . LOCATION = 'FORM' THEN PL . RESTNAME
|
||||
END AS "restInFormParam" , PL . TYPE_NAME AS "type" ,
|
||||
'input' AS "usage" ) ) ORDER BY PL . PARAMPOS )
|
||||
AS DATA_FRAGMENT
|
||||
FROM PL PL
|
||||
GROUP BY PL . APPVER , PL . APPNAME , PL . APPFUNC
|
||||
)
|
||||
SELECT XMLSERIALIZE ( CONTENT XMLELEMENT ( NAME "dbml" , XMLATTRIBUTES (
|
||||
'/v1' AS "restUriPathTemplate" , '1.0' AS "version" ) , XMLAGG (
|
||||
XMLELEMENT ( NAME "program" , XMLATTRIBUTES ( '' AS "errormessage" ,
|
||||
'*NONE' AS "httpheaders" , '500' AS "httpstatusonfailure" ,
|
||||
E . SUCCESS_CODE AS "httpstatusonsuccess" , 'get' ||
|
||||
UPPER ( SUBSTR ( E . APPFUNC , 1 , 1 ) ) || SUBSTR ( E . APPFUNC , 2 ) ||
|
||||
'Input' AS "inputWrapperIdentifier" , 'get' ||
|
||||
UPPER ( SUBSTR ( E . APPFUNC , 1 , 1 ) ) || SUBSTR ( E . APPFUNC , 2 ) AS
|
||||
"name" , 'get' || UPPER ( SUBSTR ( E . APPFUNC , 1 , 1 ) ) ||
|
||||
SUBSTR ( E . APPFUNC , 2 ) || 'Result' AS
|
||||
"outputWrapperIdentifier" , 'media-resource' AS "querytype" ,
|
||||
E . CONSUMES AS "restConsumes" , E . HTTP_METHOD AS
|
||||
"restHttpRequestMethod" , E . PRODUCES AS "restProduces" ,
|
||||
E . PATH_TEMPLATE AS "restUriPathTemplate" , '*ERRORS' AS
|
||||
"returnsqlstate" , 'true' AS "treatwarningaserror" , '*TRAILING'
|
||||
AS "trimmode" , 'false' AS "wrapInputParams" , 'true' AS
|
||||
"wrapOutputParam" )
|
||||
, XMLELEMENT ( NAME "sql" , XMLATTRIBUTES (
|
||||
'Values Restapi.Execute_Sql(''' || E . APPVER || ''',''' ||
|
||||
E . APPNAME || ''',''' || E . APPFUNC ||
|
||||
''', Cast(Json_Object(' || COALESCE ( PS . PARAMS_TXT , '' ) ||
|
||||
' ) As Varchar(10240) CCSID 37))' AS "statement" )
|
||||
, DX . DATA_FRAGMENT ) ) ORDER BY E . APPFUNC ) ) AS CLOB ( 2 G ) )
|
||||
INTO V_RESULT
|
||||
FROM EP E
|
||||
LEFT JOIN PARAM_STR PS
|
||||
ON PS . APPVER = E . APPVER
|
||||
AND PS . APPNAME = E . APPNAME
|
||||
AND PS . APPFUNC = E . APPFUNC
|
||||
LEFT JOIN DATA_XML DX
|
||||
ON DX . APPVER = E . APPVER
|
||||
AND DX . APPNAME = E . APPNAME
|
||||
AND DX . APPFUNC = E . APPFUNC ;
|
||||
RETURN V_RESULT ;
|
||||
END ;
|
||||
|
||||
GRANT ALTER , EXECUTE
|
||||
ON SPECIFIC FUNCTION RESTAPI.GENERATE_DBML_V2
|
||||
TO AMAPICS WITH GRANT OPTION ;
|
||||
|
||||
GRANT EXECUTE
|
||||
ON SPECIFIC FUNCTION RESTAPI.GENERATE_DBML_V2
|
||||
TO PUBLIC ;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user