powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Привести plsql тип к типу sql
14 сообщений из 14, страница 1 из 1
Привести plsql тип к типу sql
    #40121679
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Подскажите, есть ли возможность реализовать пожобный код:

create or replace package PKG_CONSTANTS
is
TYPE R_RECORD IS RECORD (
L_STRING_1 VARCHAR2(1000) := null,
L_STRING_2 VARCHAR2(1000) := null,
L_STRING_3 VARCHAR2(1000) := null,
L_STRING_4 VARCHAR2(1000) := null,
L_STRING_5 VARCHAR2(1000) := null,
L_STRING_6 VARCHAR2(1000) := null,
L_STRING_7 VARCHAR2(1000) := null,
L_STRING_8 VARCHAR2(1000) := null,
L_STRING_9 VARCHAR2(1000) := null,
L_STRING_10 VARCHAR2(1000) := null);

TYPE CUR_RECORD IS REF CURSOR RETURN R_RECORD;
end;

create or replace function F_CREATE_RECORD
(
P_STRING_1 in VARCHAR2 := null,
P_STRING_2 in VARCHAR2 := null,
P_STRING_3 in VARCHAR2 := null,
P_STRING_4 in VARCHAR2 := null,
P_STRING_5 in VARCHAR2 := null,
P_STRING_6 in VARCHAR2 := null,
P_STRING_7 in VARCHAR2 := null,
P_STRING_8 in VARCHAR2 := null,
P_STRING_9 in VARCHAR2 := null,
P_STRING_10 in VARCHAR2 := null)
return PKG_CONSTANTS.R_RECORD
is
LR_RECORD PKG_CONSTANTS.R_RECORD;
begin

LR_RECORD.L_STRING_1 := P_STRING_1;
LR_RECORD.L_STRING_2 := P_STRING_2;
LR_RECORD.L_STRING_3 := P_STRING_3;
LR_RECORD.L_STRING_4 := P_STRING_4;
LR_RECORD.L_STRING_5 := P_STRING_5;
LR_RECORD.L_STRING_6 := P_STRING_6;
LR_RECORD.L_STRING_7 := P_STRING_7;
LR_RECORD.L_STRING_8 := P_STRING_8;
LR_RECORD.L_STRING_9 := P_STRING_9;
LR_RECORD.L_STRING_10 := P_STRING_10;

return LR_RECORD;

end F_CREATE_RECORD;


declare
L_CUR_RECORD PKG_CONSTANTS.CUR_RECORD;
begin
OPEN L_CUR_RECORD FOR select F_CREATE_RECORD(
P_STRING_1 => D.COLUMN_VALUE1,
P_STRING_2 => D.COLUMN_VALUE2,
P_STRING_5 => D.COLUMN_VALUE3,
P_STRING_10 => D.COLUMN_VALUE4)
FROM SOME_TABLE D;

for c in (select * from table(F_PIPELINE_FUNCTION(L_CUR_RECORD)))
loop
--some doing;
end loop;

end;


Смысл: зделать универсальный курсор для разных запросов, записи которого обрабатываются в конвеерной функции.
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121716
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lemkoleg

Смысл: зделать универсальный курсор для разных запросов, записи которого обрабатываются в конвеерной функции.

что-то очень сложно
так чем хуже
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare
TYPE R_RECORD IS RECORD (
L_STRING_1 VARCHAR2(1000) := null,
L_STRING_2 VARCHAR2(1000) := null,
L_STRING_3 VARCHAR2(1000) := null);

TYPE CUR_RECORD IS REF CURSOR RETURN R_RECORD;
L_CUR_RECORD CUR_RECORD;
begin
OPEN L_CUR_RECORD FOR select to_char(empno),ename,job from emp;

--for c in (select * from table(F_PIPELINE_FUNCTION(L_CUR_RECORD)))
--loop
--some doing;
--end loop;
close L_CUR_RECORD;
end;



.....
stax
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121745
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,
Тем, ято строка должна соответствовать строке выборки. А, это нужно создавать отдельные строки, для каждой выборки. Соответственно, конвеерных функций , тоже. Т.к. у них будут разные типы входных данных
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121751
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lemkoleg,

