Форум: "Базы";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизФункции...Оракл Найти похожие ветки
← →
}|{yk © (2004-04-27 15:20) [0]Создал объекты
CREATE OR REPLACE
type ttablecolumns is OBJECT
(
COLUMN_NAME varchar2(32),
COLUMN_TYPE varchar2(32)
);
CREATE OR REPLACE
type ttablecolumns_tab is table of TTableColumns;
/
Функцию
CREATE OR REPLACE
FUNCTION get_table_cols(Table_Name in varchar2,Owner_Name in varchar2)
return TTableColumns_Tab
is
retval TTableColumns_Tab:=TTableColumns_Tab();
col_name varchar2(32);
col_type varchar2(32);
cursor c_TableCols is
select a.column_name,a.data_type from all_tab_columns a
where a.table_name=Table_name
and a.owner=Owner_Name;
begin
open c_TableCols;
loop
FETCH c_TableCols into col_name,col_type;
exit when c_TableCols%NOTFOUND;
retval.EXTEND;
retval (retval.LAST):=TTableColumns(col_name,col_type);
end loop;
close c_TableCols;
return retval;
end;
/
Функция рабочая, запускается по хитрому из SQL Navigatora. Но когда я вызываю ее из запроса
select * from table (cast(GET_TABLE_COLS("CUST1","CES") as TTableCols_Tab));
получаю ошибку ora-22905
Ее решение Use CAST to cast the item to a nested table type.
Но я же и так применяю cast. Что делать?
← →
Курдль © (2004-04-27 15:26) [1]
> select * from table (cast(GET_TABLE_COLS("CUST1","CES")
> as TTableCols_Tab));
Это круто! :)
Какими компонентами доступаешься?
Если DOA, то могу подсказать. В
TOracleDataset.SQL.Text :=
"begin
:result := ИМЯ_ФУНКЦИИ;
end;"
Variables/Type := Cursor;
Тогда этот датасет начинает принимать набор данных, выданный функцией.
← →
roottim (2004-04-27 16:10) [2]в редких случаях применяю, но можно и так... о целесообразности разговор заводить не буду
вот тебе тестовый пример.. попробуй если надоspool !Create.log
prompt
prompt Creating package TEST
prompt =====================
prompt
CREATE OR REPLACE PACKAGE TEST IS
TYPE TTESTREC IS RECORD (
COLUMN_NAME VARCHAR2(32),
COLUMN_TYPE VARCHAR2(32)
);
TYPE TTESTTABLE IS TABLE OF TTESTREC;
FUNCTION GET_TABLE_COLS(P_TABLE_NAME IN VARCHAR2, P_OWNER_NAME IN VARCHAR2) RETURN TTESTTABLE PIPELINED;
END TEST;
/
prompt
prompt Creating package body TEST
prompt ==========================
prompt
CREATE OR REPLACE PACKAGE BODY TEST IS
FUNCTION GET_TABLE_COLS(P_TABLE_NAME IN VARCHAR2, P_OWNER_NAME IN VARCHAR2) RETURN TTESTTABLE PIPELINED
IS
BEGIN
FOR C IN (
SELECT A.COLUMN_NAME, A.DATA_TYPE FROM ALL_TAB_COLUMNS A
WHERE A.TABLE_NAME = P_TABLE_NAME
AND A.OWNER = P_OWNER_NAME
)
LOOP PIPE ROW (C); END LOOP;
RETURN;
END;
END TEST;
/
spool off
Ну а дальше например такslect * from table(test.get_table_cols("address", "addr"))
и еще.. данная штука будет работает в 9,2... не ниже..
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.034 c