SELECT DISTINCT L.* FROM LABALES L , MATCHES M
WHERE M.LIST LIKE '%ENG'
ORDER BY L.ID
Мне нужно создать функцию с этим выбором, я пробовал это, но это не сработало.
CREATE OR REPLACE FUNCTION getSoccerLists
RETURN varchar2 IS
list varchar2(2000);
BEGIN
SELECT DISTINCT L.* FROM LABALES L , MATCHES M
WHERE M.LIST LIKE '%ENG'
ORDER BY L.ID
return list;
END;
Как мне создать функцию, которая возвращает все из таблицы L.
Спасибо
Какую ошибку выдает ??
@jarlh Когда я запускаю select, я получаю результаты, так что select хорош. Но я хочу, чтобы он работал ...
Оператор sql @NishantGupta игнорируется, конец строки указанного идентификатора, отсутствует двойная кавычка
извините, но следующая ссылка не от SO, но определенно поможет вам решить вашу проблему - sqljana.wordpress.com/2017/01/22/…
Зачем вам вообще нужна функция? Если вы просто хотите сохранить запрос для повторного использования, сделайте его представлением. И как уже упоминалось: запрос не имеет смысла. Вы дублируете записи LABALES на количество совпадений "% ENG", а затем снова отклоняете все дубликаты с помощью DISTINCT. Вероятно, вы получите тот же результат с простым select * from labales.
Мне сказали сделать функцию или процедуру вместо запроса, вероятно, не запускать select все время, когда кому-то нужны эти результаты. Это тот выбор, который мне нужен в функции {SELECT DISTINCT L. * FROM SOCCER_PREMATCH_LISTS L, SOCCER_PREMATCH_MATCHES M WHERE M.LIST LIKE '%' || (L.SUB_LIST) || '%' AND (TO_TIMESTAMP ((M.M_DATE || '' || M.M_TIME), 'DD.MM.YYYY HH24: MI')> (ВЫБРАТЬ СИСТЕМНЫЙ МЕТКА В ЧАСОВОЙ ЗОНЕ 'CET' ИЗ ДВОЙНОЙ)) ORDER BY L .Я БЫ; }
@civesuas_sine Если ваша проблема решена с помощью любого из приведенных ниже решений, пожалуйста, примите его и закройте вопрос для будущих читателей вашего сообщения. Вы тоже получите репутацию. Прочтите это, чтобы узнать, как работает SO stackoverflow.com/help/someone-answers


