我正在处理一个Oracle程序,需要根据传递给参数的CustomerID将Customers和Products的每个组合插入到特定的表中。
输入:
Customers参数(p_customers - 逗号分隔): IE:(1,2,3,4)
订单参数(p_order - 单值)
我必须写的输出表:
CustomerID,ProductID
我希望以下查询能够为我提供需要插入的产品列表:
select ProductID from orders where order_id = p_order_id
编写insert语句的最有效方法是什么?
谢谢!
答案 0 :(得分:1)
基于您的"伪"代码,尝试这样的事情。我从http://www.oratechinfo.co.uk/delimited_lists_to_collections.html
中删除了部分内容假设这些结构:
CREATE TABLE orders (
orderId VARCHAR2(100) primary key
, customerId VARCHAR2(100)
, productId VARCHAR2(100)
);
CREATE TABLE output_table (customerId VARCHAR2(100), productId VARCHAR2(100));
代码:
CREATE TYPE varchar_table IS TABLE OF VARCHAR2(100);
/
CREATE OR REPLACE FUNCTION csv_convert(p_list IN VARCHAR2)
RETURN varchar_table
AS
l_string VARCHAR2(32767) := p_list || ',';
l_comma_index PLS_INTEGER;
l_index PLS_INTEGER := 1;
l_tab varchar_table := varchar_table();
BEGIN
LOOP
l_comma_index := INSTR(l_string, ',', l_index);
EXIT WHEN l_comma_index = 0;
l_tab.EXTEND;
l_tab(l_tab.COUNT) := SUBSTR(l_string, l_index, l_comma_index - l_index);
l_index := l_comma_index + 1;
END LOOP;
RETURN l_tab;
END csv_convert;
/
新创建的csv_convert
函数的简单单元测试:
SELECT * FROM TABLE(csv_convert('1,2,3,4'));
COLUMN_VALUE
------------
1
2
3
4
现在使用csv_convert
函数的存储过程:
CREATE OR REPLACE PROCEDURE cust_products_process (p_customers IN VARCHAR2)
IS
BEGIN
INSERT INTO output_table (customerId, productId)
SELECT customerId, productId
FROM orders o
JOIN TABLE(csv_convert(p_customers)) c
ON (o.customerId = c.column_value);
END;
/