Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.039 c
14-1083683877
Gero
2004-05-04 19:17
2004.05.23
Изменение программы в памяти во время выполнения


8-1077633309
BBCHa
2004-02-24 17:35
2004.05.23
Озвучка текста.


1-1084307011
Дима
2004-05-12 00:23
2004.05.23
Строки


4-1081006648
Kor@l
2004-04-03 19:37
2004.05.23
Удаление


14-1083513711
madmanStas
2004-05-02 20:01
2004.05.23
e-mail





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский