【发布时间】:2015-12-02 12:13:14
【问题描述】:
在这个过程中,我想插入 userid 值不同,就像在这个选择查询中我们插入所有数据一样。
T_ALLOCATIONCONFIG 表的内容:
id userid customerid subbatchtypeid
---- -------- ------------ ----------------
1 29 10003 1
1 30 10003 1
VW_BATCH 表的内容:
batchid batchname subbatchtypeid customerid batchstatus_id
--------- ----------- ---------------- ------------ ----------------
1 test 1 10003 1
2 test1 1 10003 1
3 test2 1 10003 1
4 test3 1 10003 1
5 test4 1 10003 1
6 test5 1 10003 1
7 test6 1 10003 1
8 test7 1 10003 1
9 test8 1 10003 1
10 test9 1 10003 1
11 test12 1 10003 1
我想要T_BATCHALLOCATION 表中的这种类型的结果:
id batchid customerid userid
---- --------- ----------- --------
1 1 10003 29
2 2 10003 29
3 3 10003 29
4 4 10003 29
5 5 10003 29
6 6 10003 30
7 7 10003 30
8 8 10003 30
9 9 10003 30
10 10 10003 30
假设我们有 10 条来自 vw_batch 的记录,所以我想在 batchallocation 表中插入 5 条带有 userid = 29 的记录和 5 条带有 userid = 30 的记录。
如何编写查询或存储过程来插入这种结果?
CREATE OR REPLACE PROCEDURE p_autoallocate_batches
AS
BEGIN
DECLARE
-- v_coll_rules_id coll_rules.coll_rules_id%TYPE;
v_customer_id t_customers.customer_id%TYPE;
v_batchid t_batch.batchid%TYPE;
v_user_id t_users.user_id%TYPE;
c types.cursortype;
CURSOR c_aa IS
SELECT b.customer_id,
b.batchid,
a.user_id
FROM vw_batch b
JOIN t_allocationconfig a
ON a.customer_id = b.customer_id
AND a.subbatchtypeid = b.subbatchtypeid
WHERE b.batchstatus = 'New' AND a.isactive = 'Y';
BEGIN
-- Dbms_Output.Put_Line('Hello World');
-- Insert Into Tmp (Column1) Values ('Started');
OPEN c_aa;
LOOP
FETCH c_aa INTO v_customer_id, v_batchid, v_user_id;
EXIT WHEN c_aa%NOTFOUND;
IF (v_customer_id > 0 AND v_batchid > 0 AND v_user_id > 0) THEN
INSERT INTO t_batchallocation (customer_id, batchid, user_id, created_by, created_date)
VALUES (v_customer_id, v_batchid, v_user_id, 1, sysdate);
UPDATE t_batch
SET batchstatus_id = 2, modified_by = 1, modified_date = sysdate
WHERE batchid = v_batchid;
END IF;
--Insert Into Tmp (Column1) Values ('Started123');
COMMIT;
END LOOP;
CLOSE c_aa;
END;
END;
【问题讨论】:
-
你真的需要在 PL/SQL 中做吗?我认为您可以使用 MERGE 语句在纯 SQL 中一步完成。
-
请给我一个使用 MERGE 的例子。是的,我需要 oracle sql developer
-
SQL Developer 是一个工具。 SQL 是一种语言。不管怎样,只要在网站上搜索 MERGE 语句,你就会得到很多例子。
-
您有两个不同的表用于插入和更新?它们合并不适用于不同的表。
-
摆脱显式游标,而是使用 cursor for loop 这将是高效的,因为它会在引擎盖下执行
bulk collect limit 100。
标签: oracle stored-procedures plsql cursor sql-insert