Табличная функция в Oracle - PullRequest
0 голосов
/ 09 июля 2020

Я давно пользуюсь функциями сервера SQL. Функции можно использовать в предложении FROM и можно указать предложение WHERE. В SQL Server предложение WHERE используется внутри самой функции. В отличие от Oracle, предложение WHERE применяется после того, как функция выдала результаты.

Разница важна, если функция без WHERE возвращает много результатов. Кроме того, в SQL Server индексы внутри функции используются, если WHERE применяется к столбцу с индексом.

Пример:

CREATE TABLE table_test (
col1 varchar(50),
col2 varchar(50)
)

--INSERT TEST DATA
Declare @Id int
Set @Id = 1
While @Id <= 1000000
Begin 
   Insert Into table_test values ('col1' + CAST(@Id as nvarchar(10)), 'col2' + CAST(@Id as nvarchar(10)))
     Set @Id = @Id + 1
End


CREATE FUNCTION func_test() RETURNS TABLE 
AS
RETURN 
(
    SELECT * FROM table_test 
)
GO

CREATE NONCLUSTERED INDEX ixd_test ON table_test (col1) INCLUDE (col2)

SELECT * FROM func_test() WHERE col1 like 'col132%' 

введите описание изображения здесь

Есть ли аналогичный тип функции в Oracle?

1 Ответ

0 голосов
/ 09 июля 2020

Создать таблицу

CREATE TABLE table_test (
    col1 varchar(50),
    col2 varchar(50)
)

После того, как вы введете данные в test_table (используя что-то вроде следующего)

Begin
for i in 1..1000000 loop
   Insert Into table_test values ('col1' || TO_CHAR(i), 'col2' || TO_CHAR(i));
end loop;
commit;
End;
/

Может сработать что-то вроде следующего. (Протестировано с использованием oracle live sql)

-- Create row definition
create OR REPLACE TYPE SOME_ROW_TYPE AS OBJECT
(
    COL1 varchar2(50),
    COL2 varchar2(50)
)
/
-- Create table definition
create type SOME_TABLE_TYPE as table of SOME_ROW_TYPE
/


CREATE OR REPLACE FUNCTION DoStuff RETURN SOME_TABLE_TYPE AS
-- Declarations
RET_TABLE SOME_TABLE_TYPE := SOME_TABLE_TYPE();
CURSOR DATA_FETCH IS
    SELECT
        COL1,
        COL2
    FROM TABLE_TEST;
BEGIN
FOR ITEM IN DATA_FETCH LOOP
RET_TABLE.extend;
RET_TABLE(RET_TABLE.LAST) := SOME_ROW_TYPE(
    ITEM.COL1,
    ITEM.COL2);
END LOOP;


RETURN RET_TABLE;
END;
/

Создание индекса

CREATE INDEX index_name ON table_test(col1)

выборка через

select * from DoStuff() WHERE col1 like 'col132%' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...