Функция Oracle с выбором всего из таблиц

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 06.04.2018 12:16

Какую ошибку выдает ??

Nishant Gupta 06.04.2018 12:20

@jarlh Когда я запускаю select, я получаю результаты, так что select хорош. Но я хочу, чтобы он работал ...

civesuas_sine 06.04.2018 12:30

Оператор sql @NishantGupta игнорируется, конец строки указанного идентификатора, отсутствует двойная кавычка

civesuas_sine 06.04.2018 12:31

извините, но следующая ссылка не от SO, но определенно поможет вам решить вашу проблему - sqljana.wordpress.com/2017/01/22/…

Kedar Limaye 06.04.2018 12:37

Зачем вам вообще нужна функция? Если вы просто хотите сохранить запрос для повторного использования, сделайте его представлением. И как уже упоминалось: запрос не имеет смысла. Вы дублируете записи LABALES на количество совпадений "% ENG", а затем снова отклоняете все дубликаты с помощью DISTINCT. Вероятно, вы получите тот же результат с простым select * from labales.

Thorsten Kettner 06.04.2018 14:11

Мне сказали сделать функцию или процедуру вместо запроса, вероятно, не запускать 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 06.04.2018 14:17

@civesuas_sine Если ваша проблема решена с помощью любого из приведенных ниже решений, пожалуйста, примите его и закройте вопрос для будущих читателей вашего сообщения. Вы тоже получите репутацию. Прочтите это, чтобы узнать, как работает SO stackoverflow.com/help/someone-answers

XING 11.04.2018 10:45
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
8
730
3

Ответы 3

Вы можете использовать неявный результат, используя 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.
XING 06.04.2018 12:33

@Kaushik Nayak, когда мне нравится, что вы написали, я получаю ошибку, пожалуйста, 00302 компонент Return_result должен быть объявлен

civesuas_sine 06.04.2018 12:36

@civesuas_sine: Вам стоит использовать 11g? Обратитесь к моему обновленному ответу.

Kaushik Nayak 06.04.2018 12:40

Я предполагаю, что этот вопрос является повторением вашего ранее заданного вопроса, где вы хотели вывести все столбцы таблиц, но в отдельный столбец. Я уже ответил, заявив, что вы не можете этого сделать, если вы вызываете свою функцию с помощью оператора 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. Вам нужно разместить свои фактические столбцы. Я не даю вам готовый код. Это просто демонстрация, которая поможет решить вашу проблему. Просто замените все столбцы вашей таблицы, разделив ее через , или |.

XING 06.04.2018 12:54

точная выборка возвращает больше, чем запрошенное количество строк

civesuas_sine 06.04.2018 12:56

@civesuas_sine означает, что ваш запрос возвращает несколько строк в предложении фильтра. Если это так, то вам снова нужно убедиться, что ваш запрос возвращает одну строку, или вам нужно вернуть таблицу вашего набора результатов, используя либо sys_refcursor, либо декальцируя object.

XING 06.04.2018 12:59

ORA-00955: имя уже используется существующим объектом, когда я пытаюсь запустить оператор

civesuas_sine 06.04.2018 13:41

@civesuas_sine Не уверен, что и как вы выполняете. Я показал вам рабочую демонстрацию. Также, как упоминалось ранее, вы не можете делать то, что показано на картинке. На максимальном уровне вы можете разделить результаты с помощью , или | и отобразить результат в одном столбце, поскольку вы возвращаете таблицу varchar. Или вам нужно создать объект вашего типа таблицы, а затем использовать его. См. Edit2

XING 06.04.2018 13:57

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

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 Не нужно просматривать, можете ли вы просто создать функцию с помощью этого выбора?

civesuas_sine 06.04.2018 16:19

Ну, я просто подумал, что нет смысла заставлять функцию делать то же самое. Единственное отличие вида в том, что он медленнее. Если вы все равно хотите написать функцию, вы можете найти конвейерные функции: oracle-base.com/articles/misc/pipelined-table-functions

Thorsten Kettner 06.04.2018 17:01

Другие вопросы по теме