你好,我需要一些帮助, 我有表在列“查询”中定义查询语句。我想运行它并作为输出得到结果。例如:
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语句的结果......
答案 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变量传递给过程来选择运行哪个,那么它们都必须采用单个绑定变量,并且必须能够将结果放入结果变量的类型和大小相同。您还限制只返回一行的查询。当然,您可以对此进行调整和扩展,但希望这可以帮助您入门。