Я новичок в 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;
Нет, я не понял. я хотел объединить данные разных столбцов в одном операторе.
Ваш код:
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 */
Представленный код является частью блока PL/SQL, создающего динамическую команду sql для sys refcursor. Подробнее об этом можно прочитать в документации. Вот один из источников с примерами: docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg09dyn.htm