要求是仅在db列中更新从前端编辑的列。我正在使用的逻辑是从Java代码向DB程序发送2个数组。
第一个数组是:Column_array,其中包含…
我发现解决方案比数组迭代更简单。
解决方案是使用COALESCE方法。
PROCEDURE TEST ( p_app_id NUMBER, p_service_id NUMBER, p_pubsub_id NUMBER, p_pubsub_name VARCHAR2, p_host VARCHAR2, p_user_name VARCHAR2, p_auth_key VARCHAR2 ) AS BEGIN update bolt_elastic_pubsub_config set PUBSUB_NAME = coalesce(p_pubsub_name, PUBSUB_NAME), HOST = coalesce(p_host, HOST), USER_NAME = coalesce(p_user_name, USER_NAME), AUTH_KEY = coalesce(p_auth_key, AUTH_KEY) where APP_ID = p_app_id AND SERVICE_ID = p_service_id AND PUBSUB_ID = p_pubsub_id; END TEST;
也许您可以尝试避免其中一个列数组,如Oracle值可以容忍的那样,如果值为null。
以下是伪代码。
PROCEDURE update_subscriber_config (p_app_id VARCHAR2, p_service_id VARCHAR2, p_pubsub_id VARCHAR2, p_first_column VARCHAR2, p_second_column VARCHAR2, --column_list string_array, i_array IN my_array_type) AS BEGIN FORALL i IN 1 .. i_array.COUNT UPDATE bolt_oracle_pubsub_config SET your_first_column = TREAT (i_array (i) AS my_array_type).column_array_name, your_second_column = TREAT (i_array (i) AS my_array_type).second_column_array_name WHERE APP_ID = p_app_id AND SERVICE_ID = p_service_id AND PUBSUB_ID = p_pubsub_id; END update_subscriber_config;
如果更新SQL中声明的任何列为空,则在执行更新后,表中的列将为null或为空。话虽如此,确保所有 NOT NULL 或填充必填列。
NOT NULL
我认为由于容易出错而避免动态SQL更新。如果在不使用动态SQL的情况下实现结果,那么为什么动态SQL更新会有麻烦。