我有一个表,其中包含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,则需要获取部门记录。
是否可以在SQL查询中做到这一点?
答案 0 :(得分: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的观点,即这种设计通常不是一个好主意,只有在评估了其他设计之后,才应该创建这样的代码。
答案 1 :(得分:0)
Vsau,我同意JNevill的观点,因为您需要PL / SQL才能从表列中执行“ SQL”。我还要补充一点,这类设计通常不是一个好主意。您希望您的应用程序SQL是使用绑定变量的静态sql,否则您的系统将遭受过高的硬解析百分比以及在字典对象上引起的争用,并且您可能会遇到共享池碎片问题。
答案 2 :(得分:0)
您可以使用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;