Oracle — альтернатива оператору Union

Я новичок в Oracle, и у меня есть оператор выбора с помощью v_sql.

SELECT    'select distinct mi.*, v.pa_id, v.agent from ( '
             || view_source
        INTO v_sql
        FROM tablename1 WHERE pk_pid = p_Process;

в приведенном выше утверждении я действительно не понимаю, что содержит v_sql? а view_source — это данные столбца (содержат CLOB), и можно ли добавить еще один столбец CLOB в v_sql в том же операторе? например view_source_Process?

SELECT    'select distinct mi.*, v.pa_id, v.agent from ( '
                 || view_source union view_source_process
            INTO v_sql
            FROM tablename1 WHERE pk_pid = p_Process;

и приведенный ниже код является непрерывной частью v_sql:

v_sql :=
               v_sql
            || ') mi join ta_people_suppliers ps on (ps.id = '''
            || p_requestor
            || ''' and ps.supplierid = mi.supplierid )
                            join ta_people_states s on (s.id = ps.id and s.perspective = ''MAKE'')
                            join vw_items_people v on (v.pk_itemid = mi.pk_itemid)
                            where mi.state = s.state';

         OPEN p_Items FOR v_sql; 

Представленный код является частью блока PL/SQL, создающего динамическую команду sql для sys refcursor. Подробнее об этом можно прочитать в документации. Вот один из источников с примерами: docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg09dyn.htm

d r 06.05.2024 18:13

Нет, я не понял. я хотел объединить данные разных столбцов в одном операторе.

Chandu 07.05.2024 06:59
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код:

SELECT    'select distinct mi.*, v.pa_id, v.agent from ( '
          || view_source
INTO v_sql
FROM tablename1 WHERE pk_pid = p_Process;

Эта команда PL/SQL помещает значение в переменную, объявленную как v_sql.
Кто-то создает динамический оператор sql, сохраняя его в переменной v_sql. Команда выбирает FROM tablename1. Персонажи || используются для объединения строк ('abc' || 'def' приводит к результату 'abcdef'). Выбор объединяет фиксированную строку (в одинарных кавычках) со значением столбца view_source в tablename1. «view_source», скорее всего, является именем столбца в таблице с именем «tablename1». Это может быть какая-то переменная или параметр в PL/SQL, но тогда было бы бессмысленно выбирать ее из таблицы tablename1. Поскольку динамический sql (фиксированная часть) заканчивается на '... from ( ', очевидно, что за ним должен следовать другой оператор sql в качестве подзапроса. Этот подзапрос sql хранится в столбце view_source в таблице tablename1. Предположим, что это значение - для pk_pid = p_Process (p_Process, вероятно, является параметром или переменной)

'Select pk_itemid, supplierid, state, some_other_column From tablename2'

Тогда результатом вашей команды будет то, что значение переменной v_sql теперь будет следующей строкой:

select distinct mi.*, v.pa_id, v.agent from ( Select pk_itemid, supplierid, state, some_other_column From tablename2

Эта команда sql неполная, и ее следует завершить следующей командой в вашем коде:

v_sql :=
               v_sql
            || ') mi join ta_people_suppliers ps on (ps.id = '''
            || p_requestor
            || ''' and ps.supplierid = mi.supplierid )
                            join ta_people_states s on (s.id = ps.id and s.perspective = ''MAKE'')
                            join vw_items_people v on (v.pk_itemid = mi.pk_itemid)
                            where mi.state = s.state';

         OPEN p_Items FOR v_sql; 

Команда добавляет текст к существующему значению переменной v_sql. Опять же, p_requestor — это, скорее всего, другой параметр (или переменная). Допустим, его значение равно «1001». При этом предположении в результате объединения команд получается значение v_sql, как показано ниже:

select distinct mi.*, v.pa_id, v.agent from ( Select pk_itemid, supplierid, state, some_other_column From tablename2) mi join ta_people_suppliers ps on (ps.id = '1001' and ps.supplierid = mi.supplierid )
                            join ta_people_states s on (s.id = ps.id and s.perspective = ''MAKE'')
                            join vw_items_people v on (v.pk_itemid = mi.pk_itemid)
                            where mi.state = s.state

Отформатированный для удобства чтения, это будет:

select  distinct mi.*, 
        v.pa_id, 
        v.agent 
from    ( Select pk_itemid, supplierid, state, some_other_column 
          From tablename2
        ) mi 
join    ta_people_suppliers ps on (ps.id = '1001' and ps.supplierid = mi.supplierid )
join    ta_people_states s on (s.id = ps.id and s.perspective = ''MAKE'')
join    vw_items_people v on (v.pk_itemid = mi.pk_itemid)
where   mi.state = s.state

Теперь у вас есть переменная, содержащая динамически генерируемый оператор sql, который можно использовать в дальнейшем в вашем коде PL/SQL.

Что касается части вопроса UNION, вы не можете объединить столбец со столбцом, но вы можете объединить один оператор выбора с другим, например:

Select 1 as A_NUMBER, 'A' as A_LETTER From Dual UNION ALL
Select 2 as A_NUMBER, 'B' as A_LETTER From Dual
/*  R e s u l t :
A_NUMBER  A_LETTER
--------  --------
       1  A
       2  B         */

Вы можете ОБЪЕДИНИТЬ значения двух столбцов, используя || как в вашем коде PL/SQL или что-то вроде этого:

WITH 
    tbl AS (Select 'John' as NAME, 'Doe' as SURNAME From Dual)
SELECT NAME || ' ' || SURNAME as NAME_SURNAME From tbl;
/*
NAME_SURNAME
------------
John Doe     */

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