How to use JSON-like Objects in PLSQL - APEX 19.2



这不是Oracle APEX特有的问题,但我不知道我使用APEX的事实是否提供了本机PLSQL所没有的API。我使用的是带有APEX 19.2的Oracle数据库19c。

我有一个函数,它将验证密码是否符合指定的准则。有时我只想知道密码是否有效(是或否(,其他时候我还想包括验证错误以显示给用户(添加到APEX错误堆栈-我知道如何做到这一点(。

基于此,是否有一种方法可以使用PLSQL返回类似于JSON或JavaScript的PLSQL对象?如果是,我将如何在validate_password PLSQL函数中构建对象?我将如何在其他PLSQL包/函数等中使用此对象。?任何链接到示例或文档供我阅读都将不胜感激。

CREATE OR REPLACE FUNCTION validate_password(p_password IN VARCHAR2)
RETURN [OBJECT]

其中[OBJECT]将采用某种形式:

{ valid: "Y" or "N",
errors: [
"Must contain one uppercase",
"Must contain one lowercase"...
]
}

APEX有一个包APEX_JSON,可用于构建或解析JSON。如果您使用的Oracle数据库版本不具有本地JSON功能,那么它非常方便。

从Oracle Database 12.2开始,Oracle引入了JSON_OBJECT_T和JSON_ARRAY_T,它们可以非常容易地帮助解析和构建JSON对象/数组。OracleBase有一篇不错的文章演示了这些对象的一些功能。如果您有此选项,则应使用JSON_OBJECT_T/JSON_ARRAY_T,因为它们的执行速度要比APEX_JSON快得多。

下面是一些示例函数,演示了如何使用这两个选项进行一些密码验证,并以您描述的JSON结构返回结果。

示例程序

DECLARE
l_password   VARCHAR2 (50) := '123';
FUNCTION validate_password_json (p_password VARCHAR2)
RETURN VARCHAR2
IS
l_output   json_object_t := json_object_t ();
l_errors   json_array_t := json_array_t ();
BEGIN
IF NOT REGEXP_LIKE (p_password, '[a-z]')
THEN
l_errors.append ('Password must contain a lowercase letter');
END IF;
IF NOT REGEXP_LIKE (p_password, '[A-Z]')
THEN
l_errors.append ('Password must contain an uppercase letter');
END IF;
l_output.put ('valid', CASE WHEN l_errors.get_size = 0 THEN 'Y' ELSE 'N' END);
l_output.put ('errors', l_errors);
RETURN l_output.stringify;
END;
FUNCTION validate_password_apex (p_password VARCHAR2)
RETURN VARCHAR2
IS
l_valid   VARCHAR2 (1) := 'Y';
BEGIN
apex_json.initialize_clob_output;
apex_json.open_object;
apex_json.open_array ('errors');
IF NOT REGEXP_LIKE (p_password, '[a-z]')
THEN
l_valid := 'N';
apex_json.write ('Password must contain a lowercase letter');
END IF;
IF NOT REGEXP_LIKE (p_password, '[A-Z]')
THEN
l_valid := 'N';
apex_json.write ('Password must contain an uppercase letter');
END IF;
apex_json.close_array;
apex_json.write ('valid', l_valid);
apex_json.close_object;
RETURN apex_json.get_clob_output;
END;
BEGIN
DBMS_OUTPUT.put_line ('JSON_OBJECT_T/JSON_ARRAY_T Output');
DBMS_OUTPUT.put_line (validate_password_json (l_password));
DBMS_OUTPUT.put_line ('---------------------------------');
DBMS_OUTPUT.put_line ('APEX_JSON Output');
DBMS_OUTPUT.put_line (validate_password_apex (l_password));
END;
/

示例输出

JSON_OBJECT_T/JSON_ARRAY_T Output
{"valid":"N","errors":["Password must contain a lowercase letter","Password must contain an uppercase letter"]}
---------------------------------
APEX_JSON Output
{
"errors":[
"Password must contain a lowercase letter"
,"Password must contain an uppercase letter"
]
,"valid":"N"
}

最新更新