【发布时间】:2014-05-29 01:03:57
【问题描述】:
简明示例和说明
我想编写一个 WHERE IN 子句,从预先填充的一组数字中进行选择
这里有一些代码。我想存储这组数字,并从中进行选择,这样我就不必重复生成这组数字的查询。
ARRAY_OF_NUMBERS = Values from some select statement
-- SHIPMENTS CURSOR
OPEN O_SHIPMENTS_CURSOR FOR
SELECT *
FROM Q194977.AN_SHIPMENT_INFO SI
WHERE INTERNAL_ASN IN (ARRAY_OF_NUMBERS) -- need to populate something
ORDER BY INTERNAL_ASN;
-- ORDER CURSOR
OPEN O_ORDERS_CURSOR FOR
SELECT *
FROM Q194977.AN_ORDER_INFO OI
WHERE INTERNAL_ASN IN (ARRAY_OF_NUMBERS) -- need to populate something
ORDER BY INTERNAL_ASN;
我读过一些关于使用数组的文章,但它说它必须是全局数组而不是会话级别。我不确定这是多么真实,我什至不确定全局数组是什么,但我想这需要是会话级别的,因为它会随着每个程序调用而改变。也许我可以使用一个临时表。
关于我能做到这一点的最佳方式的任何想法?
------------- 编辑 ------------ (添加详细示例)
详细示例及说明
我有 4 个位于 4 个不同层次级别的表和 4 个存储过程。每个过程都包含输入标准,以通过特定级别的标准在所有 4 个级别构建数据选择。
在此示例中,我的调用者将输入存在于纸箱级别的选择标准。然后我将使用从该选择中缩小的 INTERNAL_ASN 编号,向上移动层级并检索:ORDERS this carton is on,SHIPMENTS that ORDER is on,然后向下检索:ITEMS on this CARTON。
我注意到在升级时,我重复了相同的选择,虽然我应该以某种方式存储这组数字,所以我没有每次都重新运行选择来获取它们,但不确定如何。
-- SHIPMENTS CURSOR
OPEN O_SHIPMENTS_CURSOR FOR
SELECT *
FROM Q194977.AN_SHIPMENT_INFO SI
WHERE INTERNAL_ASN IN
(SELECT INTERNAL_ASN
FROM Q194977.AN_CARTON_INFO CI
WHERE (I_BOL IS NULL OR BILL_OF_LADING = I_BOL)
AND ( I_CARTON_NO IS NULL
OR CARTON_NO = I_CARTON_NO)
AND (I_PO_NO = 0 OR PO_NO = I_PO_NO)
AND (I_STORE_NO = 0 OR STORE_NO = I_STORE_NO))
ORDER BY INTERNAL_ASN;
-- ORDER CURSOR
OPEN O_ORDERS_CURSOR FOR
SELECT *
FROM Q194977.AN_ORDER_INFO OI
WHERE INTERNAL_ASN IN
(SELECT INTERNAL_ASN
FROM Q194977.AN_CARTON_INFO CI
WHERE (I_BOL IS NULL OR BILL_OF_LADING = I_BOL)
AND ( I_CARTON_NO IS NULL
OR CARTON_NO = I_CARTON_NO)
AND (I_PO_NO = 0 OR PO_NO = I_PO_NO)
AND (I_STORE_NO = 0 OR STORE_NO = I_STORE_NO))
AND (I_PO_NO = 0 OR PO_NO = I_PO_NO)
ORDER BY INTERNAL_ASN;
-- CARTONS CURSOR
OPEN O_CARTONS_CURSOR FOR
SELECT *
FROM Q194977.AN_CARTON_INFO CI
WHERE (I_BOL IS NULL OR BILL_OF_LADING = I_BOL)
AND (I_CARTON_NO IS NULL OR CARTON_NO = I_CARTON_NO)
AND (I_PO_NO = 0 OR PO_NO = I_PO_NO)
AND (I_STORE_NO = 0 OR STORE_NO = I_STORE_NO)
ORDER BY INTERNAL_ASN;
-- ITEMS CURSOR
OPEN O_ITEMS_CURSOR FOR
SELECT *
FROM Q194977.AN_ITEM_INFO II
WHERE CARTON_NO IN
(SELECT CARTON_NO
FROM Q194977.AN_CARTON_INFO CI
WHERE (I_BOL IS NULL OR BILL_OF_LADING = I_BOL)
AND ( I_CARTON_NO IS NULL
OR CARTON_NO = I_CARTON_NO)
AND (I_PO_NO = 0 OR PO_NO = I_PO_NO)
AND (I_STORE_NO = 0 OR STORE_NO = I_STORE_NO))
ORDER BY INTERNAL_ASN;
【问题讨论】:
-
不确定这是否主要是术语问题。听起来您想要一个模式或数据库级别的数组类型,这意味着在 SQL 中使用
create type创建的东西,而不是在 PL/SQL 中声明的东西。然后您可以使用table()调用而不是in。你是这个意思吗? Something like this, maybe?
标签: arrays oracle plsql set where-in