Oracle - Union 语句替代方案

问题描述 投票:0回答:1

我是 Oracle 新手,我有一个带有 into v_sql 的 select 语句。

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),是否可以在同一语句上向 v_sql 添加另一个 CLOB 列?喜欢 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; 
sql oracle plsql union
1个回答
0
投票

您的代码:

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')。 该选择将固定字符串(在单引号内)与 tablename1 中 view_source 列的值连接起来。 “view_source”很可能是名为“tablename1”的表中的列名称。它可能是 PL/SQL 中的某个变量或参数,但从表 tablename1 中选择它是没有意义的。 由于动态 sql(固定部分)以 '... from ( ' 结尾,显然它后面应该跟另一个 sql 语句作为子查询。该子查询 sql 存储在 tabale tablename1 的 view_source 列中。 让我们假设该值是 - for 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

现在您有一个包含动态生成的 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     */
© www.soinside.com 2019 - 2024. All rights reserved.