oracle - 使用“with data as”子句进行更新,并且不提交正则表达式。为什么?
问题描述
抱歉耽搁了!我承受的工作量比我能应付这几周的还要大。好的,让我们澄清一下!有一个专有软件在它上面运行,我没有能力改变这个软件!实际上它允许我做一些事情。在这种特定情况下,我无法创建关系 1>N,我无法创建新表!我能做的是创建字段。那么,我该如何定制东西呢?通过数据库!使用触发器、函数和过程。我知道这是一个糟糕的“解决方法”,但这是我得到的,并且 99% 的时间都完美无缺。任何异常我的代码都会引发应用程序显示在屏幕上!
问题实际上是更新不起作用。
你问:为什么你在强制只有一次迭代时循环(除非我想 P_QTLINHAS 可以 < 1?) R:因为用户可以在应用程序中选择多行但我不希望他们这样做. 所以在屏幕上抛出一个错误。为什么你有嵌套的开始/结束块。R:因为我可能不得不抛出异常,我习惯于写 begin Statements Exception 一些消息结束。
样本数据:
CREATE TABLE SAMPLE_DATA
(
PKNUMBER NUMBER NOT NULL
, DESCRIPTION VARCHAR2(20)
, GROUPTOCHANGE VARCHAR2(100)
, STATUS VARCHAR2(1 BYTE)
, CONSTRAINT SAMPLE_DATA_PK PRIMARY KEY
(
PKNUMBER
)
ENABLE
);
INSERT INTO sample_data VALUES (1000,'ORDER1',NULL,NULL);
INSERT INTO sample_data VALUES (2000,'ORDER2',NULL,NULL);
INSERT INTO sample_data VALUES (3000,'ORDER3',NULL,NULL);
INSERT INTO sample_data VALUES (4000,'ORDER4','1000,2000,30001',NULL);
在这种情况下,字段 GROUPTOCHANGE 将由用户填写,如“2108,8090,8843”。每个数字代表同一个表“SAMPLE_DATA”中的一个 PKNUMBER。
是的,我知道!用户可以输入错误的内容.. 让我们暂时忽略它!
字段 STATUS 最终将更新为“C”、“L”、“R”或 NULL。发生这种情况时,我需要执行此逻辑:
IF OLD.STATUS <> NEW.STATUS AND GROUPTOCHANGE IS NOT NULL THEN
UPDATE SAMPLE_DATA SP
SET SP.STATUS = :NEW.STATUS
WHERE SP.PKNUMBER IN (:NEW.GROUPTOCHAGE)
AND PS.GROUPTOCHANGE IS NULL;
END IF;
尽管糟糕的设计有可能吗?感谢您的帮助!
这是我到目前为止所做的:
create or replace PROCEDURE "AD_LIBERA_FRETES_FILHOS"(
P_CODUSU NUMBER,
P_IDSESSAO VARCHAR2,
P_QTDLINHAS NUMBER,
P_MENSAGEM OUT VARCHAR2)
AS
P_NUNOTA NUMBER(10);
P_CONTROLE VARCHAR(100);
P_PEDIDOS VARCHAR(100);
P_STATUS VARCHAR(100);
BEGIN
-- avoid more than 1 at a time
IF (P_QTDLINHAS > 1) THEN
RAISE_APPLICATION_ERROR(-20000, 'SELECIONE APENAS UM PEDIDO PARA EXECUTAR ESTA AÇÃO.');
END IF;
FOR I IN 1..P_QTDLINHAS LOOP
--extract param from session
P_NUNOTA := ACT_INT_FIELD(P_IDSESSAO, I, 'PKNUMBER');
P_STATUS := ACT_TXT_FIELD(P_IDSESSAO, I, 'STATUS');
--verify typed text should be "84090,89830,83393..."
BEGIN
SELECT REGEXP_REPLACE(CAB.GROUPTOCHANGE, '[0-9-, ]', ''),
CAB.GROUPTOCHANGE
INTO P_CONTROLE,
P_PEDIDOS
FROM SAMPLE_DATA CAB
WHERE CAB.PKNUMBER = P_NUNOTA;
END;
IF (P_CONTROLE IS NOT NULL) THEN
RAISE_APPLICATION_ERROR(-20000, '<B> SOMETHING WRONG !</B>');
ELSE
--perform de update (not working)
BEGIN
UPDATE SAMPLE_DATA C
SET C.STATUS = P_STATUS
WHERE
C.GROUPTOCHANGE IS NULL AND
C.PKNUMBER IN
(WITH DATA AS
(SELECT CAB.GROUPTOCHANGE STR
FROM SAMPLE_DATA CAB
WHERE CAB.PKNUMBER = P_NUNOTA )
SELECT TRIM(REGEXP_SUBSTR(STR, '[^,]+', 1, LEVEL)) STR
FROM DATA CONNECT BY INSTR(STR, ',', 1, LEVEL - 1) > 0);
END;
END IF;
END LOOP;
--mgs to show
P_MENSAGEM := 'DONE!! CHECK -> '||P_PEDIDOS;
END;
解决方案
推荐阅读
- r - 手动计算聚类平方和 (BCSS) 和总平方和(R 中的聚类)
- python - 在一个函数内启动多个进程使其循环每个启动的进程
- vba - 即使文件关闭并重新打开,如何保持编辑框的值?(在 2016 年的文字中)
- cmake - 使用 Homebrew 在 macOS Big Sur 11.5.1 上编译 FreeCAD,查找 XercesC 文件时出错
- c# - 回调在 JavaScript 与 C# 中运行时间的区别
- android - sdkmanager 警告:无法下载任何源列表
- android - Android:比例重力
- javascript - 显示彩票奖池的美元价值
- yii - 所有角色的 IP 访问规则
- java - 中止流 servlet 响应