#oracle #loops #stored-procedures #plsql #oracle-sqldeveloper
#Oracle #циклы #хранимые процедуры #plsql #oracle-sqldeveloper
Вопрос:
привет, вот мой пример кода.
мне нужно вставить данные из обеих процедур все вместе, а не одну за другой .. этот код вставляет данные 1-го из первой процедуры, а затем из второй с номером строки, которую 1-й закончил вставлять.Пожалуйста, предложите способ, с помощью которого я могу вставить данные все вместе, а не последовательно.
create or replace package body help
as
procedure main_proc(param1 number,param2 number,v1 out number,v2 out number)
is
v_resultset help.cursortype-->this is defined in the package spec
v_name varchar2(10);
v_code varchar2(40);
begin
v1:=param1;
v2:=param2;
proc1(v1,v_resultset);
LOOP
FETCH v_resultSet INTO v_name;
EXIT WHEN v_Resultset%NOTFOUND;
Dbms_Output.Put_Line('Error in Proc1');
INSERT INTO temp_table(name) values(v_name) ;
END LOOP;
proc2(v1,v2,v_resultset);
LOOP
FETCH v_resultSet INTO v_code;
EXIT WHEN v_Resultset%NOTFOUND;
Dbms_Output.Put_Line('Error in Proc2');
INSERT INTO temp_table(code) values(v_code) ;
END LOOP;
end main_proc;
proc1(v_name VARCHAR2,r_resultset out help.cursortype)
is
begin
open r_resultset for
select name from emp where dept_id=2;
end;
proc2(v_name VARCHAR2,v_code VARCHAR2,r_resultset out help.cursortype)
is
begin
open r_resultset for
select code from code_table where dept_id=3;
end;
end help;
Мне нужно вставить все данные вместе, а не последовательно в мою глобальную временную таблицу.
эта процедура вставляет данные , как показано ниже : код имени
кларк (ноль)
Джонс (ноль) Смит (ноль) адам (ноль) (ноль) 001 (ноль) 002 (ноль) 003 (ноль) 004
в то время как я хочу, чтобы он был вставлен как
код имени кларк 001 Джонс 002 смит 003
Адам 004
procedure packagecategory_info(p_item_cat number,p_item_sub_cat number,p_pack_cat_id number,package_sub_cat number,pc_Resultset out Master_Product_Report.cursortype)
is
begin
if p_item_sub_cat is null and p_pack_cat_id is null and package_sub_cat is null then
open pc_Resultset for
Select Name From Packagecategory Where Itemcategory_Id in (select id from itemcategory start with id=p_item_cat connect by prior id=parent_id);
elsif p_pack_cat_id is null and package_sub_cat is null then
open pc_Resultset for
Select Name From Packagecategory Where Itemcategory_Id In (Select Id From Itemcategory Where Parent_Id Is Not Null Start With Id=P_Item_Sub_Cat Connect By Prior Id=Parent_Id);
Elsif Package_sub_Cat Is Null Then
open pc_Resultset for
select name from packagecategory start with id=p_pack_cat_id connect by prior id=parent_id and level_id !=3;
Else
open pc_Resultset for
select name from packagecategory where id=package_sub_cat;
end if;
End packagecategory_info;
----- Main procedure in which above proc would be called
create or replace
package body Master_Product_Report as
procedure Product_Report (p_item_cat number,p_sub_cat number,p_pack_cat_id number,p_pack_sub_cat_id number,p_pack_id number,v1 out number,v2 out number,v3 out number,v4 out number,v5 out number)
is
----------
--some code--
packagecategory_info(v1,v2,v3,v4,v_resultSet);
Loop
Fetch V_Resultset Into V_Pack_cat_Name;
EXIT WHEN v_Resultset%NOTFOUND;
Dbms_Output.Put_Line('Error in Proc2');
INSERT INTO MASTER_PRODUCT_TABLE(PACKAGE_SUB_CAT_NAME) values(v_pack_cat_name) ;
END LOOP;
Комментарии:
1. Что вы подразумеваете под «вставлять данные все вместе, а не последовательно»? Не имеет значения, как данные хранятся в таблице, важно только то, как вы упорядочиваете их во время выбора.
2. ВИДИТЕ ЛИ, МОИ ДАННЫЕ ПОСТУПАЮТ ИЗ РАЗНЫХ ТАБЛИЦ, И ОНИ ТАКЖЕ ИЗВЛЕКАЮТСЯ РАЗНЫМИ PROCEDURES….SO ВМЕСТО ОТОБРАЖЕНИЯ ДАННЫХ В ТАБЛИЦЕ LIKE………………NAME -> ДЖОНС АЛЕКС КЛАРК, А ЗАТЕМ ВСТАВЛЯЕТСЯ КОД ИЗ 4-ГО РЯДА ВМЕСТО ЭТОГО ОТОБРАЖАЕТСЯ ПЕРЕД ИМЕНАМИ. ЭТО ТО, ЧТО Я ИМЕЛ В ВИДУ ПОД «ВСЕ ВМЕСТЕ».
3. Вы можете объединить два запроса, ОБЪЕДИНИВ ВСЕ. Также вам не нужно использовать какие-либо курсоры и хранимые процедуры для этой цели. Это может быть сделано только одним оператором.
4. ну, это всего лишь небольшой код, который я сделал, чтобы было ясно, что именно я хочу сделать, в то время как это бизнес-требование, и код похож на 1500 LOC, который нельзя скопировать сюда. данные, хранящиеся в таблице, должны отображаться во внешнем интерфейсе. Это требование не может быть выполнено простым объединением и объединениями, поэтому оно должно храниться надлежащим образом. надеюсь, вы получите то, что я точно ищу.
5. Неверно ‘ОТОБРАЖАЕТСЯ В ТАБЛИЦЕ’. Данные отображаются при их извлечении. Если вы говорите о порядке записей, единственный способ его изменить — это УПОРЯДОЧИТЬ.
Ответ №1:
Если я в конце концов все сделаю правильно:
proc1(v1, v_names);
proc2(v1, v2, v_codes);
LOOP
FETCH v_names INTO v_name;
FETCH v_codes INTO v_code;
EXIT WHEN v_names%NOTFOUND;
EXIT WHEN v_codes%NOTFOUND;
INSERT INTO temp_table(name, code) values(v_name, v_code);
END LOOP;
close v_names;
close v_codes;
Обратите внимание, что равенство количества строк, возвращаемых обработками, зависит от вас. Если количество строк больше, чем количество кодов, некоторые сотрудники не будут вставлены во временную таблицу.
Комментарии:
1. что ж, теперь я сталкиваюсь с проблемой, о которой вы упомянули: «Обратите внимание, что равенство количества строк, возвращаемых обработками, зависит от вас. Если количество строк больше количества кодов, некоторые сотрудники не будут вставлены в temp_table.’: (каким может быть решение для этого
2. Это зависит от логики, которую вы хотите использовать для генерации кодов. Вы должны исправить запрос в proc2(), чтобы он выдавал достаточно кодов.
3. я никак не могу исправить запрос, поскольку данные очень большие, и это живое приложение, которое будет работать вечно, поэтому исправление данных не вариант. Пожалуйста, предложите, можно ли использовать какую-либо альтернативу или какую-либо другую структуру, которую я могу использовать для вставки данных во временную таблицу, для которой каждый столбец не имеет того же количества записей, что и предыдущий или следующий столбец. Мне нужен срочный ответ: (
4. создайте последовательность my_codes; вставьте в temp_table (имя, код) выберите name, to_char(my_codes.nextval, ‘00000000’) из emp, где dept_id=2; ?
5. но мне нужно вставить их через курсор resultset refcursor, который я использовал выше