я примерно так понимаю
в F_PIPELINE_FUNCTION передается курсор, чтоб вернуть несколько другие записи (добавить, исключить, заменить)

для етого достаточно обьявить табличний тип со структурой аля R_RECORD

курсор будет универсальный в плане до 10-ти полей varchar2(1000),а дальше что ...


.....
stax
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121756
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LemkolegСмысл: зделать универсальный курсор для разных запросов, записи которого
обрабатываются в конвеерной функции.

И что Вы будете делать если очередной "разный запрос" будет иметь меньше полей,
чем требуется функции для работы?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121760
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

"разный" в плане разные from,where ....

.....
stax
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121761
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
Lemkoleg,

я примерно так понимаю
в F_PIPELINE_FUNCTION передается курсор, чтоб вернуть несколько другие записи (добавить, исключить, заменить)

для етого достаточно обьявить табличний тип со структурой аля R_RECORD

курсор будет универсальный в плане до 10-ти полей varchar2(1000),а дальше что ...


.....
stax

А, дальше: конвеерная функция обрабатывает все не нулл поля одинаково. По-этому, нужно привести результат запроса к одному типу. Что и пытается зделать функция F_CREATE_RECORD. Но, т к. это тип PLSQL , то вызывается ошибка. Вот я и ищу решение (если оно существует)
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121763
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и не понял гениальной задумки.
Чисто технически - чтобы заставить работать Ваш код, можно создать тип уровня схемы.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create TYPE R_RECORD as object(
L_STRING_1 VARCHAR2(1000),
L_STRING_2 VARCHAR2(1000),
L_STRING_3 VARCHAR2(1000),
L_STRING_4 VARCHAR2(1000),
L_STRING_5 VARCHAR2(1000),
L_STRING_6 VARCHAR2(1000),
L_STRING_7 VARCHAR2(1000),
L_STRING_8 VARCHAR2(1000),
L_STRING_9 VARCHAR2(1000),
L_STRING_10 VARCHAR2(1000))
/



функцию create_record вполне заменит умолчательный конструктор
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 select R_RECORD (
D.COLUMN_VALUE1,
D.COLUMN_VALUE2,
...
D.COLUMN_VALUE3,
D.COLUMN_VALUE4
...
) my_rec
FROM SOME_TABLE D;
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121765
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,
а, курсор какого типа данных будет?
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121766
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос не понял
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121769
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax"разный" в плане разные from,where ....

Воот... И тут мы приходим к тому, что в части select-list запросы все
одинаковые. Остаётся всего один шаг: выкинуть из картины "PL/SQL тип" и
передавать из курсора в функцию поля этого select-list одно за другим.
Единственное что мешает этому простому и надёжному решению - топикстартеру лень
набирать имена всех этих полей. Очевидно, тонкая кожа на пальцах стирается до
кровавых мозолей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121770
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Вопрос не понял

Курсор имееь жестску привьязку к типу. Для того, чтоб была ОДНА конвеерная функция. Значик, курсор должен быть приведенным к этому типу.
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121772
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Stax"разный" в плане разные from,where ....

Воот... И тут мы приходим к тому, что в части select-list запросы все
одинаковые. Остаётся всего один шаг: выкинуть из картины "PL/SQL тип" и
передавать из курсора в функцию поля этого select-list одно за другим.
Единственное что мешает этому простому и надёжному решению - топикстартеру лень
набирать имена всех этих полей. Очевидно, тонкая кожа на пальцах стирается до
кровавых мозолей.

Нн только лень набирать имена полей. А еще, для каждого запроса, лень создавать свой тип записи и конвеерную функцию. Зачем мне столько шлака
...
Рейтинг: 0 / 0
Привести plsql тип к типу sql
    #40121775
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LemkolegА еще, для каждого запроса, лень создавать свой тип записи и конвеерную функцию.

Повторяю медленно: функция - одна. Запись - вообще не нужна. Передавай отдельные
значения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Привести plsql тип к типу sql
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]