Краткий пример и объяснение
Я хочу написать предложение 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, суженные из этого выбора, для перемещения вверх по иерархическим уровням и извлечения: ЗАКАЗЫ, на которых находится эта коробка, ПОСТАВКИ, на которых находится ЗАКАЗ, а затем вниз, чтобы получить: ПРЕДМЕТЫ в этой КОРОБКЕ.
Я заметил, что при повышении уровня я повторял один и тот же выбор, и хотя я должен каким-то образом сохранить этот набор чисел, поэтому я не запускал выбор каждый раз, чтобы получить их, но не знал, как это сделать.
-- 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;
create type
, а не объявленное в PL/SQL. Затем вы можете использовать вызовtable()
вместоin
. Это то, что вы имели ввиду? Может быть, что-то вроде этого? - person Alex Poole   schedule 15.04.2014