如何在 PLSQL - APEX 19.2 中使用 JSON-like 对象
How to use JSON-like Objects in PLSQL - APEX 19.2
这不是特定于 Oracle APEX 的问题,但我不知道我正在使用 APEX 的事实是否提供了可能有助于原生 PLSQL 所没有的 API。我在 APEX 19.2 中使用 Oracle 数据库 19c。
我有一个功能可以验证密码是否符合指定准则。有时我只想知道密码是否有效(是或否),其他时候我还想包括验证错误以显示给用户(添加到 APEX 错误堆栈 - 我知道如何执行此操作)。
基于此,有没有办法使用PLSQL return 类似于JSON 或JavaScript 的PLSQL 对象?如果是这样,我将如何在 validate_password PLSQL 函数中构建对象?我怎样才能在其他 PLSQL packages/functions/etc 中使用这个对象?非常感谢任何可供我阅读的示例或文档链接。
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 objects/arrays。 Oracle-Base has a decent article 演示了这些对象的一些功能。如果可以选择,应该使用 JSON_OBJECT_T/JSON_ARRAY_T,因为它们的执行速度比 APEX_JSON.
快得多
下面是一些示例函数,演示了如何使用这两个选项进行一些密码验证以及return 您描述的 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"
}
这不是特定于 Oracle APEX 的问题,但我不知道我正在使用 APEX 的事实是否提供了可能有助于原生 PLSQL 所没有的 API。我在 APEX 19.2 中使用 Oracle 数据库 19c。
我有一个功能可以验证密码是否符合指定准则。有时我只想知道密码是否有效(是或否),其他时候我还想包括验证错误以显示给用户(添加到 APEX 错误堆栈 - 我知道如何执行此操作)。
基于此,有没有办法使用PLSQL return 类似于JSON 或JavaScript 的PLSQL 对象?如果是这样,我将如何在 validate_password PLSQL 函数中构建对象?我怎样才能在其他 PLSQL packages/functions/etc 中使用这个对象?非常感谢任何可供我阅读的示例或文档链接。
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 objects/arrays。 Oracle-Base has a decent article 演示了这些对象的一些功能。如果可以选择,应该使用 JSON_OBJECT_T/JSON_ARRAY_T,因为它们的执行速度比 APEX_JSON.
快得多下面是一些示例函数,演示了如何使用这两个选项进行一些密码验证以及return 您描述的 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"
}