【发布时间】:2020-03-09 12:26:24
【问题描述】:
我正在开发一个程序并在验证用逗号分隔的字段的步骤处停止。
我需要验证该字段中有两条以逗号分隔的记录,如果存在,请通过删除条目记录并保留另一条来更新该字段。 如果有超过 2 条记录,请检查哪条记录是输入记录并验证它是在逗号的左侧还是右侧以执行字段更新并将其他记录保留在那里。
我将演示下面的字段:
CONCIL
RECORDa,RECORDb,RECORDc
这是我目前所开发的:
CREATE OR REPLACE PROCEDURE SP_CANCEL (
P_COD_MATRIZ INT,
P_CONCIL IN TB_EDIEXT_PERFIL.COD_MATRIZ%TYPE,
P_ID_CONCIL INT
)
IS
V_VIRGULA INT;
V_RIGHT VARCHAR2(100);
BEGIN
IF P_ID_CONCIL IS NOT NULL
THEN
DELETE FROM TB_EDIEXT_PERFIL_MBX WHERE ID_MBX = P_ID_CONCIL AND ID_PERFIL = (SELECT ID FROM TB_EDIEXT_PERFIL
WHERE COD_MATRIZ = P_COD_MATRIZ);
END IF;
IF TB_EDIEXT_PERFIL.CD = 1 THEN
DELETE FROM TB_EDIEXT_PERFIL_CD WHERE ID_CD = P_ID_CONCIL AND ID_PERFIL = (SELECT ID FROM TB_EDIEXT_PERFIL
WHERE COD_MATRIZ = P_COD_MATRIZ);
UPDATE TB_EDIEXT_PERFIL SET CD = 0 WHERE COD_MATRIZ = P_COD_MATRIZ;
ELSIF TB_EDIEXT_PERFIL_SFTP = 1 THEN
DELETE FROM TB_EDIEXT_PERFIL_SFTP WHERE ID_SFTP = P_ID_CONCIL AND ID_PERFIL = (SELECT ID FROM TB_EDIEXT_PERFIL
WHERE COD_MATRIZ = P_COD_MATRIZ);
UPDATE TB_EDIEXT_PERFIL SET SFTP = 0 WHERE COD_MATRIZ = P_COD_MATRIZ;
END IF;
SELECT REGEXP_COUNT((SELECT TB_EDIEXT_PERFIL.CONCIL
FROM TB_EDIEXT_PERFIL
WHERE COD_MATRIZ = P_COD_MATRIZ), ',') INTO V_VIRGULA FROM DUAL;
IF V_VIRGULA = 0 THEN
UPDATE TB_EDIEXT_PERFIL SET CONCIL = 'EC' WHERE COD_MATRIZ = P_COD_MATRIZ;
END IF;
SELECT
SUBSTR(TO_CHAR((SELECT TB_EDIEXT_PERFIL.CONCIL
FROM TB_EDIEXT_PERFIL
WHERE COD_MATRIZ = P_COD_MATRIZ)), INSTR(TO_CHAR((SELECT TB_EDIEXT_PERFIL.CONCIL
FROM TB_EDIEXT_PERFIL
WHERE COD_MATRIZ = P_COD_MATRIZ)), ',') +1)
INTO V_RIGHT FROM DUAL;
-- Here is the rule for validating the field separated by commas
END;
/
记住: 该字段最多可以包含三个记录。 并在声明 P_CONCIL 签入时删除记录。
手动例程:
DELETE FROM TB_EDIEXT_PERFIL_MBX where ID_PERFIL = (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = '0000000000') AND ID = '0000';
DELETE FROM TB_EDIEXT_PERFIL_SFTP WHERE ID_PERFIL = (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = '0000000000') AND ID = '0000';
UPDATE TB_EDIEXT_PERFIL SET SFTP = 0 WHERE COD_MATRIZ = '0000000000';
UPDATE TB_EDIEXT_PERFIL SET CONCIL = 'EC' WHERE COD_MATRIZ = '0000000000';
SELECT ID, COD_MATRIZ, CONCIL, CD, SFTP FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = '0000000000';
SELECT * FROM TB_EDIEXT_PERFIL_MBX where ID_PERFIL = (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = '0000000000');
SELECT * FROM TB_EDIEXT_PERFIL_SFTP where ID_PERFIL = (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = '0000000000');
谢谢你,我期待得到很大的帮助!
【问题讨论】:
-
如果总是有两个字段,那么不要在单个列中使用逗号分隔的字符串;使用适当数据类型的两列。
-
好的,但是定义列的是数据库管理员。我目前无事可做创建或更改表。
-
你能(以外交方式)告诉 DBA 他们错了吗?使用逗号分隔的字符串来存储成对的值是一种复杂且越来越难以维护的解决方案的秘诀,如果你可以将将相同的值放入具有明确定义的数据类型的两列中。保持简单!
-
我已经尝试并设计了此类基础架构的解决方案,但我仍然没有反馈。我知道我要求的不是正常形式的数据库,但我需要暂时的帮助来制定此规则,以消除手动完成的任务,从而消除错误。
-
你继续发布更多代码;请edit您的问题并发布DATA!您的基础表的结构是什么?这些表的行中有哪些值?当您调用该函数时,您使用什么输入值?您希望这些表中的值如何变化(请用英语而不是通过更多代码描述此过程)?请假设我们不理解您在说什么(因为很可能我们不理解)并且只用代码(或关于“矩阵取消”或您未描述的表和列)进行讨论会造成混淆我们。