Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle过程-如何将每个记录组合插入表中?_Sql_Oracle_Stored Procedures_Procedure - Fatal编程技术网

Sql Oracle过程-如何将每个记录组合插入表中?

Sql Oracle过程-如何将每个记录组合插入表中?,sql,oracle,stored-procedures,procedure,Sql,Oracle,Stored Procedures,Procedure,我正在处理一个Oracle过程,该过程需要根据传递到参数中的CustomerID将客户和产品的每个组合插入到特定的表中 投入: 客户参数(p_客户-逗号分隔): 即:(1,2,3,4) 订单参数(p_订单-单值) 必须写入的输出表: 客户ID,产品ID 我希望以下查询将为我提供需要插入的产品列表: select ProductID from orders where order_id = p_order_id 编写insert语句最有效的方法是什么 谢谢大家! 根据您的“伪”代码,尝试以下操作

我正在处理一个Oracle过程,该过程需要根据传递到参数中的CustomerID将客户和产品的每个组合插入到特定的表中

投入:

客户参数(p_客户-逗号分隔): 即:(1,2,3,4)

订单参数(p_订单-单值)

必须写入的输出表:

客户ID,产品ID

我希望以下查询将为我提供需要插入的产品列表:

select ProductID from orders where order_id = p_order_id
编写insert语句最有效的方法是什么

谢谢大家!

根据您的“伪”代码,尝试以下操作。我从我的电脑上撕下了部分

假设这些结构:

CREATE TABLE orders (
    orderId    VARCHAR2(100) primary key
  , customerId VARCHAR2(100)
  , productId  VARCHAR2(100)
);

CREATE TABLE output_table (customerId VARCHAR2(100), productId VARCHAR2(100));
代码:

新创建的
csv\u convert
函数的简单单元测试:

SELECT * FROM TABLE(csv_convert('1,2,3,4'));

COLUMN_VALUE
------------
1
2
3
4
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;
/
现在,使用
csv\u convert
函数的存储过程:

SELECT * FROM TABLE(csv_convert('1,2,3,4'));

COLUMN_VALUE
------------
1
2
3
4
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;
/

如果
p_customer
是逗号分隔的字符串,则您发布的查询将不会返回任何结果(除非您的客户
customerid
是字符串“1,2,3,4”)。通常,传入的是集合,而不是逗号分隔的列表。如果必须接受逗号分隔的列表,通常需要解析该列表以在过程中创建集合。在这两种情况下,您都可以使用集合进行交叉联接。不幸的是,我需要接受p_customer作为逗号分隔的字符串。我将如何进行交叉连接以进行插入?那么,在查询中如何实际使用逗号分隔的字符串呢?正如我所说,您发布的查询无法工作。如果您确实有一个有效的查询,这意味着您实际上已经在将逗号分隔列表解析为某种集合,在这种情况下,您可以使用该集合进行交叉联接,具体取决于您选择的集合类型,或者您确实在使用动态SQL构建您发布的
select
查询,这在许多级别上都会有问题。不理解您的需求。你真的是指交叉连接,也就是笛卡尔连接,它意味着所有的组合吗?如果是每个组合,那么为什么还要有“需要插入的产品的查询…列表”?您是否希望一些客户,例如(1,2,3,4)与
订单
表中每个客户的所有相关产品交叉?我在程序的不同部分使用p_客户字符串,通过使用Oracle instr一次处理一个客户记录并搜索逗号。Joshua-谢谢!这段代码看起来完全可以满足我的需要。我非常喜欢您使用函数将csv转换为行的方法。我感谢您的回复,并将于明天将此添加到现有程序中进行尝试。再次感谢你!