在另一个查询中执行 SQL 查询作为结果

Posted

技术标签:

【中文标题】在另一个查询中执行 SQL 查询作为结果【英文标题】:Execute SQL query in another Query as result 【发布时间】:2019-06-27 16:26:51 【问题描述】:

我有一个表,其中包含 SQL 查询作为列之一。根据记录ID,我想执行记录中的SQL查询。

Master_Table
------------------------------
|Rec_ID | Query              |
------------------------------
|1      | SELECT * from EMP  |
------------------------------
|2      | SELECT * FROM DEPT |
------------------------------
SELECT Query FROM Master_Table WHERE Rec_ID=1

我期望如果我选择 Rec_Id =1,我必须 EMP 记录。 如果我选择 Rec_Id=2,我需要获取 Dept 记录。

在SQL查询中可以做到吗?

【问题讨论】:

你不能用直接的 SQL 来做到这一点。您可以在一个过程中执行此操作,方法是先从该表中选择,然后使用 EXECUTE IMMEDIATE see here about Dynamic SQL in a Stored Procedure 动态执行从第一个查询中提取的 sql 【参考方案1】:

有几种方法可以在 SQL 中运行动态 SQL。在 18c 中,我们可以使用多态表函数。如果可以将结果作为 XML 获取,我们可以使用DBMS_XMLGEN.getXML。如果我们能够创建自定义 PL/SQL 对象,我们可以使用 Oracle 数据盒来构建Method4 解决方案。

例如,安装Method4后,我们可以这样运行SQL:

select * from table(method4.dynamic_query(
    '
        select query
        from master_table
        where rec_id = 1
    '
));

以上代码将适用于以下示例架构:

create table master_table as
select 1 rec_id, 'SELECT * from EMP'  query from dual union all
select 2 rec_id, 'SELECT * FROM DEPT' query from dual;

create table emp(emp_name varchar2(100));
create table dept(dept_name varchar2(100));

前面的信息从字面上回答了您的问题。但我同意 Mark D Powell 的观点,即这种设计通常不是一个好主意,我们应该只在评估替代设计之后才能创建这样的代码。

【讨论】:

【参考方案2】:

Vsau,我同意 JNevill 的观点,因为您需要 PL/SQL 来执行表格列中的“SQL”。我还要补充一点,这种设计通常是个坏主意。您希望您的应用程序 SQL 是使用绑定变量的静态 sql,否则您的系统将遭受过高百分比的硬解析和字典对象的争用,并且您可能会遇到共享池碎片问题。

【讨论】:

感谢 JNevil 和 Mark。我第一次使用这个概念,由于项目要求。我将创建一个存储过程,否则将不得不寻找另一种方法。【参考方案3】:

你可以使用sys_refcursor

SQL> create or replace function get_emp_tab return sys_refcursor is
  v_rc  sys_refcursor;
  v_sql varchar2(4000);
begin
  select query into v_sql from Master_Table where Rec_ID = 1
  open v_rc for v_sql;
  return v_rc;
end;
/
SQL> declare
       v_rc sys_refcursor;
begin
   :v_rc := get_emp_tab;
end;
/
SQL> print v_rc;

【讨论】:

以上是关于在另一个查询中执行 SQL 查询作为结果的主要内容,如果未能解决你的问题,请参考以下文章

在另一个 where 语句(子查询?)中使用一个 sql 查询的结果

Informix SQL / 在另一个查询中重用存储过程的结果

SQL之子查询

SQL Server中的SUM,在JOIN的一侧有多行,另一侧在另一侧作为比较

sql中引用一个表的查询结果作为条件来查询另一个表如何实现?

java Spring MCV sql查询结果重复