执行列中定义的查询为String

时间:2015-11-17 15:56:21

标签: oracle plsql

你好,我需要一些帮助, 我有表在列“查询”中定义查询语句。我想运行它并作为输出得到结果。例如:

Create table table1
(
ID Number,
Query Varchar2(400)
)
insert into table1(id,query) values (1,'select name from table2 where table2.id=table1.id and table2.type = variable');

create table table2
(ID number,
Name varchar2(400),
Type Varchar2(400)
)
insert into table2 values (1,'Mathew','M');
insert into table2 values (1,'Thomas','G');
insert into table2 values (2,'Jerry','P');

现在查询:

'select name from table2 where table2.id=table1.id and table2.type = variable' 

应仅返回“Mathew”(假设变量为'M' - 过程变量输入)

作为程序输入我想要变量,我将在查询语句中以某种方式替换。

你能给我一些如何处理的技巧吗?

------------编辑

我确实是这样的:

create or replace procedure queryrun 
(var1 varchar2) as 
str     VARCHAR2(200);
BEGIN
execute immediate 'select replace(query,''variable'','''||var1||''') from table1' into str;  
dbms_output.put_line('Value is '||str);
END;

但结果它显示查询...没有select语句的结果......

2 个答案:

答案 0 :(得分:0)

您可以拥有绑定变量并使用plsql execute immediate。

实施例: http://www.dba-oracle.com/t_oracle_execute_immediate.htm

答案 1 :(得分:0)

您只是选择查询而不是运行查询;并且您将字符串"'variable'" - 包括单引号 - 替换为您的值,但您的原始查询字符串并没有单引号 - 所以没有匹配。

无论如何,你不应该真正替换硬编码的值。更改存储的查询以包含绑定变量占位符:

insert into table1(id,query)
values (1,'select name from table2 where table2.id=table1.id and table2.type = :variable');

尽管该查询无论如何都是无效的 - 您没有在from子句或join子句中定义table1。如果您有一个有效的查询,您可以独立运行,使用它,但使用绑定变量(由前导冒号表示)。

但是,假设您的表中有一个有效的查询字符串,它只会返回一行,例如:

insert into table1(id,query)
values (1,'select name from table2 where type = :variable');

然后,您的过程需要一个局部变量来保存该查询字符串。使用静态SQL选择查询,然后通过执行立即使用动态SQL从该字符串运行查询,并使用using子句提供绑定值。结果进入另一个局部变量,你已经在做了。

所以简单的版本可能如下所示:

create or replace procedure queryrun (p_var1 varchar2) as
  l_query table1.query%type;
  l_name table2.name%type;
begin
  select query into l_query from table1 where id = 1;
  execute immediate query into l_name using p_var1;  
  dbms_output.put_line('Value is ' || l_name);
end;

这显然是相当做作的。如果你的表中有多个查询,并且可能将第二个ID变量传递给过程来选择运行哪个,那么它们都必须采用单个绑定变量,并且必须能够将结果放入结果变量的类型和大小相同。您还限制只返回一行的查询。当然,您可以对此进行调整和扩展,但希望这可以帮助您入门。