Вы можете использовать неявный результат, используя DBMS_SQL.RETURN_RESULT (Oracle12c и выше) в процедуре, использующей курсор для вашего запроса.
CREATE OR REPLACE PROCEDURE getSoccerLists
AS
x SYS_REFCURSOR;
BEGIN
OPEN x FOR SELECT DISTINCT L.* FROM LABALES L
JOIN MATCHES M ON ( 1=1 ) -- join condition
WHERE M.LIST LIKE '%ENG'
ORDER BY L.ID;
DBMS_SQL.RETURN_RESULT(x);
END;
/
затем просто вызовите процедуру
EXEC getSoccerLists;
Для более низких версий (Oracle 11g) вы можете использовать команду печати, чтобы отобразить указатель o / p, передающий указатель ref в качестве параметра out.
CREATE OR REPLACE PROCEDURE getSoccerLists (x OUT SYS_REFCURSOR)
AS
BEGIN
OPEN x FOR SELECT DISTINCT L.* FROM LABALES L
JOIN MATCHES M ON ( 1=1 ) -- join condition
WHERE M.LIST LIKE '%ENG'
ORDER BY L.ID;
END;
/
Затем, в SQL * Plus или запущенном как скрипт в SQL Developer и Toad, вы можете получить результаты, используя это.
VARIABLE r REFCURSOR;
EXEC getSoccerLists (:r);
PRINT r;
Другой вариант - использовать функцию ТАБЛИЦА, определив коллекцию типа записи результата в пакете.
Обратитесь к Создайте функцию Oracle, которая возвращает таблицу
DBMS_SQL.RETURN_RESULT будет работать только в Oracle 12c.
@Kaushik Nayak, когда мне нравится, что вы написали, я получаю ошибку, пожалуйста, 00302 компонент Return_result должен быть объявлен
@civesuas_sine: Вам стоит использовать 11g? Обратитесь к моему обновленному ответу.
Я предполагаю, что этот вопрос является повторением вашего ранее заданного вопроса, где вы хотели вывести все столбцы таблиц, но в отдельный столбец. Я уже ответил, заявив, что вы не можете этого сделать, если вы вызываете свою функцию с помощью оператора SELECT. Если вы вызываете свою функцию в блоке Anoymous, вы можете отображать ее в отдельных столбцах.
Здесь Функция Oracle, возвращающая все столбцы из таблиц
Кроме того, вы можете получить результаты через запятую (,) или вертикальную черту (|), как показано ниже:
CREATE OR REPLACE
FUNCTION getSoccerLists
RETURN VARCHAR2
IS
list VARCHAR2(2000);
BEGIN
SELECT col1
||','
||col2
||','
||col2
INTO LIST
FROM SOCCER_PREMATCH_LISTS L ,
SOCCER_PREMATCH_MATCHES M
WHERE M.LIST LIKE '%' || (L.SUB_LIST) || '%'
AND (TO_TIMESTAMP((M.M_DATE || ' ' || M.M_TIME), 'DD.MM.YYYY HH24:MI') >
(SELECT SYSTIMESTAMP AT TIME ZONE 'CET' FROM DUAL
))
ORDER BY L.ID");
Return list;
End;
Обратите внимание, что если размер столбца увеличился на 2000 символов, вы снова потеряете данные.
Редактировать:
Из ваших комментариев
I want it to return a table set of results.
Затем вам нужно создать таблицу varchar, а затем вернуть ее из функции. См. ниже:
CREATE TYPE var IS TABLE OF VARCHAR2(2000);
/
CREATE OR REPLACE
FUNCTION getSoccerLists
RETURN var
IS
--Initialization
list VAR :=var();
BEGIN
SELECT NSO ||',' ||NAME BULK COLLECT INTO LIST FROM TEST;
RETURN list;
END;
Исполнение:
select * from table(getSoccerLists);
Примечание. Здесь в функции я использовал таблицу под названием test и ее столбец. Вы заменяете свою таблицу ее столбцом.
Изменить 2:
--Create a object with columns same as your select statement
CREATE TYPE v_var IS OBJECT
(
col1 NUMBER,
col2 VARCHAR2(10)
)
/
--Create a table of your object
CREATE OR REPLACE TYPE var IS TABLE OF v_var;
/
CREATE OR REPLACE FUNCTION getSoccerLists
RETURN var
IS
--Initialization
list VAR :=var();
BEGIN
--You above object should have same columns with same data type as you are selecting here
SELECT v_var( NSO ,NAME) BULK COLLECT INTO LIST FROM TEST;
RETURN list;
END;
Исполнение:
select * from table(getSoccerLists);
@civesuas_sine. Вам нужно разместить свои фактические столбцы. Я не даю вам готовый код. Это просто демонстрация, которая поможет решить вашу проблему. Просто замените все столбцы вашей таблицы, разделив ее через , или |.
точная выборка возвращает больше, чем запрошенное количество строк
@civesuas_sine означает, что ваш запрос возвращает несколько строк в предложении фильтра. Если это так, то вам снова нужно убедиться, что ваш запрос возвращает одну строку, или вам нужно вернуть таблицу вашего набора результатов, используя либо sys_refcursor, либо декальцируя object.
ORA-00955: имя уже используется существующим объектом, когда я пытаюсь запустить оператор
@civesuas_sine Не уверен, что и как вы выполняете. Я показал вам рабочую демонстрацию. Также, как упоминалось ранее, вы не можете делать то, что показано на картинке. На максимальном уровне вы можете разделить результаты с помощью , или | и отобразить результат в одном столбце, поскольку вы возвращаете таблицу varchar. Или вам нужно создать объект вашего типа таблицы, а затем использовать его. См. Edit2
Это не ответ о том, как создать для этого функцию, так как я бы рекомендовал вместо этого сделать это представлением:
CREATE OR REPLACE VIEW view_soccer_list AS
SELECT *
FROM soccer_prematch_lists l
WHERE EXISTS
(
SELECT *
FROM soccer_prematch_matches m
WHERE m.list LIKE '%' || (l.sub_list) || '%'
AND TO_TIMESTAMP((m.m_date || ' ' || m.m_time), 'DD.MM.YYYY HH24:MI') >
(SELECT SYSTIMESTAMP AT TIME ZONE 'CET' FROM DUAL)
);
Затем вызовите его в запросе:
SELECT * FROM view_soccer_list ORDER BY id;
(Нет смысла помещать предложение ORDER BY в представление, потому что вы обращаетесь к представлению как к таблице, а данные таблицы считаются неупорядоченными, поэтому вы не можете полагаться на этот порядок. То же самое верно для конвейерной функции, к которой вы получаете доступ с FROM TABLE (getSoccerLists). Вместо этого всегда добавляйте предложение ORDER BY в свои окончательные запросы.)
@ThorstenKettner Не нужно просматривать, можете ли вы просто создать функцию с помощью этого выбора?
Ну, я просто подумал, что нет смысла заставлять функцию делать то же самое. Единственное отличие вида в том, что он медленнее. Если вы все равно хотите написать функцию, вы можете найти конвейерные функции: oracle-base.com/articles/misc/pipelined-table-functions
Нет условий присоединения? Этот запрос не имеет особого смысла ...